在后台执行 Laravel/Symfony/Artisan 命令
Execute Laravel/Symfony/Artisan Command in Background
我需要在后台执行 Laravel 长 运行ning 进程以使用 Twitter 流 API。实际上,我需要 运行 的 php artisan CLI 命令是
nohup php artisan startStreaming > /dev/null 2>&1 &
如果我 运行 自己在命令行中工作,它会完美运行。
我的想法是,我可以在网站上单击一个按钮,通过执行启动流的长 运行ning artisan 命令来启动流(需要在后台 运行 因为Twitter 流媒体连接永无止境)。通过命令行工作正常。
但是以编程方式调用命令不起作用。我尝试通过另一个命令的 callSilent() 静默调用它,并尝试使用 Symfony\Component\Process\Process 到 运行 artisan 命令或 运行 shell 脚本 运行是上面的命令,但我想不通。
更新
如果我对打开流连接的命令进行排队,则会导致队列工作程序的进程超时
我实际上需要一种方法来从 PHP class/script 运行 上面的命令但是 PHP 脚本不等待 completion/output该命令的。
非常感谢帮助
默认情况下,Symfony 进程组件将在当前工作目录中执行提供的命令,getcwd()
。
getcwd()
返回的值不会是 Laravel 安装目录(包含 artisan 的目录),因此该命令很可能会返回 artisan: command not found
消息。
在Process Component documentation but if you take a look at the class file中没有提到,我们可以看到该构造允许我们提供一个目录作为第二个参数。
public function __construct(
$commandline,
$cwd = null,
array $env = null,
$input = null,
$timeout = 60, array
$options = array())
您可以通过在初始化 class:
时提供第二个参数来异步执行所需的命令
use Symfony\Component\Process\Process;
$process = new Process('php artisan startStreaming > /dev/null 2>&1 &', 'path/to/artisan');
$process->start();
如何通过 Laravels 内置队列对命令的执行进行排队?
我遇到了同样的问题,我用纯 php 解决了这个问题并使用了 proc_open 函数。
我的代码:
$descriptionProcOpen = [
["pipe", "r"],
["pipe", "r"],
["pipe", "r"]
];
proc_open("php " . base_path() . "/artisan your:command {$argument}", $descriptionProcOpen, $pipes);
我需要在后台执行 Laravel 长 运行ning 进程以使用 Twitter 流 API。实际上,我需要 运行 的 php artisan CLI 命令是
nohup php artisan startStreaming > /dev/null 2>&1 &
如果我 运行 自己在命令行中工作,它会完美运行。
我的想法是,我可以在网站上单击一个按钮,通过执行启动流的长 运行ning artisan 命令来启动流(需要在后台 运行 因为Twitter 流媒体连接永无止境)。通过命令行工作正常。
但是以编程方式调用命令不起作用。我尝试通过另一个命令的 callSilent() 静默调用它,并尝试使用 Symfony\Component\Process\Process 到 运行 artisan 命令或 运行 shell 脚本 运行是上面的命令,但我想不通。
更新 如果我对打开流连接的命令进行排队,则会导致队列工作程序的进程超时
我实际上需要一种方法来从 PHP class/script 运行 上面的命令但是 PHP 脚本不等待 completion/output该命令的。
非常感谢帮助
默认情况下,Symfony 进程组件将在当前工作目录中执行提供的命令,getcwd()
。
getcwd()
返回的值不会是 Laravel 安装目录(包含 artisan 的目录),因此该命令很可能会返回 artisan: command not found
消息。
在Process Component documentation but if you take a look at the class file中没有提到,我们可以看到该构造允许我们提供一个目录作为第二个参数。
public function __construct(
$commandline,
$cwd = null,
array $env = null,
$input = null,
$timeout = 60, array
$options = array())
您可以通过在初始化 class:
时提供第二个参数来异步执行所需的命令use Symfony\Component\Process\Process;
$process = new Process('php artisan startStreaming > /dev/null 2>&1 &', 'path/to/artisan');
$process->start();
如何通过 Laravels 内置队列对命令的执行进行排队?
我遇到了同样的问题,我用纯 php 解决了这个问题并使用了 proc_open 函数。
我的代码:
$descriptionProcOpen = [
["pipe", "r"],
["pipe", "r"],
["pipe", "r"]
];
proc_open("php " . base_path() . "/artisan your:command {$argument}", $descriptionProcOpen, $pipes);