博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)
阅读量:6696 次
发布时间:2019-06-25

本文共 1851 字,大约阅读时间需要 6 分钟。

 

WorkerMan中work.php中 resetStd 方法中代码如下

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);        }    }

命令行下运行以上程序,将不会在控制台输出任何内容,输出内容将被重定向到/dev/null中,非常诧异,一直不理解。$STDOUT, $STDERR 这并不是内置的变量, 只是普通的一个变量名称而已。为什么通过这样处理,就能实现输出重定向呢?

于是只能google出stackoverflow答案 : https://stackoverflow.com/questions/6472102/redirecting-i-o-in-php

fclose(STDIN);fclose(STDOUT);fclose(STDERR);$STDIN = fopen("/tmp/some-named-pipe", "r");$STDOUT = fopen("/tmp/foo.out", "wb");$STDERR = fopen("/tmp/foo.err", "wb");

because when you close the standard input, output and error file descriptors, the first three new descriptors will become the NEW standard input, output and error file descriptors.

In my example here I redirected standard input to /dev/null and the output and error file descriptors to log files. This is common practice when making a daemon script in PHP.

解释说:

如果你关闭了标准输出,标准错误输出文件描述符,那么你打开的前三个文件描述符将成为新的标准输入、输出、错误的描述符。

使用$STDIN, $STDOUT纯粹是障眼法而已, 必须指定为全局变量,否则文件描述符将在函数执行完毕之后被释放。

利用这个特性,后台脚本运行时,就可以直接输出并被记录到相关的文件中,给我们跟踪程序带来极大的方便。

 

通过上面的答案再来理解resetStd方法

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

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

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

尝试从/dev/null读取数据,会立刻得到一个EOF。

顺便,类Unix系统中,0代表标准输入流(stdin),1代表标准输出流(stdout),2代表标准错误流(stderr)。
 
 

转载地址:http://fbvoo.baihongyu.com/

你可能感兴趣的文章
用substr()截取中文出现乱码的解决方法
查看>>
Java练习 SDUT-2400_高中数学?
查看>>
UGUI组件之InputField 组件简单笔记(输入栏 输入框 )
查看>>
java-随学随记之基础篇
查看>>
Linux 统计文件夹,文件数量的命令
查看>>
spring hibernate实现动态替换表名(分表)
查看>>
精通ArrayList,关于ArrayList你想知道的一切
查看>>
KeyStore和TrustStore
查看>>
iOS - WKWebView加载不受信任的https (因用到IP地址加端口号去请求数据)
查看>>
vs和vim
查看>>
基于socket套接字发送大文件示例
查看>>
hdu1247 Hat’s Words
查看>>
Druid 介绍及配置
查看>>
Daily Scrum- 12/23
查看>>
Daily Scrum – 1/12
查看>>
pyinstaller---将py文件打包成exe
查看>>
【Prince2科普】Prince2的七大原则(7)
查看>>
Git指令操作
查看>>
常用ODBC连接字符串
查看>>
Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错
查看>>