9

有什么方法可以让 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更改,然后再等待五秒钟,然后打印出“完成”,但是,无论文件是否实际更改,它都会在五秒钟后打印出“完成”。

4

3 回答 3

18

PHP 是单线程的,这意味着它在继续之前一次执行一条指令。换句话说,PHP 在继续执行下一条语句之前自然会等待函数完成执行。

我尝试在我的机器上执行您的代码,它正确地等待并等待直到我修改了文件,然后才完成功能并显示消息。

我什至看不到您的代码中可能失败的任何内容。由于创建 of$lfilemod的方式与循环中的检查相同,因此即使文件存在问题,该while循环的条件也会返回并执行 (将在两个错误上都返回,因此条件将读取,即显然)。TRUEfilemtimeFALSE(FALSE == FALSETRUE

您的 PHP 脚本是否在运行该循环之前完全修改了文件?如果是,则返回的初始值filemtime可能是脚本最初启动时的修改时间。当您clearstatcache在循环中运行时,您将获得由脚本前面的更改引起的新修改时间。

我的建议:

  • clearstatcache在设置值之前尝试运行,$lfilemod以便您知道该值是干净的,并且您正在将苹果与苹果与循环中正在检查的内容进行比较。

  • 确保文件确实没有被修改。尝试在代码的开头和结尾放置几行调试行,打印出文件的最后修改时间,然后自己比较两者以查看 PHP 是否报告修改时间发生了变化。

  • 这是不言而喻的,但是您应该确保 PHP 被配置为在开发过程中显示所有错误,以便您立即了解何时以及如何出现问题。确保该display_errors设置已On在您的php.ini文件中打开(ini_set()如果您无法修改文件本身,则使用该设置),并且您error_reporting()的设置E_ALL | E_STRICT为 PHP <= 5.3 或E_ALLPHP 5.4(E_STRICTE_ALL该版本的一部分)。更好的方法是将错误报告设置为-1有效地打开所有错误报告,无论 PHP 版本如何。

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

于 2013-01-18T05:21:46.947 回答
1

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

于 2013-01-18T05:00:33.677 回答
0

代码看起来不错;在 waitforchange 行之后保存缺少的分号 (;)。我测试了将 (;) 放在那里并且脚本按预期运行。也许这就是罪魁祸首?不过,我无法解释你是如何让你的代码在出现错误的情况下执行的。

于 2013-01-18T05:00:48.933 回答