Задачи Parellel в планировании Laravel - PullRequest
0 голосов
/ 15 ноября 2018

У меня в основном есть система, которая теоретически является просто ботом, мне нужно запускать ее на многопоточности (да, я знаю, это PHP, что не совсем возможно) или где-то по-другому, чтобы иметь возможность запускать команду на основе параллельных командна красноречивом результате.

В настоящее время моя система выглядит примерно так:

Это мой Kernel.php

protected $commands = [
    Commands\RunBuy::class
] 

protected function schedule(Schedule $schedule)
{
    $schedule->command('buy:cron')->everyMinute();
}

Это мой RunBuy.php

public function __construct() {
    parent::__construct();
}

public function handle() {
    $this->bot = Bots::where('status', '1')->where('in_use', '0')->first();
    .......
}

Мне нужна та же возможность, но я могу управлять несколькими Bots в зависимости от того, сколько у них строк?то, что я хотел бы сделать, это примерно так:

protected function schedule(Schedule $schedule)
{
    foreach(Bots::where('status', '1')->where('in_use', '0')->get() as $bot) {
        $schedule->command('buy:cron '.$bot->id)->everyMinute();
    }
}

И затем обработать это внутри RunBuy.php примерно так:

protected $signature = 'buy:cron {bot_id : The Bot ID we must perform actions with}';

public function __construct() {
    parent::__construct();
}

public function handle() {
    $bot_id = $this->argument('bot_id');

    $this->bot = Bots::find($bot_id);
    .......
}

Но что-то подобное не будет работать, так как Laravel обрабатывает каждую команду одну за другой?Мне нужно, чтобы все они одновременно сработали.

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы работаете в системе Linux, вы можете вызвать команду напрямую с помощью команды final &, чтобы завершить процесс

$schedule->exec('php artisan buy:cron ' . $bot->id . ' > /dev/null &')->everyMinute();

В окнах вы можете добавить запланированный процесс для запуска (пакет, который принимает 1 параметр) и назовите это как

$schedule->exec('schtasks /run /tn yourtask.bat ' . $bot->id)->everyMinute();

yourtask.bat должен быть простым вызовом php artisan

cd /path/to/project && php artisan buy:cron %1

или вы можете запустить каждый процесс в фоновом режиме

function execInBackground($cmd) {
    try {
        if (substr(php_uname(), 0, 7) == "Windows") {
            pclose(popen("start /B " . $cmd, "r"));
        } else {
            exec($cmd . " > /dev/null &");
        }
    } catch (\Exception $ex) {
        throw $ex;
    }
}
...