定时任务组件,1s执行一次的任务经常会重复执行
new \Workerman\Crontab\Crontab('*/1 * * * * *', function () {
$time = time();
$timeLock = "task_lock:" . $time;
if (Redis::exists($timeLock)) {
echo "当前秒存在任务";
return;
}
Redis::set($timeLock, 1);
echo date('Y-m-d H:i:s') . PHP_EOL;
});
这里是输出
2023-02-17 09:38:00
当前秒存在任务2023-02-17 09:38:01
当前秒存在任务2023-02-17 09:38:02
当前秒存在任务2023-02-17 09:38:03
当前秒存在任务2023-02-17 09:38:04
当前秒存在任务2023-02-17 09:38:05
当前秒存在任务2023-02-17 09:38:06
当前秒存在任务2023-02-17 09:38:07
当前秒存在任务2023-02-17 09:38:08
当前秒存在任务2023-02-17 09:38:09
当前秒存在任务2023-02-17 09:38:10
当前秒存在任务2023-02-17 09:38:11
当前秒存在任务2023-02-17 09:38:12
当前秒存在任务2023-02-17 09:38:13
当前秒存在任务2023-02-17 09:38:14
当前秒存在任务2023-02-17 09:38:15
当前秒存在任务2023-02-17 09:38:16
当前秒存在任务2023-02-17 09:38:17
mac和linux出现了,workerman/crontab版本v1.0.4
是不是因为多进程的关系 被并发执行了
webman框架下调用的定时任务组件,基本都是默认配置
是偶尔出现,不是一直出现
如果你开了2个进程,每个进程定时执行一次可能会出现这种情况
老大好,配置项是webman默认的配置,这个在哪里看呢
webman进程数在 config/server.php 里用count设置。
自定义进程在config/process.php里用count参数设置。
process.php设置是这样的,没有设置count<?php
/**
*/
use Workerman\Worker;
return [
// File update detection and automatic reload
'monitor' => [
'handler' => process\Monitor::class,
'reloadable' => false,
'constructor' => [
// Monitor these directories
'monitor_dir' => array_merge([
app_path(),
config_path(),
base_path() . '/process',
base_path() . '/support',
base_path() . '/resource',
base_path() . '/.env',
], glob(base_path() . '/plugin//app'), glob(base_path() . '/plugin//config'), glob(base_path() . '/plugin/*/api')),
// Files with these suffixes will be monitored
'monitor_extensions' => [
'php', 'html', 'htm', 'env'
],
'options' => [
'enable_file_monitor' => !Worker::$daemonize && DIRECTORY_SEPARATOR === '/',
'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/',
]
]
],
'task' => [
'handler' => process\Task::class
],
];
如果一个进程 你加redis 就是毫无意义 ,本来就是 一秒执行一次
执行了两次,所以我加锁了...
执行两次说明2个进程呗
设置 count =1
我试试
process.php 里设置了 'task' => [
'handler' => process\Task::class,
'count' => 1
],还是有重复执行的
定时器放在哪里执行的。把process.php里'task'进程配置删除,看下是否还有地方执行定时器
定时器只配置在process.php中执行,删除后没有再执行过了
已发送
你的workerman/crontab不是最新的,升级 workerman/crontab 升级到 v1.0.6
我试试