搜索
首页php教程php手册PHP –with-curlwrappers 导致的问题

有如下代码: $opts = array( 'http' = array( 'method' = "GET", 'header' = "Accept-language: en\r\n" . "Cookie: foo=bar\r\n" . "User-Agent: MyAgent/1.0\r\n" ));$context = stream_context_create($opts);$result = file_get_contents('http://www.e

有如下代码:

<code>$opts = array(
  'http' => array(
    'method' => "GET",
    'header' => "Accept-language: en\r\n" . 
                "Cookie: foo=bar\r\n" . 
                "User-Agent: MyAgent/1.0\r\n"
  )
);
$context = stream_context_create($opts);
$result = file_get_contents('http://www.example.com/', false, $context);
var_dump($result);
</code>

正常情况下以上应该输出www.example.com返回的内容,但是实际上得到的结果是空字符串,遂进行如下测试:

<code>$file = fopen('http://www.example.com/', 'rb');
var_dump(stream_get_meta_data($file));
/*
输出结果:
array(10) {
  ["wrapper_data"]=>
  array(2) {
    ["headers"]=>
    array(0) {
    }
    ["readbuf"]=>
    resource(38) of type (stream)
  }
  ["wrapper_type"]=>
  string(4) "cURL"
  ["stream_type"]=>
  string(4) "cURL"
  ["mode"]=>
  string(2) "rb"
  ["unread_bytes"]=>
  int(0)
  ["seekable"]=>
  bool(false)
  ["uri"]=>
  string(23) "http://www.example.com/"
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
}*/
</code>

输出的结果中,wrapper_type为cURL,而且wrapper_data为空,这是不正常的,正常情况下wrapper_type应为http,wrapper_data数组中应该包含响应头信息。google之,发现这个现象与--with-curlwrappers这个编译选项有关,遂查看PHP编译参数:

<code>$ php -i | grep configure
Configure Command =>  './configure' '--prefix=/usr/local/php' '--with-config-file-path=/usr/local/php/etc' '--with-mysql=/usr/local/mysql' '--with-mysqli=/usr/local/mysql/bin/mysql_config' '--with-iconv-dir=/usr/local' '--with-zlib' '--with-libxml-dir=/usr' '--enable-xml' '--enable-bcmath' '--enable-shmop' '--enable-sysvsem' '--enable-inline-optimization' '--with-curl' '--with-curlwrappers' '--enable-mbregex' '--enable-fpm' '--enable-mbstring' '--with-mcrypt' '--with-openssl' '--with-mhash' '--enable-pcntl' '--enable-sockets' '--with-xmlrpc' '--enable-zip' '--enable-soap' '--enable-bcmath'
</code>

--with-curlwrappers被启用了,问题应该出在这里,查看一下这个编译选项的用处:

<code>$ ./configure --help | grep curlwrappers
  --with-curlwrappers     EXPERIMENTAL: Use cURL for url streams
</code>

看来--with-curlwrappers这个编译选项是用来处理url stream的,不过前面有个硕大的EXPERIMENTAL字样,还在试验中。 现有的解决方法是重新编译PHP,去掉「--with-curlwrappers」:

<code>$ cd /path/to/php-5.3.6
$ make clean
$ ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir=/usr/local --with-zlib \
--with-libxml-dir=/usr --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem \
--enable-inline-optimization --with-curl --enable-mbregex --enable-fpm  --enable-mbstring --with-mcrypt \
--with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip \
--enable-soap --enable-bcmath -with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf
$ make && make install
$ cd /usr/local/php/bin
# 删除旧的PHP binary文件,并用新的进行替换,Mac下重新编译后会产生php.dSYM文件,其他Linux系统请自行处理
$ rm php && mv php.dSYM php 
</code>

完成后,再做个测试:

<code>$file = fopen('http://www.example.com/', 'rb');
var_dump(stream_get_meta_data($file));
/*
结果如下:
array(10) {
  ["wrapper_data"]=>
  array(12) {
    [0]=>
    string(18) "HTTP/1.0 302 Found"
    [1]=>
    string(46) "Location: http://www.iana.org/domains/example/"
    [2]=>
    string(13) "Server: BigIP"
    [3]=>
    string(17) "Connection: close"
    [4]=>
    string(17) "Content-Length: 0"
    [5]=>
    string(15) "HTTP/1.1 200 OK"
    [6]=>
    string(35) "Date: Sun, 18 Mar 2012 06:12:27 GMT"
    [7]=>
    string(29) "Server: Apache/2.2.3 (CentOS)"
    [8]=>
    string(44) "Last-Modified: Wed, 09 Feb 2011 17:13:15 GMT"
    [9]=>
    string(21) "Vary: Accept-Encoding"
    [10]=>
    string(17) "Connection: close"
    [11]=>
    string(38) "Content-Type: text/html; charset=UTF-8"
  }
  ["wrapper_type"]=>
  string(4) "http"
  ["stream_type"]=>
  string(14) "tcp_socket/ssl"
  ["mode"]=>
  string(2) "rb"
  ["unread_bytes"]=>
  int(1225)
  ["seekable"]=>
  bool(false)
  ["uri"]=>
  string(23) "http://www.example.com/"
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
}
*/
</code>

wrapper_type变成了http,wrapper_data也被填充了,一切恢复正常。所以一条结论:慎用--with-curlwrappers

参考:

http://cn.php.net/manual/en/function.stream-context-create.php#99353 https://www.facebook.com/note.php?note_id=290180466652

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器