启用crontab后运行程序报错 ERROR php_swoole_server_rshutdown (ERRNO 503)
まだ誰も着手していません。
評価
調査の方向性
まず、config/autoload/crontab.php を有効にし、config/autoload/server.php に示されている task_worker の設定とコールバックを使用して、失敗を再現します。LogCleanerTask の例を実行し、vendor/symfony/console/Output/StreamOutput.php:76 と Hyperf\Framework\Logger\StdoutLogger を通るスタックを調査します。スケジュールされたタスクが socket coroutine の致命的エラーや worker の異常終了なしにログを出力できれば完了です。
索引モデルが issue の本文から書いたものです。
説明
环境
PHP 7.3.26
swoole 4.6.1
hyperf v2.1.1
配置config\autoload\crontab.php
return [
// 是否开启定时任务
'enable' => true,
];
config\autoload\server.php
'settings' => [
...
// Task Worker 数量,根据您的服务器配置而配置适当的数量
'task_worker_num' => 1,
// 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况
'task_enable_coroutine' => false,
],
'callbacks' => [
...
// Task callbacks
Event::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
Event::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
],
运行官方文档示例
<?php
declare(strict_types=1);
namespace App\Task;
use Hyperf\Crontab\Annotation\Crontab;
use Hyperf\Di\Annotation\Inject;
/**
* @Crontab(name="LogCleanerTask", rule="*\/5 * * * * *", callback="execute")
*/
class LogCleanerTask
{
/**
* @Inject()
* @var \Hyperf\Contract\StdoutLoggerInterface
*/
private $logger;
public function execute()
{
$this->logger->info(date('Y-m-d H:i:s', time()));
}
}
报错
[2021-02-06 16:51:00 *1514.0] ERROR php_swoole_server_rshutdown (ERRNO 503): Fatal error: Uncaught Swoole\Error: Socket#35 has already been bound to another coroutine#20, writing of the same socket in coroutine#21 at the same time is not allowed in /data/wwwroot/hyperf-api/vendor/symfony/console/Output/StreamOutput.php:76
Stack trace:
#0 /data/wwwroot/hyperf-api/vendor/symfony/console/Output/StreamOutput.php(76): fwrite(Resource id #1632, '\e[32m[DEBUG]\e[3...')
#1 /data/wwwroot/hyperf-api/vendor/symfony/console/Output/Output.php(166): Symfony\Component\Console\Output\StreamOutput->doWrite('\e[32m[DEBUG]\e[3...', true)
#2 /data/wwwroot/hyperf-api/vendor/symfony/console/Output/Output.php(132): Symfony\Component\Console\Output\Output->write(Array, true, 1)
#3 /data/wwwroot/hyperf-api/vendor/hyperf/framework/src/Logger/StdoutLogger.php(138): Symfony\Component\Console\Output\Output->writeln('<info>[DEBUG]</...')
#4 /data/wwwroot/hyperf-api/vendor/hyperf/framework/src/Logger/StdoutLogger.php(113): Hyperf\Framework\Logger\StdoutLogger->log('debug', '<info>[DEBUG]</...', Array)
#5 /data/wwwroot/hyperf-ap in /data/wwwroot/hyperf-api/vendor/symfony/console/Output/StreamOutput.php on line 76
[2021-02-06 16:51:00 $1510.0] WARNING check_worker_exit_status: worker#0[pid=1514] abnormal exit, status=255, signal=0
关闭crontab则不会报这个错误
- 主要言語
- PHP
- スター
- 13
- フォーク
- 13
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
hyperf/crontab のほかの issue
-
[BUG] 定时任务重复执行 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
-
任务执行时间迟了一秒钟 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 45/100
-
解析不了 每月最后一天 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
-
難易度 3/5 1〜2日 初心者へのやさしさ 45/100
似ている issue
-
tooling
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
UX
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
ProfessionalWiki/NeoWiki#1525 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
OpenConext/OpenConext-engineblock#2122 ·
-
Bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
Automattic/safe-publish#594 ·