【问题标题】:Method of raw data via php wrappers? Throws an error通过php包装器获取原始数据的方法?引发错误
【发布时间】:2013-05-22 11:49:15
【问题描述】:

我正在试验这个包装器,特别是从 HTTP 请求中提取原始数据。关于 cURL:

Protocol php not supported or disabled in libcurl

查看了我的 phpinfo,这是支持的:

dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp 

PHP 中是否有办法(如果可能,使用此包装器)从任意请求中提取原始数据(无需通过配置文件将 php 添加到该列表中)?

【问题讨论】:

    标签: php linux windows apache


    【解决方案1】:

    可能更好用:

    $data = file_get_contents("php://input");
    

    由于 cURL 建立新连接,因此可能无法访问与请求一起发送的数据。

    【讨论】:

    • 啊是的,抱歉 - 由于 cURL 无法访问当前请求,我会说它无法访问数据。
    • 另一件事是 cURL 不太可能比 file_get_contents 等工作,因为它需要系统中的其他软件和使用 cURL 支持编译的 php。有时您也可以使用:$HTTP_RAW_POST_DATA,但这也需要在 php.ini 中启用。
    【解决方案2】:

    PHP DOC 很清楚 http://php:// 之间存在很大差异,您的问题就像问为什么 chrome://firefox 中不起作用

    PHP 提供了许多杂项 I/O 流,允许访问 PHP 自己的输入和输出流、标准输入、输出和错误文件描述符、内存中和磁盘支持的临时文件流,以及可以操作的过滤器读取和写入其他文件资源。

    php://stdin, php://stdout and php://stderr
    

    php://stdin、php://stdout 和 php://stderr 允许直接访问 PHP 进程的相应输入或输出流。该流引用了一个重复的文件描述符,因此如果您打开 php://stdin 然后关闭它,您只会关闭描述符的副本 - STDIN 引用的实际流不受影响。请注意,在 PHP 5.2.1 之前,PHP 在这方面表现出错误的行为。建议您简单地使用常量 STDIN、STDOUT 和 STDERR,而不是使用这些包装器手动打开流。

    这里是一个典型的用法

    $temp = fopen("php://temp", "r+");
    
    $curl = curl_init("__YOUR__URL");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_FILE, $temp);
    curl_exec($curl);
    curl_close($curl);
    
    fseek($temp, 0);
    while(! feof($temp)) {
        echo fgets($temp);
    }
    fclose($temp);
    

    【讨论】:

      猜你喜欢
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2011-05-21
      相关资源
      最近更新 更多