gpt4 book ai didi

php - 在 PHP 中重定向 I/O

转载 作者:行者123 更新时间:2023-12-03 23:04:16 25 4
gpt4 key购买 nike

<?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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com