奇怪的PHP错误:exec()有时会挂在简单的脚本

时间:2016-07-14 06:52:52

标签: php pdf-generation wkhtmltopdf

Heyas,

因此,这个简单的exec()脚本在前两次运行正常,尝试从网页生成PDF文件(使用wkhtmltopdf)。  它首先删除现有文件,然后在其位置创建新的PDF文件。如果我第二次运行该脚本,它会再次删除该文件,然后按预期创建一个新文件。但是,如果我再次运行它,它会删除文件,创建一个新文件,但是脚本似乎一直挂起,直到给出30秒504超时错误。脚本运行时,只需要大约3秒钟就可以运行/返回。它还会杀死整个服务器(任何其他本地PHP站点都不再起作用)。如果我重新启动PHP服务器,一切仍然挂起(没有成功)。有趣的是,如果我运行一次脚本,然后重新启动PHP服务器,我可以继续这样做而不会出现问题(但最多只能生成两次PDF)。没有记录PHP错误。 为什么以后会拖延?

    $filePath = 'C:\\wtserver\\tmp\\order_' . $orderId . '.pdf';

    // delete an existing file
    if(file_exists($filePath)) {
        if(!unlink($filePath)) {
            echo 'Error deleting existing file: ' . $filePath;
            return;
        }
    }

    // generates PDF file at C:\wtserver\tmp\order_ID.pdf
    exec('wkhtmltopdf http://google.com ' . $filePath);

我尝试过一个简单的循环来检查脚本的完成情况(成功输出),然后尝试退出,但它仍然挂起:

    while(true) {
        if(file_exists($filePath)) {
            echo 'exit';
            exit(); // have also tried die()
            break;
        }
        //todo: add time check/don't hang
    }

如果我无法理解这一点,那么现在有没有办法杀死exec脚本,以某种方式包装它? PDF仍然生成,因此脚本正在运行,但我需要将其删除并向用户返回响应。

解决方案:

必须重定向标准输出和标准错误,以立即结束该过程,即。在Windows中:

exec('wkhtmltopdf http://google.com ' . $filePath . ' > NUL 2> NUL');

1 个答案:

答案 0 :(得分:1)

你知道你可以在后台运行可执行文件吗,比如这个

exec($cmd . " > /dev/null &");

这样你就可以立刻摆脱它。