【问题标题】:Alternative way to read raw I/O stream in PHP在 PHP 中读取原始 I/O 流的替代方法
【发布时间】:2011-06-20 01:11:33
【问题描述】:

我正在尝试寻找替代阅读 php://input 的方法。我使用它从 CURL PUT 获取 XML 数据。

我通常这样做:

$xml = file_get_contents('php://input');

但是,我在 Windows 上使用 file_get_contents() 时遇到了一些问题。

是否有替代方案,可能使用fopen()fread()

【问题讨论】:

  • 你绝对应该使用 fopen 等等,file_get_contents 只是这些的包装。 Fopen 是您可能获得的用于处理文件描述符的最 low 级别的 php 代码
  • 使用 file() 将为您返回一个数组,使用 file_get_contents() 将为您返回一个字符串, fopen 将打开文件但您需要一个协议处理程序 (php://) 而您有一个.. 尝试指定文件的扩展名 --- 像这样 --> fopen("c:\\folder\\resource.txt", "r");
  • @Antwan:谢谢。你能指导我举一个我怎么做的例子吗?!
  • @Fernando:我不是在尝试读取文件,而是在尝试将 IO 流的内容读取为字符串。

标签: php file-io io


【解决方案1】:

是的,你可以这样做:

$f = fopen('php://input', 'r');
if (!$f)  die("Couldn't open input stream\n");
$data = '';
while ($buffer =  fread($f, 8192)) $data .= $buffer;
fclose($f);

但是,您必须问自己的问题是,为什么 file_get_contents 不能在 Windows 上工作?因为如果它不起作用,我怀疑fopen 是否适用于同一个流......

【讨论】:

  • 这行得通,但如果我正在“PUTting”(可以这么说)的 XML 数据大于 8192 字节,我不应该担心吗?!
  • 我相信 file_get_contents() 问题是一些 Windows 错误。
  • 这就是循环的原因。如果您查看fread 的文档,您会发现它不会总是读取整个请求的长度。因此,相反,它通常被视为更好的做法,在阅读时循环以弥补它没有阅读整个内容的情况(它更健壮)......
【解决方案2】:

好的。我想我找到了解决办法。

$f = @fopen("php://input", "r");
$file_data_str = stream_get_contents($f);
fclose($f);

另外,有了这个,我没有义务输入文件大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    相关资源
    最近更新 更多