DEBUG模式Ctrl+C结束运行时会报Broken pipe错误

释永战

问题描述

在命令行通过a.php文件里面执行passthru方法调用命令运行start.php文件以启动workman,在以DEBUG模式启动后按Ctrl+C结束运行时会报错误:

程序代码

a.php的代码如下:

passthru('php start.php start');

workman启动运行是没有问题的,只是按Ctrl+C结束时报错。

报错信息

PHP Notice:  fwrite(): write of 151 bytes failed with errno=32 Broken pipe in /www/wwwroot/vendor/workerman/workerman/Worker.php on line 2263

截图报错信息里报错文件相关代码

操作系统及workerman/webman等框架组件具体版本

系统是Linux CentOS7.9
workerman版本是4.1

请问下应该怎么解决?

456 1 0
1个回答

walkor 打赏

找到Worker.php 2263那行代码,

\fwrite($stream, $msg);
\fflush($stream);

改成

 if (!feof($stream)) {
     \fwrite($stream, $msg);
     \fflush($stream);
 }

试下是否报错

  • 释永战 2024-03-22

    测试了还是报错,试了下直接在\fwrite($stream, $msg);前面加了一个@就不会报错了。

  • 释永战 2024-03-22

    还有什么方法可以解决不····

  • walkor 2024-03-22

    改成

            set_error_handler(function(){});
            if (!feof(self::$outputStream)) {
                fwrite(self::$outputStream, $msg);
                fflush(self::$outputStream);
            }
            restore_error_handler();
  • 释永战 2024-03-22

    你给的代码有问题啊
    应该是改成

    set_error_handler(function(){});
    \fwrite($stream, $msg);
    \fflush($stream);
    restore_error_handler();
  • 释永战 2024-03-22

    这样改了之后就没有报错了,应该是解决了,官方代码会把这个代码更新进去吗?

  • walkor 2024-03-22

  • 释永战 2024-03-22

    好的,非常感谢···

×
🔝