有没有办法让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';
?>
它应该等到blahblah.txt
更改,然后再等待五秒钟,然后打印出“完成”,然而,无论文件是否实际更改,它都会在五秒后打印出“完成”。< / p>
答案 0 :(得分:8)
PHP是单线程的,这意味着它在继续之前一次执行一条指令。换句话说,PHP在继续下一个语句之前自然会等待函数完成执行。
我尝试在我的机器上执行你的代码,它正确地等待并等到我在完成功能并显示消息之前修改了文件。
我甚至无法在代码中看到任何可能失败的内容。由于$lfilemod
的创建方式与while
循环中的检查方式相同,因此即使文件出现问题,该循环的条件也会返回TRUE
并执行(filemtime
会在两个错误上都返回FALSE
,因此条件会显示(FALSE == FALSE
,显然是TRUE
。)
在运行该循环之前,您的PHP脚本是否完全修改了该文件?如果是,则filemtime
返回的初始值可能是脚本最初启动时的修改时间。当您在循环中运行clearstatcache
时,您将获取由脚本中较早的更改引起的新修改时间。
我的建议:
在设置clearstatcache
的值之前尝试运行$lfilemod
,以便您知道值是干净的,并且您将苹果与苹果的比较与正在检查的内容进行比较在循环中。
确保文件确实没有被修改。尝试在代码的开头和结尾放置一些调试行,打印出文件的最后修改时间,然后自己比较两者,看看PHP是否报告修改时间有变化。
这应该是不言而喻的,但是您应该确保PHP配置为在开发期间显示所有错误,以便立即显示出错的时间和方式。确保display_errors
文件中的On
设置已php.ini
(如果您无法修改文件本身,请使用ini_set()
),以及{对于PHP&lt; = 5.3,{1}}设置为error_reporting()
,对于PHP 5.4,{1}}设置为E_ALL | E_STRICT
(E_ALL
是该版本的E_STRICT
的一部分)。更好的方法是将错误报告设置为E_ALL
,无论PHP版本如何,都会有效地打开所有错误报告。
尝试使用这些修改再次运行代码。如果您发现该文件确实被修改,那么您就知道您的代码是有效的。如果文件未被修改,您至少应该有一个可以查找的错误,或者在这里询问我们。
答案 1 :(得分:0)
尝试将函数调用分配给变量。我认为它不会等待返回。
答案 2 :(得分:0)
代码看起来不错;在waitforchange行之后保存缺少的分号(;)。我测试了将(;)放在那里,脚本按预期运行。也许这就是罪魁祸首?我不知道如何解释你是如何使用那个错误执行代码的。