webman 定时任务 mysql断线后,几分钟后,虽然mysql恢复了。 但是提示 Call to a member function getBitwiseOperators() on null。我必须要重启才行,否则一直提示这个报错。



测试复现的代码:
class Test
{
/**
* 进程启动时执行
*
* @param Worker $worker
* @return void
*/
public function onWorkerStart(Worker $worker): void
{
Log::info('定时任务进程已启动');
// 注册所有定时任务
$this->registerCrontabs();
}
/**
* 进程停止时执行
*
* @param Worker $worker
* @return void
*/
public function onWorkerStop(Worker $worker): void
{
Log::info('定时任务进程已停止');
}
/**
* 注册所有定时任务
*
* @return void
*/
protected function registerCrontabs(): void
{
// 1. 每分钟执行一次
new Crontab('* * * * *', function () {
$this->test();
}, '测试定时任务');
}
public function test()
{
try {
$user = Users::find(1);
if (!$user) {
Log::info('用户不存在');
return false;
}
Log::info('用户已存在');
return true;
} catch (Throwable $e) {
Log::error($e->getMessage());
}
}
}
定时任务日志:
[2026-02-02 07:40:27] default.INFO: 定时任务进程已启动 [] []
[2026-02-02 07:41:01] default.ERROR: SQLSTATE[HY000] [2006] MySQL server has gone away (Connection: mysql, SQL: select * from `bw_users` where `bw_users`.`id` = 1 limit 1) [] []
[2026-02-02 07:42:00] default.ERROR: Call to a member function getBitwiseOperators() on null [] []
[2026-02-02 07:43:16] default.INFO: 定时任务进程已启动 [] []
workman.log日志:
Next Illuminate\Database\QueryException: SQLSTATE[HY000] [2006] MySQL server has gone away (Connection: mysql, SQL: select * from `bw_users` where `bw_users`.`id` = 1 limit 1) in E:\WorkSpace\Test\Server\vendor\illuminate\database\Connection.php:829
Stack trace:
#0 E:\WorkSpace\Test\Server\vendor\illuminate\database\Connection.php(983): Illuminate\Database\Connection->runQueryCallback('select * from `...', Array, Object(Closure))
#1 E:\WorkSpace\Test\Server\vendor\illuminate\database\Connection.php(962): Illuminate\Database\Connection->tryAgainIfCausedByLostConnection(Object(Illuminate\Database\QueryException), 'select * from `...', Array, Object(Closure))
#2 E:\WorkSpace\Test\Server\vendor\illuminate\database\Connection.php(785): Illuminate\Database\Connection->handleQueryException(Object(Illuminate\Database\QueryException), 'select * from `...', Array, Object(Closure))
#3 E:\WorkSpace\Test\Server\vendor\illuminate\database\Connection.php(414): Illuminate\Database\Connection->run('select * from `...', Array, Object(Closure))
#4 E:\WorkSpace\Test\Server\vendor\illuminate\database\Query\Builder.php(2913): Illuminate\Database\Connection->select('select * from `...', Array, true)
#5 E:\WorkSpace\Test\Server\vendor\illuminate\database\Query\Builder.php(2902): Illuminate\Database\Query\Builder->runSelect()
#6 E:\WorkSpace\Test\Server\vendor\illuminate\database\Query\Builder.php(3456): Illuminate\Database\Query\Builder->Illuminate\Database\Query\{closure}()
#7 E:\WorkSpace\Test\Server\vendor\illuminate\database\Query\Builder.php(2901): Illuminate\Database\Query\Builder->onceWithColumns(Array, Object(Closure))
#8 E:\WorkSpace\Test\Server\vendor\illuminate\database\Eloquent\Builder.php(739): Illuminate\Database\Query\Builder->get(Array)
#9 E:\WorkSpace\Test\Server\vendor\illuminate\database\Eloquent\Builder.php(723): Illuminate\Database\Eloquent\Builder->getModels(Array)
#10 E:\WorkSpace\Test\Server\vendor\illuminate\database\Concerns\BuildsQueries.php(333): Illuminate\Database\Eloquent\Builder->get(Array)
#11 E:\WorkSpace\Test\Server\vendor\illuminate\database\Eloquent\Builder.php(449): Illuminate\Database\Eloquent\Builder->first(Array)
#12 E:\WorkSpace\Test\Server\vendor\illuminate\support\Traits\ForwardsCalls.php(23): Illuminate\Database\Eloquent\Builder->find(1)
#13 E:\WorkSpace\Test\Server\vendor\illuminate\database\Eloquent\Model.php(2335): Illuminate\Database\Eloquent\Model->forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), 'find', Array)
#14 E:\WorkSpace\Test\Server\vendor\illuminate\database\Eloquent\Model.php(2347): Illuminate\Database\Eloquent\Model->__call('find', Array)
#15 E:\WorkSpace\Test\Server\app\process\Test.php(59): Illuminate\Database\Eloquent\Model::__callStatic('find', Array)
#16 E:\WorkSpace\Test\Server\app\process\Test.php(53): app\process\Test->test()
#17 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Events\Select.php(481): app\process\Test->app\process\{closure}()
#18 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Events\Select.php(340): Workerman\Events\Select->safeCall(Object(Closure), Array)
#19 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Events\Select.php(427): Workerman\Events\Select->tick()
#20 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Worker.php(1601): Workerman\Events\Select->run()
#21 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Worker.php(1526): Workerman\Worker::forkWorkersForWindows()
#22 E:\WorkSpace\Test\Server\vendor\workerman\workerman\src\Worker.php(593): Workerman\Worker::forkWorkers()
#23 E:\WorkSpace\Test\Server\runtime\windows\start_test.php(33): Workerman\Worker::runAll()
#24 {main}
[PHP Modules]
bcmath
calendar
Core
ctype
date
dom
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
Phar
random
readline
redis
Reflection
session
SimpleXML
SPL
standard
tokenizer
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]
把
workermanworkerman/coroutinewebman-framework具体版本贴下。php start.php status贴下。php -m贴下。最小可复现代码贴下,完整的最小复现代码,不要业务。
老大 我已经贴了相关数据,辛苦帮忙看下。就是在定时任务里面查询个数据,然后当我mysql关闭了 就会报这个,就算mysql开启了 他也不会自动恢复
workerman/coroutine版本没贴php -m没贴workerman/coroutine 这个我好像没用到
composer info | findstr coroutine发下
workerman/coroutine 1.1.4 Workerman coroutine
老大空了帮忙看下,我现在测试就定时任务的有这个问题 redis消费者的就不会。谢谢
我现在参考redis消费者的代码 在每次执行完定时任务的时候 Context::destroy(); 现在mysql停机恢复了 就可以继续运行了 这样是不是可行
webman/database 更新到 2.1.9 ,重启webman
测试可以了 谢谢老大