我需要在后台执行一个Laravel长时间运行的进程来使用Twitter Streaming API . 有效地我需要运行的php artisan CLI命令是
nohup php artisan startStreaming > /dev/null 2>&1 &
如果我在命令行中自己运行它,那就完美了 .
我的想法是,我可以点击网站上的一个按钮,通过执行长时间运行的artisan命令开始流式传输(需要在后台运行,因为Twitter流连接永远不会结束) . 通过命令行工作正常 .
但是以编程方式调用命令不起作用 . 我试过通过callSilent()从另一个命令静默调用它,并尝试使用Symfony \ Component \ Process \ Process来运行artisan命令或运行一个运行上述命令的shell脚本但我无法弄明白 .
Update 如果我对打开流连接的命令进行排队,则会导致队列工作程序的进程超时
我实际上需要一种从PHP类/脚本运行上述命令的方法,但PHP脚本不等待该命令的完成/输出 .
非常感谢
2 回答
默认情况下,Symfony Process Component将在当前工作目录
getcwd()
中执行提供的命令 .getcwd()
返回的值不是Laravel安装目录(包含artisan的目录),因此该命令很可能会返回artisan: command not found
消息 .在Process Component documentation中没有提到它,但是如果你看一下class file,我们可以看到该构造允许我们提供一个目录作为第二个参数 .
您可以通过在初始化类时提供第二个参数来异步执行所需的命令:
如何通过Laravels内置队列排队执行命令?