首页 文章

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

提问于
浏览
5

我需要在后台执行一个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 回答

  • 10

    默认情况下,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();
    
  • 0

    如何通过Laravels内置队列排队执行命令?

相关问题