修复多进程定时器的重复执行错误

This commit is contained in:
augushong
2024-10-04 23:51:00 +08:00
parent 4fd138900b
commit e4fe7b421b

View File

@@ -105,6 +105,11 @@ class TimerBase extends Command
public function runParallel()
{
// 重新构造命令行参数,以便兼容workerman的命令
global $argv;
$argv = [];
array_unshift($argv, 'think', 'start');
$host = $this->host;
$site_host = $this->siteHost;
$output = $this->output;
@@ -119,10 +124,16 @@ class TimerBase extends Command
Timer::add(1, function () use ($worker, $host, $site_host, $output, $input) {
$request_list = $worker->timerRequestList;
foreach ($request_list as $request_item) {
$output->writeln(date('Y-m-d H:i:s') . ': build site request async:' . $request_item['target']);
if (!isset($request_item['is_running'])) {
$request_item['is_running'] = false;
}
if ($request_item['is_running']) {
$output->writeln('进行中,跳过');
continue;
}
if (!isset($request_item['last_run_time'])) {
$request_item['last_run_time'] = 0;
}
@@ -134,15 +145,13 @@ class TimerBase extends Command
$request_item['is_running'] = true;
$request_item['last_run_time'] = time();
$output->writeln(date('Y-m-d H:i:s') . ': build site request async:' . $request_item['target']);
//
$options = [
'max_conn_per_addr' => Config::get('timer.max_conn_per_addr', 1000),
'keepalive_timeout' => Config::get('timer.keepalive_timeout', 86400),
'connect_timeout' => Config::get('timer.connect_timeout', 86400),
'timeout' => Config::get('timer.timeout', 86400),
'max_conn_per_addr' => Config::get('timer.max_conn_per_addr', 1000),
'keepalive_timeout' => Config::get('timer.keepalive_timeout', 86400),
'connect_timeout' => Config::get('timer.connect_timeout', 86400),
'timeout' => Config::get('timer.timeout', 86400),
];
$http = new HttpClient($options);
@@ -151,13 +160,13 @@ class TimerBase extends Command
'Host' => $site_host,
'Accept' => 'application/json,text/plain',
],
'success' => function ($response) use ($request_item) {
'success' => function ($response) use ($request_item, $output) {
$request_item['is_running'] = false;
echo $response->getBody();
$output->writeln($response->getBody());
},
'error' => function ($exception) use ($request_item) {
'error' => function ($exception) use ($request_item, $output) {
$request_item['is_running'] = false;
echo $exception;
$output->writeln($exception);
},
]);
}