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

时间:2016-06-16 19:30:17

标签: 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)

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

2 个答案:

答案 0 :(得分:2)

所以在我为你的问题提供推荐的解决方案之前,我想快速添加,我可能会发现php library可以实现你想做的事情,而不是从PHP执行shell命令,由于很多原因,这可能是一个坏主意,但如果您打算走这条路线,请在通过PHP执行shell命令时查看此答案以获取有关安全性的一些建议:

https://stackoverflow.com/a/4535900/4660602

现在,为了回到你的答案,无论何时你在PHP中执行一项需要额外时间的大任务,让用户在浏览器上等待绝不是一个好主意。这就是构建队列对您的应用程序至关重要的地方。在您通过用户界面向用户说明工作在后台完成后,您将开始处理某项任务,并在完成后通知他们等等。

There are ways to create a queue WITHOUT using 3rd party software,但有一些优秀的工具,例如RabbitMQIronMQBeanstalkd,这些工具对于在后台执行任务非常有帮助。这些服务将您的任务推送到队列中,并且队列中的这些项目会得到及时处理,但用户在完成工作之前不必等待响应,因此不会超时504次。

或者你可以尝试一个更脏的解决方案,只需增加php和服务器上的脚本超时值,但这可能有一些意想不到的结果。 For nginx& for Apache

祝你好运!

答案 1 :(得分:0)

你关闭..但你想要nohup(不挂断),你最后的陈述应该更像/dev/null 2>&1 &

那说......我相信这应该有效:

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