首页 > 解决方案 > fopen 为 php://stdin 返回空内容

问题描述

我无法让 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 完全兼容。

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

标签: phpnginxfpm

解决方案


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

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

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

参考:支持的协议和包装器


推荐阅读