如何防止laravel调度程序在cron作业完成之前运行

时间:2017-10-21 23:05:03

标签: php laravel api

我创建了一个运行cron作业的调度程序。我的代码:

protected function schedule(Schedule $schedule)
{

    $user = User::first();

    $schedule->job((new SoapRequest)->checkStatusApplication($user))->everyMinute();
}

任务是对Web服务进行soap调用以检查应用程序状态更改

这是checkStatusApplication类中执行soap调用以检查的方法SoapRequest

<?php

namespace App\ClientRequests;

use App\User;
use SoapClient;
use SoapFault;
use SoapParam;
use SoapVar;

class SoapRequest
{


    protected $password = config('application.password');
    protected $wsdl;
    protected $soapClient;

    public function __construct()
    {

        $this->soapClient = $this->makeSoapClient();
    }

    private function makeSoapClient()
    {

        return new SoapClient($this->wsdl, [
            'local_cert'   => base_path('storage/') 
            'passphrase'   => $this->password,
            'soap_version' => SOAP_1_1,
            'trace'        => 1,

        ]);
    }


    public static function checkStatusApplication(User $user)
    {

        $init = new self;

        $params = $init->makeSoapParams($init->makeXML($user));

        $response = $init->request('SubmitV2', [$params]);

        return $response;
    }

    private function request($functionName, $params)
    {

        try {

            return $this->soapClient->__soapCall($functionName, $params);

        } catch (SoapFault $e) {

            log_system('  fial: ', $this->soapClient->__getLastResponse());
            dd($e->getMessage());
        }
    }


}

INFO`:这项工作应该在后台运行。

我的要点是:我想从数据库中获取所有未被批准用于该应用程序的状态的用户,并在后台向Web服务进行soap调用,

问题假设我有200个用户需要检查状态更改。

问题 *如果来自200个用户说我的第三个请求我得到异常或api服务器已关闭,我的其他请求/调度程序会发生什么或任何想法如何处理该怎么办?如何确保我的调度程序在完成所有请求后才会再次运行示例api的超时时间。

注意我想每分钟运行一次调度程序

1 个答案:

答案 0 :(得分:0)

您应该能够使用withoutOverlapping方法阻止您的任务重叠。

$schedule->job((new SoapRequest)->checkStatusApplication($user))->everyMinute()->withoutOverlapping();

https://laravel.com/docs/5.5/scheduling#preventing-task-overlaps

  

默认情况下,即使先前的任务实例仍在运行,也会运行计划任务。为防止这种情况,您可以使用withoutOverlapping方法: