Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从php/laravel异步调用shell脚本?_Php_Shell - Fatal编程技术网

如何从php/laravel异步调用shell脚本?

如何从php/laravel异步调用shell脚本?,php,shell,Php,Shell,我正在使用wkhtmltopdf的shell脚本模式创建一份大约100页的pdf报告。现在,问题是脚本需要花费大量的时间来创建报告并将其保存在指定的路径中 目前,我这样调用脚本: $stmt = $sh_script.' > /dev/null 2>/dev/null &'; shell_exec($stmt); 这样做会导致shell在后台运行,并生成报告,但过了一段时间,我会在浏览器端看到 504 Gateway Time-out nginx/1.4.6 (Ubuntu

我正在使用wkhtmltopdf的shell脚本模式创建一份大约100页的pdf报告。现在,问题是脚本需要花费大量的时间来创建报告并将其保存在指定的路径中

目前,我这样调用脚本:

$stmt = $sh_script.' > /dev/null 2>/dev/null &';
shell_exec($stmt);
这样做会导致shell在后台运行,并生成报告,但过了一段时间,我会在浏览器端看到

504 Gateway Time-out
nginx/1.4.6 (Ubuntu)

这不是一条非常舒服的消息,我想以异步方式调用shell_exec语句,以便调用它并继续php代码。有人能帮我吗?

你就快到了。。但是您需要
nohup
(无挂断),并且您在结尾的陈述应该更像
/dev/null 2>&1&

也就是说。。我认为这应该是可行的:


exec('nohup'.$sh_script.>/dev/null 2>&1&')
你就要成功了。。但是您需要
nohup
(无挂断),并且您在结尾的陈述应该更像
/dev/null 2>&1&

也就是说。。我认为这应该是可行的:


exec('nohup'.$sh_script.>/dev/null 2>&1&')

因此,在我为您的问题提供建议解决方案之前,我想快速补充一点,我可能会找到一个可以实现您期望的功能的方法,而不是从PHP执行shell命令,这可能是一个坏主意,原因很多,但是,如果您打算走这条路,请查看下面的答案,在通过PHP执行shell命令时获得一些关于安全性的建议:

现在,回到您的答案,任何时候您在PHP中执行需要额外时间的大任务时,让用户在浏览器前等待都不是一个好主意。这就是构建队列对应用程序至关重要的地方。在您通过用户界面向用户解释工作正在后台完成,并在完成时通知他们之后,您就开始执行某些任务,等等

,但也有一些优秀的工具,例如,或,对于在后台执行任务非常有帮助。这些服务将您的任务推送到队列中,队列中的这些项目会得到及时处理,但用户不必等到响应完成,因此不再有504次超时

或者您可以尝试一种更脏的解决方案,只需在php和服务器上增加脚本超时值,但这可能会产生一些意想不到的结果


祝你好运

因此,在我为您的问题提供建议解决方案之前,我想快速补充一点,那就是我可能会找到一个可以实现您想要做的事情的方法,而不是从PHP执行shell命令,这可能是一个坏主意,因为有很多原因,但是如果您打算这样做,在通过PHP执行shell命令时,请查看此答案,以获取有关安全性的一些建议:

现在,回到您的答案,任何时候您在PHP中执行需要额外时间的大任务时,让用户在浏览器前等待都不是一个好主意。这就是构建队列对应用程序至关重要的地方。在您通过用户界面向用户解释工作正在后台完成,并在完成时通知他们之后,您就开始执行某些任务,等等

,但也有一些优秀的工具,例如,或,对于在后台执行任务非常有帮助。这些服务将您的任务推送到队列中,队列中的这些项目会得到及时处理,但用户不必等到响应完成,因此不再有504次超时

或者您可以尝试一种更脏的解决方案,只需在php和服务器上增加脚本超时值,但这可能会产生一些意想不到的结果


祝你好运

你可以按这里描述的那样做,你可以按这里描述的那样做,但没有成功。行为仍然相同,脚本可以工作,但浏览器显示504网关超时。它没有工作。行为仍然相同,脚本工作,但浏览器显示504网关超时。Nice insight George,如果我们(公司)面临更多此类性能瓶颈,我将调查RabbitMQ并设置RabbitMQ服务器。Nice insight George,如果我们(公司)面临更多此类性能瓶颈,我将调查RabbitMQ并设置RabbitMQ服务器面临更多这样的性能瓶颈。