我需要在后台执行 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 脚本不等待该命令的完成/输出。
非常感谢帮助
默认情况下,Symfony 进程组件将在当前工作目录中执行提供的命令,getcwd()
.
返回的值getcwd()
不会是 Laravel 安装目录(包含 artisan 的目录),因此该命令很可能会返回artisan: command not found
信息。
文中没有提到流程组件文档 http://symfony.com/doc/current/components/process.html但如果你看一下类文件 https://github.com/symfony/Process/blob/master/Process.php#L145,我们可以看到该构造允许我们提供一个目录作为第二个参数。
public function __construct(
$commandline,
$cwd = null,
array $env = null,
$input = null,
$timeout = 60, array
$options = array())
您可以通过在初始化类时提供第二个参数来异步执行所需的命令:
use Symfony\Component\Process\Process;
$process = new Process('php artisan startStreaming > /dev/null 2>&1 &', 'path/to/artisan');
$process->start();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)