mar*_*are 5 php wait thread-sleep
有没有办法让PHP等到函数返回后再继续?
这是我的代码:
<?php
set_time_limit(0);
function waitforchange($nof) {
$lfilemod=filemtime($nof);
while(filemtime($nof) == $lfilemod) {
clearstatcache();
usleep(10000);
}
}
waitforchange('./blahblah.txt')
sleep(5);
echo 'done';
?>
Run Code Online (Sandbox Code Playgroud)
它应该等到blahblah.txt更改,然后等待另外五秒,然后打印出"完成",然而,无论文件是否实际更改,它都会在五秒后打印出"完成".
Age*_*rum 10
PHP是单线程的,这意味着它在继续之前一次执行一条指令.换句话说,PHP在继续下一个语句之前自然会等待函数完成执行.
我尝试在我的机器上执行你的代码,它正常等待并等到我在完成函数和显示消息之前修改了文件.
我甚至看不到你的代码中可能出现故障的任何内容.由于创建的$lfilemod执行方式与while循环中的检查相同,TRUE即使文件出现问题,该循环的条件也将返回并执行(filemtime将返回FALSE两个错误,因此条件将读取(FALSE == FALSE,这是显然TRUE).
在运行该循环之前,您的PHP脚本是否完全修改了该文件?如果是,则返回的初始值filemtime可能是脚本最初启动时的修改时间.当您clearstatcache在循环中运行时,您将获取由脚本中较早的更改引起的新修改时间.
我的建议:
clearstatcache在设置值之前尝试运行,$lfilemod以便您知道值是干净的,并且您正在比较苹果与苹果在循环中检查的内容.
确保文件确实没有被修改.尝试在代码的开头和结尾放置一些调试行,打印出文件的最后修改时间,然后自己比较两者,看看PHP是否报告修改时间有变化.
这应该是不言而喻的,但是您应该确保PHP配置为在开发期间显示所有错误,以便立即显示出错的时间和方式.确保在文件中display_errors设置了该设置(或者如果您无法修改文件本身,则使用该设置),并且您的设置为PHP <= 5.3,或者设置为PHP 5.4(属于该版本的一部分).更好的方法是将错误报告设置为有效打开所有错误报告,而不管PHP版本如何.Onphp.iniini_set()error_reporting()E_ALL | E_STRICTE_ALLE_STRICTE_ALL-1
尝试使用这些修改再次运行代码.如果您发现该文件确实被修改,那么您就知道您的代码是有效的.如果文件未被修改,您至少应该有一个可以查找的错误,或者在这里询问我们.
| 归档时间: |
|
| 查看次数: |
39937 次 |
| 最近记录: |