`
月影无痕
  • 浏览: 1003575 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP中STDIN, STDOUT, STDERR的重定向

阅读更多
<?php
function test(){
    $file = '/tmp/std.log';
    global $STDOUT, $STDERR;
    $handle = fopen($file, "a");
    if ($handle) {
        unset($handle);
        @fclose(STDOUT);
        @fclose(STDERR);
        $STDOUT = fopen($file, "a");
        $STDERR = fopen($file, "a");
    } else {
        throw new Exception('can not open stdoutFile ' . $file);
    }
}

test();
print_r($_SERVER);

 命令行下运行以上程序,将不会在控制台输出任何内容,输出内容将被重定向到批定的文件/tmp/std.log中,我第一次看到这个代码时,非常诧异,百思不得其解。

 

$STDOUT, $STDERR 这并不是内置的变量, 只是普通的一个变量名称而已。为什么通过这样处理,就能实现输出重定向呢?

 

万能的stackoverflow给出了答案:

 

 

http://stackoverflow.com/questions/937627/how-to-redirect-stdout-to-a-file-in-php

<?php
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('application.log', 'wb');
$STDERR = fopen('error.log', '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纯粹是障眼法而已, 必须指定为全局变量,否则文件描述符将在函数执行完毕之后被释放。

 

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

0
0
分享到:
评论

相关推荐

    Windows管道(Pipe)重定向stdout,stderr,stdin

    有时我们需要重定向stdout,stderr,stdin。比如:将输出写入文件,又或者我们要将命令行程序输出结果显示到Windows对话框中。源码示范如何在Windows中实现,封装了几个简单易用的函数。

    Console stdout、stdin、stderr Capture:使用C#接口,Matlab捕获Console executables程序-matlab开发

    它提供了一种使用 C# 函数重定向外部可执行文件的控制台输入和输出的方法。

    tty-command:执行带有漂亮输出日志记录的shell命令,并捕获stdout,stderr和退出状态

    将每个命令的stdin,stdout和stderr重定向到文件或字符串。 TTY :: Command为工具包提供了独立的命令执行组件。动机复杂的软件项目不仅仅是一个应用程序。 这些项目通常会产生数十个或数百个补充的独立脚本,这些...

    detach:分叉和分离当前过程

    stderr将子stderr重定向到此流。 stdin将其流重定向到子stdin。 close_fds关闭子对象中除stdio之外的所有文件描述符。 exclude_fds如果close_fds为True则不要关闭这些文件描述符。 daemonize -上下文管理器退出...

    Linux基础命令学习——重定向与管道符(五)

    标准输入重定向:stdin,文件描述符为0,默认从键盘输入; 标准输出重定向:stdout,文件描述符为1,默认输出到屏幕; 错误输出重定向:stderr,文件描述符为2,默认输出到屏幕; 输入重定向 1、使用重定向命令把...

    os-shell:用 LEXYACC 编写的 Linux shell

    环境变量扩展别名支持和检查无限别名扩展IO重定向:stdout、stderr、stdin都可以重定向管道支持任意数量的管道如果需要,“&”支持在后台完成程序与“*”和“?”匹配的通配符人物将错误打印到 stderr,并附上问题...

    Linux操作之输入输出重定向和管道

     Unix下使用标准输入stdin和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。这三个标准输入输出系统缺省与控制终端设备相联系在一起的。因此,在标准情况下,每个...

    Linux标准输入、输出和重定向

    标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

    详解python的几种标准输出重定向方式

    在Python中,文件对象sys.stdin、sys.stdout和sys.stderr分别对应解释器的标准输入、标准输出和标准出错流。在程序启动时,这些对象的初值由sys.__stdin__、sys.__stdout__和sys.__stderr__保存,以便用于收尾...

    Shell 管道及执行顺序分析

    1、基本概念 a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 0~9; b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2... f、在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 st

    Python 重定向及*、**探讨(python编程学习笔记)

    sys模块提供了python的标准输入(sys.stdin),标准输出(sys.stdout),错误流(sys.stderr)。print和input只是标准输出/输入流的接口。 # 标准输出例子 print('Hello stdout world') # 等价于 sys.stdout.write...

    genericmock:有用代码的通用位-开源

    通用模拟是一个旨在提供有用的代码段的项目。... 一点点代码:-重定向标准流(stdin,stdout,stderr)-可以访问程序的流-运行并行任务...。请访问Wiki了解详细信息:https://sourceforge.net/p/genericmock/wiki/家/

    shell常用重定向实例讲解

    每个打开的文件都会被分配一个文件描述符.stdin (键盘), stdout (屏幕), 和 stderr (错误消息输出到屏幕上)的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 文件描述符是文件系统为了跟踪...

    FourOneLab#way-to-unicorn#07-Shell重定向1

    0 是一个文件描述符,表示标准输入(stdin)1 是一个文件描述符,表示标准输出(stdout)2 是一个文件描述符,表示标准错误(stderr)在标准情况下

    shell 1filename重定向的含义和区别

    当初在shell中, 看到”&gt;&1″和”&gt;&2″始终不明白什么意思.经过在网上的搜索得以解惑.其实这是两种输出. 在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是: 0 是一个文件描述符,表示标准输入...

    2 lazy:当您太懒而无法键入完整命令时

    2lazy允许您为别名指定其他参数并与它们完全交互(stdout,stderr,stdin和退出代码被重定向),但是每次调用只能运行一个命令。基本用法首先,将2lazy.yml文件添加到您的项目中。 在这里您可以找到最少的例子。 ...

    sudoku:我尝试编写高性能的数独解算器生成器

    所有实用程序均设计为使用标准流( stdin , stdout , stderr )来允许输入/输出重定向。 数据可以从一个实用程序传递到另一个实用程序,因此解决单个Sudoku实例就像 echo ...

    Linux输入输出重定向详细使用说明

    /dev/stdin 0(缺省是键盘,为0时是文件或者其他命令的输出) 标准输入 &lt; &lt;&lt; 显示器 /dev/stdout 1(缺省是屏幕,为1时是文件) 标准输出 &gt; &gt;&gt; 显示器 /dev/stderr 2(缺省是屏幕,为2时是文件) 标准...

    神奇的shell命令行输入与输出功能介绍

    标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 我们以cat命令为例...

Global site tag (gtag.js) - Google Analytics