php睡眠功能奇怪的行为

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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: Start\n",FILE_APPEND);
session_start();

$expires = time()+60;
file_put_contents($file,"\n$scriptId: Expires at $expires\n",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
可变的时间量总是小于13);
>有时脚本停止(在“Will sleep”之后不再记录,我们可以验证没有db内容正在完成). [编辑2中的更新]

我们已经研究了可能的原因但找不到任何原因:

> PHP max_execution_time设置为240秒,脚本永远不会
需要超过一分钟;
>睡眠文档说它是每个会话但卷曲不使用cookie所以它应该是每个实例中的不同会话(并且如果它使用相同它总是会阻止,因为我们总是执行三个脚本实例,它不会);
>托管技团队表示服务器中既没有错误也没有
错误日志也不会在PHP错误日志中记录这些问题的时间戳
发生.

我不能随意重现这些问题,但它们每天至少发生一次.
我想知道是什么可以干扰睡眠行为?我该如何检测或修复它?

附加信息:

> linux系统
> MysqL 5.5
>阿帕奇
> PHP 5.3
> PHP max_execution_time设置为240

编辑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来处理延迟的工作.
Check PHP Manual – PCNTL Alarm

脚本宝典总结

以上是脚本宝典为你收集整理的php睡眠功能奇怪的行为全部内容,希望文章能够帮你解决php睡眠功能奇怪的行为所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。