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');
答案 0 :(得分:1)
你知道你可以在后台运行可执行文件吗,比如这个
exec($cmd . " > /dev/null &");
这样你就可以立刻摆脱它。