我想要做的是在服务器上连续运行一个artisan命令。我知道克隆作业和Laravel中的调度,但这是行不通的,因为处理涉及调用API,有时需要1秒,有时需要15秒。所以我想继续运行它。
我在这个谜题上找到了几个碎片,但不能完全拼凑在一起。
假设我在我的自定义手工工匠命令中有这样的命令:
public function handle()
{
$this->info('Test');
}如果我现在运行nohup php artisan customcommand,就会得到appending output to nohup.out。文件nohup.out只有一次“测试”。所以,它似乎没有连续地运行handle()函数?
现在,如果我这样做,并运行它与nohup
public function handle()
{
$i = 1;
while(true)
{
$this->info('Test '.$i);
sleep(5);
$i++;
}
}它确实是连续运行的,我在nohup.out中得到了nohup.out。不过,使用while(true)循环会让人觉得很烦躁。这样做对吗?
最终,$this->info('Test');将被一个控制器函数所取代,该函数应该持续运行,但希望确保我的基本操作正确。
更新
如果我这样做,我会得到一个PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes),所以在while循环中实例化一个新控制器似乎不是一个好主意吗?
public function handle()
{
while(true)
{
$controller = new MyController;
$controller->index();
}
}发布于 2022-03-02 17:52:08
因为我可以从你的文章中读到,你似乎想要运行调用,然后直接运行后运行下一个,以此类推。而不是让它像每一分钟或每一秒一样运行。
当前要做的是,每次遍历循环时都会创建MyController的一个新实例。
因此,要解决这个问题,您可以将其移出循环。
public function handle()
{
$controller = new MyController;
while(true)
{
$controller->index();
}
}您要确保的是,不要每次在循环中运行时都继续创建新的东西。
https://stackoverflow.com/questions/56619090
复制相似问题