php睡眠功能奇怪的行为
我们继承了一个平台,它有一个crobjob,每分钟用不同的参数卷曲一个本地php脚本三次(curl -s -o -url https://localhost/myscript.php?option = XYZ -k).该脚本运行大约1分钟,并且具有相同选项的可能的多个实例重叠一段时间.该脚本在每个选项中记录一个不同的文件,每个日志以脚本启动时的时间戳开始,因此它充当实例标识符.
该脚本有这个骨架: <?php $option=XYZ; $scriptId = time(); $file = "log_$option.txt"; file_put_contents($file,"n$scriptId: Startn",FILE_APPEND); session_start(); $expires = time()+60; file_put_contents($file,"n$scriptId: Expires at $expiresn",FILE_APPEND); while(time()<$expires){ file_put_contents($file,"n$scriptId: Not expired at ".time()."n",FILE_APPEND); switch($option){ case X: do_db_stuff(); break; ... } file_put_contents($file,"n$scriptId: Will sleep at ".time()."n",FILE_APPEND); sleep(13); file_put_contents($file,"n$scriptId: Woke up at ".time()."n",FILE_APPEND); } file_put_contents($file,"n$scriptId: Finished at ".time()."n",FILE_APPEND); 通常这个脚本运行正常(即使它们在实例A最后一次休眠并且实例B开始时重叠)但有时我们可以通过日志确认两个问题: >有时它睡眠时间不到13秒(a 我们已经研究了可能的原因但找不到任何原因: > php max_execution_time设置为240秒,脚本永远不会 我不能随意重现这些问题,但它们每天至少发生一次. 附加信息: > linux系统 编辑1:只是为了澄清:实际上我们有3个选项,因此它写入3个日志文件,每个选项一个.在任何给定时间,每个选项最多可以运行两个实例(相同选项的每个实例重叠一小段时间). Edit2:根据@Jan建议,我将日志添加到睡眠功能结果中.脚本已经停止了一次该日志: [2016-01-05,13:11:01] Will sleep at 2016-01-05,13:11:29 [2016-01-05,13:11:01] Woke up at 2016-01-05,13:11:37 with sleep return 5 [2016-01-05,13:11:01] Not expired at 2016-01-05,13:11:37 [2016-01-05,13:11:38 with sleep return 13 ... no more log from instance [2016-01-05,13:11:01] ... [2016-01-05,13:12:01] Start 根据睡眠文档:
因此,根据文档和日志,似乎由于中断导致睡眠被缩短. 我怎么知道是什么中断导致这个(pcntl_signal?),它来自哪里,有什么方法可以避免它? 编辑3:我添加了用pcntl_signal处理信号的代码(尝试从信号1到255注册)并记录它们,问题仍然发生但日志仍为空. 解决方法
您可以使用pcntl_signal定义信号处理程序.
使用这些处理程序,您可以在发生中断时进行记录.但AFAIK你无法察觉它来自哪里. 您也可以使用pcntl_alarm来处理延迟的工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |