【问题标题】:fopen returns empty content for php://stdinfopen 返回 php://stdin 的空内容
【发布时间】:2019-09-20 07:18:30
【问题描述】:

我无法让 fopen 读取 PHP 中的内容流。没有抛出错误,内容始终为空字符串。

这是我的代码:

$contents='';
$handle = fopen("php://stdin", "r") or error_log('got some error');

while (!feof($handle)) {
    $contents .= fread($handle, 8192);
}
fclose($handle);
error_log($contents);

然后我从 Postman 向我的服务器 url 发送 POST 请求,例如

发布http://myserverurl/index.php

我确实根据上述请求发送了帖子数据,我也尝试过表单编码、二进制和原始数据。

但是 error_log 将空字符串记录到日志文件中,这意味着 fopen 确实有效但它得到了空内容。

我也检查了 php.ini 设置,并且 allow_url_fopen 设置也为真。

我正在使用 PHP7.1-fpm 在 nginx 上对此进行测试。我最近从 Apache 和 PHP 5.6 切换到 nginx 和 php7.1-fpm,但它停止了工作。

在 Apache 和 PHP5.6 上运行良好。

这里有什么问题? 任何帮助将不胜感激。

【问题讨论】:

    标签: php nginx fpm


    【解决方案1】:

    PHP的默认流可能存在一些误解。

    • 如果您将 PHP 脚本作为命令运行,CLI 界面将为您提供php://stdin

    • 如果您在 web 服务器/cgi/php-fpm 环境中运行 PHP 脚本,则根本没有 php://stdin。您将获得 php://input 流(用于 POST 正文)。

    参考:Supported Protocol and Wrapper

    【讨论】:

    • 是的,实际上我将其作为 CLI 命令运行。基本上我已经在 postfix 上设置了一个钩子来将传入的电子邮件传递给 php 脚本,这样每当我收到一封电子邮件时,就会执行一个 php 脚本。在 CLI 脚本中,当我使用 php://stdin 时,内容为空。不过,感谢您对此的上述澄清。但是,当 CLI 脚本尝试使用 php://stdin 访问内容流时,您能否告诉 php://stdin 何时有空内容?相同的代码适用于 apache,但在服务器操作系统升级后停止工作
    • 您使用的是什么操作系统?是否可能是 OS / Postfix 升级问题?
    • 当前的操作系统设置是带有 Nginx 和 PHP7.1-FPM 的 Ubuntu 16.04... 早期的设置是带有 Apache2 和 PHP 5.6 的 Ubuntu 14.04... 我刚刚在操作系统上进行了“do-release-upgrade”这意味着我没有再次安装 postfix 并且旧配置适用于我的 postfix,只是这个电子邮件挂钩不起作用
    • echo "hello world" | php your-script.php 返回什么?
    • 做了“你好世界”| php your-script.php 并且它确实将内容记录到日志文件中,以确认它是后缀问题。非常感谢你的帮助。您知道后缀不将内容发送到脚本会出现什么问题吗?如果你说,我可以发布我的 main.cf 配置。
    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多