В большинстве случаев, чтобы получить удалённую страницу пользуются такими функциями:
$content = file_get_contents("http://conture.by"); /* помещает в $content всю загруженную страницу */ $lines = file("http://conture.by"); /* создаёт массив строк из исходной страницы */ readfile("http://conture.by"); /* запишет исходный файл в буфер вывода */
Большой минус этих функций в том, что они, по сути, не имеют никакой гибкости в плане обработки ошибок, а также невозможность их взаимодействия с Cookie, аутентификацией, передачей файлов и отправкой форм.
cURL — это библиотека, которая призвана помочь программистам с вышеперечисленными недостатками.
Базовая структура использования библиотеки cURL состоит из четырёх основных шагов:
// 1. инициализация $ch = curl_init(); // 2. указываем параметры, включая url curl_setopt($ch, CURLOPT_URL, "http://conture.by"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. получаем HTML в качестве результата $output = curl_exec($ch); /* 3.1 дополнительный шаг. Получаем массив с результатами выполнения: “url”, “content_type”, “http_code”, “header_size”, “request_size”, “filetime”, “ssl_verify_result”, “redirect_count”, “total_time”, “namelookup_time”, “connect_time”, “pretransfer_time”, “size_upload”, “size_download”, “speed_download”, “speed_upload”, “download_content_length”, “upload_content_length”, “starttransfer_time”, “redirect_time” */ $info = curl_getinfo($ch); // 4. закрываем соединение curl_close($ch);
Выполнить POST запрос к странице при помощи cURL:
$url = "http://conture.by/post"; $post_data = array ( "one" => "first", "two" => "second", "three" => "third" ); $ch = curl_init(); /* иницианализация */ curl_setopt($ch, CURLOPT_URL, $url); /* добавляем в опции URL назначения */ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); /* 0 - выведет в браузер; 1 - возвратит ответ */ curl_setopt($ch, CURLOPT_POST, 1); /* указываем, что у нас POST запрос */ curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); /* добавляем переменные */ $output = curl_exec($ch); /* выполняем запрос */ curl_close($ch); /* закрываем */ echo $output; /* выводим на экран */
Передать файл с нашего сервера на удалённый:
$url = "http://localhost/upload_output.php"; /* понятное дело, что этот скрипт должен принимать файлы */ $post_data = array ( "foo" => "bar", // файл, который необходимо загрузить "upload" => "@C:/test.zip" ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;
Пример, как осуществить множественный cURL:
// создаём несколько cURL ресурсов $ch1 = curl_init(); $ch2 = curl_init(); // указываем URL и другие параметры curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //создаём множественный cURL обработчик $mh = curl_multi_init(); //добавляем несколько обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //выполнение do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } //закрытие curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
HTTP Аутентификация при помощи cURL
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // то сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
Загрузка файла по FTP с помощью cURL:
// открываем файл $file = fopen("/path/to/file", "r"); // в url должно быть следующее содержание $url = "ftp://username:password@mydomain.com:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // указывам ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch);
Выполнить запрос к странице через proxy с помощью cURL:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем адрес curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // если необходимо предоставить имя пользователя и пароль curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output = curl_exec($ch); curl_close ($ch);
Авторизация на сайте с использованием COOKIE:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://example.com/personal/login.phtml"); /* Переходим на страницу, на которой нужно пройти процедуру авторизации */ curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "login=mylog&psw=mypassword"); curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt'); $result = curl_exec($ch); curl_setopt($ch, CURLOPT_URL, "http://example.com"); /* Теперь заходите на сайт как авторизованный пользователь – в данном случае нужно вместо example.com указать URL страницы, на которую может попасть только авторизованный пользователь */ curl_setopt($ch, CURLOPT_POST, 0); /* Также необязательное действие, но я указал этот параметр – устанавливаю CURLOPT_POST в нуль, ведь теперь мне не нужно передавать данные методом POST */ curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt'); /* Внимание! Здесь третий параметр (адрес текстового файла с куками) должен быть точно таким же, как и при использовании CURLOPT_COOKIEJAR, иначе процедура авторизации работать не будет, так как требуемые серверу Куки не передадутся */ $result = curl_exec($ch); curl_close($ch); echo $result;