小编dan*_*317的帖子

如何声明函数已终止以便 PhpStorm 检测到?

背景

我使用几个辅助函数来停止程序流并返回数据。例如,虽然大多数页面都是 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”,但这些似乎没有被识别。我还在这里查看了一些文档,但没有发现任何有用的内容。

phpdoc phpstorm

3
推荐指数
1
解决办法
275
查看次数

有可能告诉php解释器忽略代码块吗?

背景

回到我进行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)完全忽略这些假设语句?还是有另一种方法来处理这个问题?

php interpreter opcache

1
推荐指数
1
解决办法
111
查看次数

如何优化聊天室查询?

背景

我正在为自定义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 sql-server database-design

1
推荐指数
1
解决办法
495
查看次数

如何在 SQL Server 备份磁盘路径中使用变量?

下面的 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 DISKDBCC SHRINKFILE参数都会抛出错误。

如何在这些位置使用变量?还想将一些日期时间参数附加到文件路径,但尚未开始研究。

sql-server sql-server-2008

1
推荐指数
1
解决办法
1052
查看次数