在装有 Apache2 + php 的 Ubuntu 10.10 上,脚本
<?
system("sleep 10000");
?>
不会超时。max_execution_time 和 TimeOut 均不适用。
有什么方法可以确保脚本会被停止?
答案1
TimeOut
对 mod_php 没有影响。max_execution_time
只影响脚本本身的执行时间。除 Windows 外,使用system()
或的系统调用exec()
不计入执行时间。
答案2
Alvosu 的回答几乎正确 - 但有点简洁。
PHP 的 sleep() 是操作系统调度程序 API 下的简单包装器。当它被调用时,php 停止运行- 因此 PHP 无法检查时钟是否已用完,直到睡眠时间到期并且调度程序将其重新添加至运行队列,并且 CPU 开始处理下一条指令。
虽然这个例子是相当不自然的(为什么你会在知道超时的情况下编写这样的脚本),但在许多情况下,执行线程会超出 PHP 解释器的范围,因此它没有机会检查秒表 - 例如当脚本启动其他进程时,或者线程处于扩展中 - 例如等待数据库查询返回。可以通过要求系统以定义的时间间隔向 PHP 代码发送信号来避免该问题(报警)后你定义一个信号处理程序(pcntl_信号)。
答案3
使用 Apache 和 mod_php 时,您会遇到问题。其他方法(例如通过 fcgid 或 fastcgi 加载 php)可以让您更好地控制进程管理/执行时间/超时/空闲时间/等等。