Php 如何在laravel中在后台调用队列工作者
我不能在我的服务器上安装Supervisor,我希望使用比CRON更灵活的方式来运行队列工作程序。 我尝试从SSH(Putty)-works调用artisan命令,但我想从网站管理它们, 所以我测试了PHP exec和Symfony进程类,还下载了Laravelcollective remote。 每次没有进程运行时,我甚至没有得到任何错误,只是什么都没有Php 如何在laravel中在后台调用队列工作者,php,laravel,ssh,background,Php,Laravel,Ssh,Background,我不能在我的服务器上安装Supervisor,我希望使用比CRON更灵活的方式来运行队列工作程序。 我尝试从SSH(Putty)-works调用artisan命令,但我想从网站管理它们, 所以我测试了PHP exec和Symfony进程类,还下载了Laravelcollective remote。 每次没有进程运行时,我甚至没有得到任何错误,只是什么都没有 Exec public function call_worker(){ $cmd = '(cd ' . dirname(ge
Exec
public function call_worker(){
$cmd = '(cd ' . dirname(getcwd()) . '/; php artisan queue:work)';
exec($cmd);
}
从symfony进程中,我得到一个错误255 Uknown错误。
“ls”命令每次都是这样运行的。
提前谢谢
@编辑是否会因为“lsphp”而成为问题?
@edit2我使用下面的代码在后台运行worker。
我可能会遇到更多的问题,如果是这样,我会发布它们
public function call_worker(){
//echo shell_exec(dirname(getcwd()) . ' ls');
//echo shell_exec('ls');
$php = '/opt/alt/php73/usr/bin/php';
$cmd = ' artisan queue:work';
$process = new Process('/opt/alt/php73/usr/bin/php artisan queue:work &');
$process->setWorkingDirectory(dirname(getcwd()) . '/');
//$process = Process::fromShellCommandline('echo "$MESSAGE"');
$process->start();
$pid = $process->getPid();
echo $pid;
foreach ($process as $type => $data) {
if ($process::OUT === $type) {
echo "\nRead from stdout: ".$data;
} else { // $process::ERR === $type
echo "\nRead from stderr: ".$data;
}
}
echo $process->getOutput();
}
问题是您的托管限制太严格,不允许您运行长时间运行的进程,例如
php artisan queue:work
命令?如果是这样的话,答案可能是找到其他主机。事实上,在过去,我错误地做了一个循环,我不得不手动终止它,cron一直调用schedule(workers)并以这种方式执行一些任务,在早期阶段,我运行worker时没有运行worker——曾经,它填满了内存并运行了很长一段时间,直到我注意到这一点。我会问他们是否像你所说的那样,但我怀疑是否有可能使用而不使用overlapping()
方法以Laravel任务调度程序命令的形式运行队列工作程序,以防止重复进程。有关更多信息,请参阅此答案:只需跳过有关supervisor
的部分。
SSH in PHP
public function call_worker(){
$cmd = '(cd ' . dirname(getcwd()) . '/; php artisan queue:work)';
\SSH::run($cmd, function($line)
{
echo $line.PHP_EOL;
});
public function call_worker(){
$cmd = '(cd ' . dirname(getcwd()) . '/; php artisan queue:work) &';
\SSH::run($cmd, function($line)
{
echo $line.PHP_EOL;
});
Symfony Process class
public function call_worker(){
$cmd = 'php artisan queue:work';
$process = new Process($cmd);
$process->setWorkingDirectory(dirname(getcwd()) . '/');
$process->start();
}
public function call_worker(){
//echo shell_exec(dirname(getcwd()) . ' ls');
//echo shell_exec('ls');
$php = '/opt/alt/php73/usr/bin/php';
$cmd = ' artisan queue:work';
$process = new Process('/opt/alt/php73/usr/bin/php artisan queue:work &');
$process->setWorkingDirectory(dirname(getcwd()) . '/');
//$process = Process::fromShellCommandline('echo "$MESSAGE"');
$process->start();
$pid = $process->getPid();
echo $pid;
foreach ($process as $type => $data) {
if ($process::OUT === $type) {
echo "\nRead from stdout: ".$data;
} else { // $process::ERR === $type
echo "\nRead from stderr: ".$data;
}
}
echo $process->getOutput();
}