<?php
namespace Module\Vendor\Command;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use ModStart\Core\Util\ArrayUtil;
use ModStart\Core\Util\FileUtil;
use ModStart\Core\Util\ShellUtil;
use ModStart\Core\Util\TimeUtil;
use ModStart\ModStart;
use Module\Vendor\Util\CacheUtil;
class ScheduleRunAllCommand extends Command
{
protected $signature = 'modstart:schedule-run-all {php} {dir}';
public function handle()
{
$php = $this->argument('php');
$dir = $this->argument('dir');
$hash = md5($php . ':' . $dir);
$projects = CacheUtil::remember("Vendor:ScheduleRunAll:Projects:" . $hash,
3600,
function () use ($dir) {
$projects = FileUtil::listFiles($dir);
$projects = array_filter($projects, function ($p) {
return $p['isDir']
&& @file_exists($p['pathname'] . '/artisan')
&& @file_exists($p['pathname'] . '/.env')
&& !Str::startsWith($p['filename'], '_delete.')
&& @file_exists($p['pathname'] . '/vendor/modstart/modstart-' . ModStart::env());
});
shuffle($projects);
return ArrayUtil::keepItemsKeys($projects, ['pathname']);
});
foreach ($projects as $project) {
$start = TimeUtil::millitime();
if (ModStart::env() === 'laravel9') {
$command = [
$php,
$project['pathname'] . '/artisan',
'schedule:run'
];
Log::info("Vendor.ScheduleRunAllCommand.Run - " . join(' ', $command));
} else {
$command = "$php {$project['pathname']}/artisan schedule:run";
Log::info("Vendor.ScheduleRunAllCommand.Run - {$command}");
}
$result = ShellUtil::runInNewProcess($command, false);
$result = str_replace([
"\r"
], "", $result);
$result = str_replace("\n", " ", $result);
$result = str_replace("Running scheduled command: Closure", "√", $result);
$result = str_replace("No scheduled commands are ready to run.", "〇", $result);
$ms = TimeUtil::millitime() - $start;
Log::info("Vendor.ScheduleRunAllCommand.Result - {$result} - {$ms}ms");
}
}
}