在后台执行Laravel / Symfony / Artisan命令

时间:2015-08-26 02:02:10

标签: php symfony laravel laravel-5 artisan

我需要在后台执行一个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脚本不等待该命令的完成/输出。

非常感谢

2 个答案:

答案 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内置队列排队执行命令?