请问源码中work.php中resetstd()方法的具体用途?

zhaocong
public static function resetStd()
    {
        if (!static::$daemonize || static::$_OS !== 'linux') {
            return;
        }
        global $STDOUT, $STDERR;
        $handle = fopen(static::$stdoutFile, "a");
        if ($handle) {
            unset($handle);
            //关闭标准输出和标准错误
            @fclose(STDOUT);
            @fclose(STDERR);
            //a 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
            //把标准输出和错误 定位到 /dev/null
            $STDOUT = fopen(static::$stdoutFile, "a");
            $STDERR = fopen(static::$stdoutFile, "a");
        } else {
            throw new Exception('can not open stdoutFile ' . static::$stdoutFile);
        }
    }

不是太理解这段操作的意义在于什么?

2755 4 0
4个回答

zhaocong

意思是把标准错误流 (stdout) 、标准错误流(stderr)重定向到设备/dev/null上。

/dev/null 是类Unix系统中的一个特殊文件设备,他的作用是接受一切输入它的数据并丢弃这些数据。通常被当做垃圾桶来用。

将输出流重定向到它上面,就是丢弃这个输出流上的所有输出。

  • 暂无评论
maq

要点在于“重新打开”标准输出设备,可能的应用场景是 log rotate。

至于是不是 /dev/null,并不取决于这段代码,而是看 $stdoutFile 的设置。(不要看那句注释,那是误导)

  • zhaocong 2018-04-19

    恩,我的理解是,有利于后台运行脚本直接输出并被记录到相关的文件中,跟踪程序。这样理解没问题把?

zhaocong

还有一点,不太理解的是,定义的onMessage 为什么会执行2次,这是个什么原理?
操作就是: 开启workerman服务后,刷新浏览器。
具体代码:

$http_worker = new Worker("http://0.0.0.0:2345");
$http_worker->count = 3;
$http_worker->onMessage = function($connection, $data)
{
    echo "xx\n";
    $connection->send('hello world');
};
  • maq 2018-04-19

    浏览器会请求 favicon.ico

  • zhaocong 2018-04-19

    好吧,我忽略了这点,大神谢谢你的回复。

年代过于久远,无法发表回答
🔝