在Ubuntu 10.10上使用Apache2 + php,脚本
<? system("sleep 10000"); ?>
不超时。 max_execution_time和TimeOut都不适用。
有什么方法可以确保脚本会被终止?
TimeOut对mod_php没有影响。 max_execution_time只影响脚本本身的执行时间。 除了Windows以外,使用system()或exec()进行的系统调用不计入执行时间。 与Apache和mod_php你会有一个问题在这里。 其他方法,例如通过fcgid或fastcgi加载php,可以更好地控制进程pipe理/执行时间/超时/空闲时间等。
Alvosu的回答几乎是正确的 – 但有点简洁。
PHP的sleep()是OS调度器API下的简单包装。 当它被调用时, php停止运行 – 所以PHP不能检查时钟是否已经用完,直到睡眠时间到期,调度程序将其添加回运行队列,并且CPU转而处理下一条指令。
虽然这个例子是相当虚构的(为什么你会写这样一个脚本知道你会超时运行)有很多情况下执行线程传递到PHP解释器之外,因此它没有机会检查它的秒表 – 例如,当脚本启动其他进程,或线程在扩展中 – 例如等待数据库查询返回。 在定义一个信号处理程序( pcntl_signal ) 之后 ,要求系统在定义的时间间隔( pcntl_alarm )发送一个信号回到PHP代码,可以避免这个问题。