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