`
月影无痕
  • 浏览: 1008869 次
  • 性别: 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
分享到:
评论

相关推荐

    Go-websocketd把命令行的输出stdout和stderr重定向为一个websocket服务的工具

    本文将深入探讨名为`websocketd`的工具,这是一个用Go语言开发的小型命令行工具,它能将任何命令行程序的输出(stdout和stderr)实时地通过WebSocket服务进行传输。 首先,让我们理解`websocketd`的工作原理。`...

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

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

    重定向标准输出STDOUT的demo

    首先,我们需要理解操作系统是如何处理标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)的。这三个流默认与终端交互,但通过重定向,我们可以使它们连接到文件、管道或其他进程。 在Unix/Linux系统中,...

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

    在IT领域,尤其是在软件开发中,Console stdout、stdin和stderr是三个重要的标准流,它们分别代表标准输出、标准输入和标准错误。这些流是程序与操作系统进行交互的基础,尤其是在命令行环境中。本篇文章将深入探讨...

    一文学会重定向.zip

    9. **历史记录重定向**:在shell脚本中,`exec`命令可以改变已打开的文件描述符,比如将stdout和stderr重定向到日志文件,然后执行命令:`exec &gt; log.txt 2&gt;&1`。 10. **重定向到/dev/null**:这个特殊的设备会丢弃...

    文件重定向

    4. `2&gt;`:将stderr重定向到指定文件,可以单独处理错误信息。 5. `2&gt;&1`:将stderr与stdout合并,一同输出。 例如,命令`ls &gt; filelist.txt`会将当前目录下的文件列表保存到filelist.txt中,而`ls -l &gt;&gt; filelist....

    vs2008,控制台程序输入输出重定向

    在编程领域,尤其是在C++环境中,控制台程序的输入输出重定向是一项重要的技术,它允许我们改变默认的输入(stdin)和输出(stdout)流,将它们指向不同的源或目标,比如文件、内存缓冲区甚至是网络连接。...

    控制台程序输出重定向

    2. **捕获标准流**:在`CWinApp`的`InitInstance`方法中,获取`stdin`, `stdout` 和 `stderr` 的原始文件描述符,然后使用`freopen`函数重定向到自定义的文件流。 ```cpp FILE* old_stdin = freopen("NUL:", "r",...

    linux下输入输出重定向.docx

    在 IO 重定向中,我们需要了解基本概念,包括 FD(File Descriptor)、STDIN、STDOUT 和 STDERR 等。FD 是一个文件描述符,shell 的 FD 通常为 10个,即 0~9。在 IO 重定向中,我们可以使用 &gt;、&lt;、&gt;&gt; 等操作符来...

    linux中的重定向.pdf

    1. 标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)是Linux系统中的三个主要数据流。其中,stdin的文件描述符是0,stdout是1,stderr是2。在命令行中,通常使用数字后跟"&gt;"或"来指定数据流的来源和...

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

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

    stdout.txt

    从给定的文件信息来看,主要涉及的知识点集中在C++编程中的文件重定向、标准输入输出流(stdin, stdout, stderr)的管理以及Windows环境下的多线程编程。以下是对这些知识点的详细解析: ### 文件重定向与标准流...

    UNIX编程中的dup和dup2说明

    在UNIX 编程中,dup 和 dup2 函数经常用来实现进程间通信,例如在命令行管道中,使用 dup 函数和 dup2 函数来重定向进程的 stdin、stdout 和 stderr,以实现数据的传输和处理。 在命令行管道中, Dup 函数和 dup2 ...

    重定向程序设计

    在高级语言如Python中,重定向可以通过操作`sys.stdin`、`sys.stdout`和`sys.stderr`对象实现。例如,用文件替换标准输出: ```python import sys sys.stdout = open('output.txt', 'w') ``` 这段代码将输出重定向...

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

    `sys.stdin`、`sys.stdout`和`sys.stderr`是Python解释器与外界交互的三个重要对象。它们分别代表标准输入(用户输入)、标准输出(程序正常输出)和标准错误(程序异常输出)。在程序启动时,`sys.__stdin__`、`sys...

    Linux下重定向详解

    - **处理顺序**:在I/O重定向中,标准输出和标准错误输出的管道会优先准备,然后再从标准输入读取数据。 - **管道** (`|`):允许上一个命令的标准输出作为下一个命令的标准输入。 - **tee命令**:可以在不影响原本I/...

    detach:分叉和分离当前过程

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

    redirect.zip

    在操作系统中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是三个预定义的文件描述符,通常与键盘、显示器关联。本文将深入探讨"redirect.zip"中的知识点,包括Windows下的IO重定向、原理以及相关的...

    Linux重定向_All.pdf

    在Linux中,每个进程都有三个默认的文件描述符:0代表标准输入(stdin),1代表标准输出(stdout),2代表标准错误(stderr)。通常,当我们使用shell执行命令时,输入来自键盘(stdin),输出显示在屏幕(stdout)...

Global site tag (gtag.js) - Google Analytics