Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在后台休眠PHP(Laravel5.2)_Php_Multithreading_Laravel 5_Sleep - Fatal编程技术网

如何在后台休眠PHP(Laravel5.2)

如何在后台休眠PHP(Laravel5.2),php,multithreading,laravel-5,sleep,Php,Multithreading,Laravel 5,Sleep,我创建了一个artisan命令,希望在调用方法后立即运行该命令。但是该命令包含一个sleep()命令。我想在后台运行artisan命令,因为该方法需要立即返回对用户的响应。我的示例代码如下所示: 在路由文件中 Route::get('test', function(){ Artisan::queue('close:bidding', ['applicationId' => 1]); return 'called close:bidding'; }); 在关闭:投标命令中

我创建了一个
artisan命令
,希望在调用方法后立即运行该命令。但是该命令包含一个
sleep()命令。我想在后台运行artisan命令,因为该方法需要
立即返回对用户的响应。我的示例代码如下所示:

在路由文件中

Route::get('test', function(){
    Artisan::queue('close:bidding', ['applicationId' => 1]);
    return 'called close:bidding';
});
关闭:投标
命令中

public function handle()
    {
        $appId = $this->argument('applicationId');
        //following code line is making the problem
        sleep(1000 * 10);
        //close bidding after certain close time
        try{
            Application::where('id', $appId)->update(['live_bidding_status' => 'closed']);
        }catch (\PDOException $e){
            $this->info($e->getMessage());//test purpose
        }
        $this->info($appId.":  bid closed after 10 seconds of creation");
    } 
问题 当我点击
/test
url时,返回字符串
称为close:bidding
在浏览器加载10秒后显示,因为命令中有一个
sleep(10*1000)

我想要什么 我想在后台运行该命令。我的意思是,当我点击
/test
url时,它应该立即显示名为close:bidding
命令,但是
close:bidding
命令将在后台运行。10秒后,它将更新应用程序,尽管前端用户不会注意到它的任何内容

部分问题

  • 它是否与多线程相关

  • 这是不是使用PHP无法解决的问题,我应该换一种方式思考吗

  • 即使使用Laravel队列,也有办法解决这个问题吗

  • 创造一份工作

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    
    class JobTest implements ShouldQueue
    {
        use InteractsWithQueue, Queueable, SerializesModels;
    
        private $payload = [];
        public function __construct($payload)
        {
            $this->payload = $payload;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            $appId = $this->payload('applicationId');
            //following code line is making the problem
            sleep(1000 * 10);
        }
    }
    
    在这种状态下,我们有作业,您将作业分发到队列。但它还没有被处理。我们需要队列侦听器或工作者在后台处理这些作业

    php artisan queue:listen --queue=queue_name --timeout=0  
    OR
    php artisan queue:work --queue=queue_name --timeout=0 //this will run forever
    
    注: 也许你可以试试supervisord,beanstakd来管理队列


    欲了解更多信息,请参考

    如果您不需要适当排队的所有优点,这是有代价的,那么使用它就足够了。将响应发送到浏览器后,它将执行此任务。

    可能是您可以尝试Larvel队列作业,而不是CommandThank。谢谢,我将尝试它是否会影响对服务器的任何进一步请求?@Al-ImranAhmed,我不确定我是否理解此问题。你有什么特别的担心吗?假设,我点击了一个url,我得到了响应,然后在提供了响应之后,服务器正在处理另一个任务(在terminable中间件中)。在该任务中,我有一个
    sleep(1000*10)
    命令。同时,如果向服务器发出另一个请求,前一个请求的可终止任务(睡眠)是否会影响新请求。我仍然不明白您所说的影响新请求是什么意思。在这个问题上,它不会比最初的实现对它产生更坏的影响。共享资源的常见限制适用,例如,如果您在一个线程中写入锁定文件,并在第一个请求释放锁定之前尝试在另一个请求中写入同一个文件,则是,它将影响。否则,两个请求由两个不同的进程处理,它们不会相互干扰<代码>终止
    不会改变php的工作方式,它只是在执行代码之前刷新输出缓冲区。谢谢。通过单词
    affect
    我问道,因为前面的请求是
    sleep
    命令,并且某个东西(可能是PHP)正在睡眠一段时间。因此,在睡眠时间内,如果出现另一个请求,新请求将不得不等待,直到旧请求的睡眠时间结束。我的意思是说所有这些都是一个小小的词
    affect
    。我的错。你能澄清一下你最后的命令吗?当我创建作业并在队列上分派作业时,也会发生同样的情况。我没有使用php artisan queue:work--queue=queue\u name--timeout=0
    命令,因为我不知道它在做什么,为什么需要它。更新我的答案可能会有任何帮助。或者通过answer onceSo中的链接,我需要一个队列侦听器或工作者来处理我的工作。但是谁将运行
    queue:listener
    queue:worker
    命令?
    php artisan queue:listen --queue=queue_name --timeout=0  
    OR
    php artisan queue:work --queue=queue_name --timeout=0 //this will run forever