WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

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)。

原文地址:https://www.cnblogs.com/loveyouyou616/p/8880769.html

时间: 2024-10-12 06:58:15

WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)的相关文章

jQuery源码分析系列(33) : AJAX中的前置过滤器和请求分发器

jQuery1.5以后,AJAX模块提供了三个新的方法用于管理.扩展AJAX请求,分别是: 1.前置过滤器 jQuery. ajaxPrefilter 2.请求分发器 jQuery. ajaxTransport, 3.类型转换器 ajaxConvert 源码结构: jQuery.extend({ /** * 前置过滤器 * @type {[type]} */ ajaxPrefilter: addToPrefiltersOrTransports(prefilters), /** * 请求分发器 *

workerman源码分析之启动过程

PHP一直以来以草根示人,它简单,易学,被大量应用于web开发,非常可惜的是大部分开发都在简单的增删改查,或者加上pdo,redis等客户端甚至分布式,以及规避语言本身的缺陷.然而这实在太委屈PHP了.记得有一次问walker,PHP能做什么?他说:什么都能做啊!当时我就震惊了,这怎么可能...直到后来一直看workerman源码,发现PHP原来有很多不为大家所知的诸多用法,包括多进程(还有线程).信号处理.namespace等等一大堆特点.而workerman正是这些很少被使用特性(或者说扩展

Hbase源码分析:Hbase UI中Requests Per Second的具体含义

让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大概知道它是指每秒Region Server的请求数,但是具体是怎么算的呢,不清楚.于是决定通过研究源码深入了解下.下面便记录了这个过程. 1,先在代码库中全局搜索Requests Per Second关键字,发现在几个jamon结尾的文件找到了.于是google了一下,这个到底是什么东东,发现是一个模板引擎. 2,查看RegionServerListTmpl.jamon内容,需要传入参

【ListViewJSON】【com.demo.app.common】【ImageUtils】源码分析及其在工程中作用

首先源码: package com.demo.app.common; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I

[ListViewJSON][com.demo.app][AppContext]源码分析及其在工程中的作用

首先插入AppContext源码 package com.demo.app; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InvalidClassException; import java.io.Object

【ListViewJSON】【com.demo.app.api】【ApiClient】源码分析及其在工程中作用

源码如下: package com.demo.app.api; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Map; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler; import

【ListViewJSON】【com.demo.app.common】【FileUtils】源码分析及其在工程中作用

源码如下: package com.demo.app.common; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.content.Context; imp

【ListViewJSON】【com.demo.app】【AppManager】源码分析及其在工程中作用

AppManager.java源码如下: package com.demo.app; import java.util.Stack; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; /** * 应用程序Activity管理类:用于Activity管理和应用程序退出 * @version 1.0 * @created 2012-3-21 */ publi

【ListViewJSON】【com.demo.app.common】【BitmapManager】源码分析及其在工程中作用

首先源码如下: package com.demo.app.common; import java.io.File; import java.io.IOException; import java.lang.ref.SoftReference; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import java.util.con