让PHP等到函数完成?

时间:2013-01-18 04:52:39

标签: 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';

?>

它应该等到blahblah.txt更改,然后再等待五秒钟,然后打印出“完成”,然而,无论文件是否实际更改,它都会在五秒后打印出“完成”。< / p>

3 个答案:

答案 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_STRICTE_ALL是该版本的E_STRICT的一部分)。更好的方法是将错误报告设置为E_ALL,无论PHP版本如何,都会有效地打开所有错误报告。

尝试使用这些修改再次运行代码。如果您发现该文件确实被修改,那么您就知道您的代码是有效的。如果文件未被修改,您至少应该有一个可以查找的错误,或者在这里询问我们。

答案 1 :(得分:0)

尝试将函数调用分配给变量。我认为它不会等待返回。

答案 2 :(得分:0)

代码看起来不错;在waitforchange行之后保存缺少的分号(;)。我测试了将(;)放在那里,脚本按预期运行。也许这就是罪魁祸首?我不知道如何解释你是如何使用那个错误执行代码的。