繁体   English   中英

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

[英]Weird PHP error: exec() hangs sometimes on simple script

嘿,

因此,此简单的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');

您知道您可以在后台运行可执行文件吗?

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

这样,您可以立即摆脱困境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM