我使用几个辅助函数来停止程序流并返回数据。例如,虽然大多数页面都是 HTML,但我偶尔会返回 JSON 并调用
/**
* @param array|bool $response
*
* @die
*/
function jsonResponseDie($response)
{
header('Content-Type: application/json');
echo json_encode($response);
die();
}
Run Code Online (Sandbox Code Playgroud)
但是,调用函数不会检测到是否存在 die 语句,并允许在其后出现代码而不发出警告。
function recievePush()
{
// Process a push request and respond with a json array.
jsonResponseDie(array('status' => TRUE));
echo 'This will never execute but PhpStorm doesn\'t know that';
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能让 PhpStorm 检测到这个函数会死掉?
我确实尝试了一些项目“@return die”或“@die”,但这些似乎没有被识别。我还在这里查看了一些文档,但没有发现任何有用的内容。
回到我进行C编程的那天,我们使用了假设语句来确保代码是健康的.就像是:
aFunction(int hello)
{
assume(hello < 10);
Run Code Online (Sandbox Code Playgroud)
关于assume语句的一个很酷的事情是它被定义为一个空的宏用于发布编译,而一个假的语句在调试编译时死掉.因此,开发人员拥有断言语句的所有好处,可以检查他们的假设,而不会导致不必要的错误或影响性能
现在我正在使用php我正在寻找类似的机制.我目前的假设声明看起来像这样:
define(DEBUG, getenv('debug'));
function assume($a)
{
if (DEBUG && !$a)
{
echo 'ASSUME FAILURE <br />';
echo '<pre>';
print_r(debug_backtrace());
die('<pre>');
}
}
assume($a == $b);
Run Code Online (Sandbox Code Playgroud)
如您所见,我在服务器设置中设置调试标志以删除实际的die语句等.但是仍然执行函数调用,仍然会评估if语句.如果它只发生几千次,这并不是什么大问题,但随着代码越来越大,并且这些假设被置于循环中,这可能会对性能产生合理影响.
有没有办法告诉解释器或opcache(我目前正在使用php 5.5中包含的zend opcache)完全忽略这些假设语句?还是有另一种方法来处理这个问题?
我正在为自定义Web应用程序构建一个简单的聊天客户端。我需要存储所有聊天记录。用户还可以向个人或组发送消息。想想谷歌聊天(我告诉我的客户改用它,但他坚持自定义)。我的数据库结构如下:
表:ChatRoom
int主键ChatRoomID
varchar(64)名称表ChatMessage
int主密钥ChatMessageID
INT 用户ID
INT ChatRoomID
VARCHAR(2000)消息
的日期时间的日期表ChatUser
int ChatRoomID
int UserID
int LastMessageID 主键(ChatRoomID,UserID)
我正在使用SQL Server,并将很快迁移到mysql,因此该解决方案需要在两个平台上都可以工作。
假设用户刚刚登录,我需要提取所有聊天室中有未完成消息的列表。我当前的查询如下所示:
SELECT DISTINCT
cr.ChatRoomID AS id,
cu.LastMessageID AS label
FROM ChatRooms cr
LEFT JOIN ChatUsers cu ON cu.ChatRoomID = cr.ChatRoomID
LEFT JOIN ChatMessages cm ON cm.ChatRoomID = cr.ChatRoomID
WHERE cu.UserID = :user_id
AND cu.LastMessageID < cm.ChatMessageID
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好。但是,我怀疑当他们有数十个用户,数千个房间和数百万条消息时,它们的效率将会降低。如何优化此查询(或数据库结构)以使该请求(给定用户的具有未解决消息的聊天室数量)成为可扩展的性能查询?
我主要担心的是,我不得不对此查询使用“ distinct”标志。因此,这可能是将一个临时表连接到数百万个表,然后筛选出2个数字。
用户
1 | A
2 博士| B博士 …
下面的 SQL 语句工作正常:
DECLARE @database VARCHAR(30) = 'DEMO';
BACKUP LOG @database
TO DISK = N'C:\zbackups\DEMO.trn'
WITH NOFORMAT, NOINIT,
NAME = N'MyDatabase Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE ('DEMO_log', 500);
Run Code Online (Sandbox Code Playgroud)
然而,这并没有:
DECLARE @database VARCHAR(30) = 'DEMO';
BACKUP LOG @database
TO DISK = 'C:\zbackups\' + @database + '.trn'
WITH NOFORMAT, NOINIT,
NAME = 'MyDatabase Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
DBCC SHRINKFILE (@database + '_log', 500);
Run Code Online (Sandbox Code Playgroud)
当我尝试连接时,指令TO DISK和DBCC SHRINKFILE参数都会抛出错误。
如何在这些位置使用变量?还想将一些日期时间参数附加到文件路径,但尚未开始研究。