Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

启用crontab后运行程序报错 ERROR php_swoole_server_rshutdown (ERRNO 503)

未关闭
#6 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
php
领域
backend

调研方向

首先,在启用 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

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

hyperf/crontab 的其他 Issue

查看 hyperf/crontab 的全部 Issue

相似的 Issue

更多 PHP Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。