- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<?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");
echo "Hello, World!"; // goes to /tmp/foo.out, implied STDOUT
fscanf($STDIN, "%s\n", $top_secret); // explicit $STDIN, cant use STDIN
?>
为什么重定向到新的 STDOUT 是隐式的,而从新的 STDIN 的重定向必须显式地发生?
最佳答案
原来STDIN、STDOUT和STDERR在PHP中是系统常量。它们在 PHP 初始化时填充了标准输入、输出和错误的文件描述符资源。
php.net 文档描述了以下关于常量资源的内容:
The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values. It is possible to define resource constants, however it is not recommended and may cause unpredictable behavior.
当 fclose(STDOUT)
被调用时,文件描述符资源被关闭并与 STDOUT 常量分离。与常量的默认行为相反,STDOUT 常量已更改。
当字符串像 echo "Hello, World!"
一样回显时,PHP 不会使用 STDOUT 常量,但会实时查询当前的“标准输出”文件描述符从操作系统。此外,一旦关闭,STDOUT 常量本身将变得不可用。即使像 fwrite(STDOUT, "hello")
这样的语句也不 工作。
当为标准输出配置一个新的文件描述符时,这个新的文件描述符被方便地放入$STDOUT
。请注意,这是一个变量而不是常量。根据定义,在 PHP 中重新定义常量是不可能的,系统常量 STDOUT 也不异常(exception)。当前无法将新文件描述符重新分配给 STDOUT 常量。
最终,为了让这项工作更直观,PHP 团队应该考虑制作方便的函数来重新分配这些文件描述符,或者至少让系统常量在自动评估实际文件的意义上更像“魔术常量”描述符。
关于php - 在 PHP 中重定向 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6472102/
我是一名优秀的程序员,十分优秀!