Php curl сбросить кэш
Почему cURL?
На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые PHP функции вместо cURL:
Однако данные функции не имеют фактически никакой гибкости и содержат огромное количество недостатков в том, что касается обработки ошибок и т.д. Кроме того, существуют определенные задачи, которые вы просто не можете решить благодаря этим стандартным функциям: взаимодействие с cookie, аутентификация, отправка формы, загрузка файлов и т.д.
cURL - это мощная библиотека, которая поддерживает множество различных протоколов, опций и обеспечивает подробную информацию о URL запросах.
Базовая структура
Прежде чем мы двинемся дальше к более сложным примерам, давайте рассмотрим базовую структуру cURL запроса в PHP. Существует четыре основных шага, которые нужно учитывать в каждом скрипте:
- Инициализация
- Назначение параметров
- Выполнение и выборка результата
- Освобождение памяти
Проверка Ошибки
Вдобавок, вы также можете использовать условные операторы для проверки выполнения операции на успех:
Тут прошу отметить для себя очень важный момент: мы должны использовать “=== false” для сравнения, вместо “== false”. Для тех, кто не в курсе, это поможет нам отличать пустой результат от булевого значения false, которое и будет указывать на ошибку.
Получение информации
Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.
Возвращаемый массив содержит следующую информацию:
Обнаружение перенаправления в зависимости от браузера
В этом первом примере мы напишем код, который сможет обнаружить перенаправления URL, основанные на различных настройках браузера. Например, некоторые веб-сайты перенаправляют браузеры сотового телефона, или любого другого устройства.
Сначала мы указываем список URL сайтов, которые будем проверять. Точнее, нам понадобятся адреса данных сайтов. Далее нам необходимо определить настройки браузера, чтобы протестировать каждый из этих URL. После этого мы воспользуемся циклом, в котором пробежимся по всем полученным результатам.
Когда вы запустите данный код, то должны будете получить примерно следующий результат:
Создание POST запроса на определённый URL
При формировании GET запроса передаваемые данные могут быть переданы на URL через “строку запроса”. Например, когда Вы делаете поиск в Google, критерий поиска располагаются в адресной строке нового URL:
Для того чтобы сымитировать данный запрос, вам не нужно пользоваться средствами cURL. Если лень вас одолевает окончательно, воспользуйтесь функцией “file_get_contents()”, для того чтобы получить результат.
Мы можем написать PHP скрипт, который может сымитировать этот вид URL запроса. Сначала давайте создадим простой файл для принятия и отображения POST данных. Назовём его post_output.php:
Затем мы создаем PHP скрипт, чтобы выполнить cURL запрос:
При запуске данного скрипта вы должны получить подобный результат:
Таким образом, POST запрос был отправлен скрипту post_output.php, который в свою очередь, вывел суперглобальный массив $_POST, содержание которого мы получили при помощи cURL.
Загрузка файла
Загрузка файла будет выглядеть практически так же, как и обычный POST запрос, так как все формы загрузки файла работают только с ним.
А вот и код скрипта, который выполняет указанный выше функционал:
Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:
Множественный cURL
Одной из самых сильных сторон cURL является возможность создания "множественных" cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.
Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.
В следующем цикле мы проверяем условие, пока переменная $active = 'true'. Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно 'true', до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение 'блокируется', пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.
А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей.
Проверяем ссылки в WordPress
Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 404, после чего предоставит нам подробнейший отчёт.
Сразу же скажу, что это не пример создания плагина для WordPress. Это всего на всего хороший полигон для наших испытаний.
Давайте же наконец начнём. Сначала мы должны сделать выборку всех ссылок из базы данных:
Сначала мы формируем конфигурационные данные для взаимодействия с базой данных, далее пишем список доменов, которые не будут участвовать в проверке ($excluded_domains). Также мы определяем число, характеризующее количество максимальных одновременных соединений, которые мы будем использовать в нашем скрипте ($max_connections). Затем мы присоединяемся к базе данных, выбираем посты, которые содержат ссылки, и накапливаем их в массив ($url_list).
Следующий код немного сложен, так что разберитесь в нём от начала до конца:
Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии.
Я использовал данный скрипт на своем блоге (с некоторыми неработающими ссылками, которые добавил нарочно для того, чтобы протестировать его работу) и получил следующий результат:
В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее.
Пару слов о других полезных опциях cURL
FTP загрузка
В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.
Заключение
Сегодня мы познакомились с тем, как можно применить библиотеку cURL в своих корыстных целях. Я надеюсь, что вам понравилась данная статья.
Спасибо! Удачного дня!
5 последних уроков рубрики "PHP"
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Эти функции были введены в PHP 4.0.2.
curl_init
curl_init - инициализирует CURL-сессию.
Описание
resource curl_init([string url])
Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для использования в функциях curl_setopt(), curl_exec() и curl_close(). Если необязательный параметр url предоставлен, то опция CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции curl_setopt().
curl_setopt
curl_setopt - устанавливает опции для CURL-трансфера/transfer.
Описание
bool curl_setopt (resource ch, string option, mixed value)
Функция curl_setopt() устанавливает опции для CURL-сессии, идентифицируемой параметром ch. Параметр option является опцией, которую вы хотите установить, а value это значение опции option.
Параметр value должен быть long для следующих опций (специфицированных параметром option):
Параметр value должен быть строкой для следующих значений параметра option:
- CURLOPT_URL: Это URL, который PHP должен получать. Вы можете также устанавливать эту опцию при инициализации сессии функцией curl_init().
- CURLOPT_USERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для использования при соединении.
- CURLOPT_PROXYUSERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для соединения с HTTP-прокси.
- CURLOPT_RANGE: Передаёт специфицированный вами диапазон. Он должен быть в формате "X-Y", где X или Y могут отсутствовать. HTTP-трансферы поддерживают также различные интервалы, разделённые запятыми, как, например, X-Y,N-M.
- CURLOPT_POSTFIELDS: Передаёт строку, содержащую полные данные для передачи операцией HTTP "POST".
- CURLOPT_REFERER: Передаёт строку, содержащую "referer/ссылающийся" header, используемый в HTTP-запросе.
- CURLOPT_USERAGENT: Передаёт строку, содержащую "user-agent" header, используемый в HTTP-запросе.
- CURLOPT_FTPPORT: Передаёт строку, содержащую значение, которое будет использоваться для получения IP-адреса для инструкции ftp "POST". POST-инструкция указывает удалённому серверу: соединиться со специфицированным IP-адресом. Строка может быть обычным IP-адресом, hostname/именем хоста, именем сетевого интерфейса (под UNIX), или просто обычным "-", используемым для системного IP-адреса по умолчанию.
- CURLOPT_COOKIE: Передаёт строку с содержимым куки/cookie, установленным в HTTP header"е.
- CURLOPT_SSLCERT: Передаёт строку, содержащую filename форматированного сертификата PEM.
- CURLOPT_SSLCERTPASSWD: Передаёт строку, содержащую password, необходимый для работы сертификата CURLOPT_SSLCERT.
- CURLOPT_COOKIEFILE: Передаёт строку, содержащую имя файла с данными куки. Этот cookie-файл может иметь формат Netscape, или содержать обычные шапки/headers в HTTP-стиле, забитые в файл.
- CURLOPT_CUSTOMREQUEST: Передаёт строку, используемую вместо GET или HEAD при выполнении HTTP-запроса. Это делается для выполнения DELETE или других, более скрытых HTTP-запросов. Верными значениями являются GET, POST и так далее; то есть не вводите здесь полную строку HTTP-запроса. Например, ввод "GET /index.html HTTP/1.0" будет некорректным. (не делайте это, если не уверены, что ваш сервер поддерживает эту команду.)
- CURLOPT_PROXY: Передаёт имя HTTP-прокси туннельным запросам.
- CURLOPT_INTERFACE: Передаёт имя исходящего сетевого интерфейса для использования. Это может быть имя интерфейса, IP-адрес или имя хоста. ( curl_setopt($ch, CURLOPT_INTERFACE, $extip) )
- CURLOPT_KRB4LEVEL: Передаёт KRB4 (Kerberos 4) уровень секретности. Это любая из следующих строк (в порядке от менее до более мощной): "clear", "safe", "confidential", "private".
Если эта строка не совпадает с какой-либо из указанных, то используется "private". Если вы установите здесь NULL, это отключит KRB4-безопасность. KRB4-безопасность работает в настоящее время только с транзакциями FTP. - CURLOPT_HTTPHEADER: Передаёт массив полей HTTP-header"а для установки.
- CURLOPT_QUOTE: Передаёт массив FTP-команд для выполнения на сервере до выполнения FTP-запроса.
- CURLOPT_POSTQUOTE: Передаёт массив FTP-команд для выполнения на сервере после выполнения FTP-запроса.
Следующие опции ожидают дескриптора файла, который получается с помощью функции fopen():
- CURLOPT_FILE: Файл, куда должен быть помещён вывод вашего трансфера, по умолчанию это STDOUT.
- CURLOPT_INFILE: Файл, из которого приходит ввод вашего трансфера.
- CURLOPT_WRITEHEADER: Файл для записи header-части вывода.
- CURLOPT_STDERR: Файл для записи ошибок, вместо stderr.
Параметр value должен быть функцией следующего вида long write_callback (resource ch, string data) для следующих значений параметра option:
Параметр value должен быть функцией следующего вида string read_callback (resource ch, resource fd, long length)<> для следующих значений параметра option:
curl_exec
curl_exec - выполняет CURL-сессию.
Описание
bool curl_exec (resource ch)
Эта функция должна вызываться после того, как вы инициализируете сессию CURL и все опции этой сессии уже установлены. Её назначение в том, чтобы просто выполнить предопределённую CURL-сессию (заданную в параметре ch).
curl_close
curl_close - закрывает CURL-сессию.
Описание
void curl_close ( resource ch)
Эта функция закрывает сессию CURL и освобождает все ресурсы. CURL-дескриптор ch также удаляется.
curl_errno
curl_errno - возвращает целое число, содержащее номер последней ошибки.
Описание
int curl_errno ( resource ch)
curl_error
curl_error - возвращает строку содержащую номер последней ошибки для текущей сессии.
Описание
string curl_error (resource ch)
curl_getinfo
curl_getinfo - получает информацию, касающуюся специфической передачи/transfer.
Описание
string curl_getinfo (resource ch, int opt)
Возвращает информацию о последней операции, opt может быть одной из следующих констант:
При вызове без необязательного аргумента opt возвращается ассоциативный массив со следующими индексами, которые соответствуют значениям аргумента opt:
- "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"
Пример использования curl_getinfo:
Пример использования curl_getinfo:
curl_version
curl_version - возвращает версию текущей CURL.
Описание
string curl_version (void)
Функция curl_version() возвращает строку с текущей версией CURL.
Предопределённые константы
Эти константы определены данным расширением и будут доступны только в том случае, если либо вкомпилированы в РНР, либо динамически загружены на этапе прогона.
Примеры
После того как вы скомпилировали PHP с поддержкой CURL, вы можете начать использовать curl-функций. Основная идея функций CURL - вы инициализируете CURL-сессию с использованием curl_init(), затем можно установить все ваши опции для трансфера через использование curl_exec(), а затем закрыть сессию функцией curl_close().
Пример 1. Инициализация новой сессии CURL и получение web-страницы.
Пример 3. Проверка доступности URL с помощью CURL РНР
Пример 4. Отделение заголовка от тела, полученного с помощью CURL РНР
Пример 5. Определение адреса перехода URL с помощью CURL РНР
Пример 6. Разбор cookie из заголовка с помощью CURL РНР
Пример 7. Разбор cookie из заголовка с помощью CURL РНР
Пример 8. Установка обработчика загрузки заголовка с помощью CURL РНР
Пример 9. Сохранение страницы в файл с подсчетом скорости передачи с помощью CURL РНР
Пример 10. Использование сессий и cookie в curl
Пример 11. Отправка файла и многомерный массив в Curl. CURLOPT_POSTFIELDS + CurlFile
Ниже представлена функция кодирования двумерного массива с подгрузкой файлов для Curl, которая будет работать как в старых версиях PHP 5.3, PHP 5.4, так и в PHP 5.6
GET запрос при помощи cURL
cURL - мощный инструмент для отправки запросов. Только взгляните сколько он всего умеет.
Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.
Пример простого GET запроса при помощи cURL:
В итоге, переменная $result снова содержит html код страницы этого сайта.
- CURLOPT_VERBOSE - установлена в true для вывода дополнительной информации. Записывает вывод в поток STDERR, или файл, указанный параметром CURLOPT_STDERR.
- CURLOPT_RETURNTRANSFER - установлена в true, для того чтобы вернуть ответ сервера. Если вам ответ сервера не нужен, то можете убрать эту опцию.
Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.
С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.
POST запрос при помощи cURL
Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.
cURL: POST запрос в формате JSON
Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json
cURL: GET запрос в формате JSON
GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в 'GET'
А в остальном код идентичен предыдущему примеру. Хотя, надо признать, GET запросы с телом - это нонсенс. Обычно для этих целей используется POST, PUT или PATCH, но был у меня один случай. Поэтому вот GET запрос в формате JSON.
Стоп, Дмитрий, прекрати выдумывать виды запросов!
Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.
Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST
Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:
Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.
Как получить заголовки ответа
В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:
Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях.
Рассмотрим такой пример:
Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.
Скачивание больших файлов с помощью cURL
Для того, чтобы скачать большой файл пригодится этот способ:
Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:
Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу.
Параллельные cURL запросы в PHP
Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:
И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.
Выглядит это так:
Теперь в $results у нас содержится массив, где ключи - это url адреса, а значения - результаты запросов. Однако запросы выполняются долго. Но мы можем это ускорить.
Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_
Такие параллельные запросы выполняются значительно быстрее чем поочередные.
cURL запросы с сохранением и загрузкой cookie из файла
cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.
Давайте рассмотрим такой пример:
Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.
Передача cookie без файлов
Иммитация браузера с помощью cURL
Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.
В данном примере установлены заголовки, которые посылает Chrome.
В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.
Не используйте эти знания в противоправных целях.
cURL запросы через прокси
Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.
Отправка файлов
Авторизация с помощью cURL
OAuth авторизация
Авторизация через форму
Допустим на сайте есть такая форма:
Тогда наш cURL запрос должен быть сформирован так:
Автоматическое построение запросов
Перевод консольной команды curl в PHP
Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.
Лайфхак
В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.
Как работать с cURL гораздо проще
Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:
Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.
POST и GET запросы без cURL
Теперь у нас в переменной $result записан весь html код главной страницы этого сайта. Мы совершили GET запрос, а html код - это ответ на него.
Как видите file_get_contents - полезная функция, которая не только позволяет читать файлы на нашем сервере, но еще и отправлять запросы.
Почему cURL?
На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые PHP функции вместо cURL:
Однако данные функции не имеют фактически никакой гибкости и содержат огромное количество недостатков в том, что касается обработки ошибок и т.д. Кроме того, существуют определенные задачи, которые вы просто не можете решить благодаря этим стандартным функциям: взаимодействие с cookie, аутентификация, отправка формы, загрузка файлов и т.д.
cURL - это мощная библиотека, которая поддерживает множество различных протоколов, опций и обеспечивает подробную информацию о URL запросах.
Базовая структура
Прежде чем мы двинемся дальше к более сложным примерам, давайте рассмотрим базовую структуру cURL запроса в PHP. Существует четыре основных шага, которые нужно учитывать в каждом скрипте:
- Инициализация
- Назначение параметров
- Выполнение и выборка результата
- Освобождение памяти
Проверка Ошибки
Вдобавок, вы также можете использовать условные операторы для проверки выполнения операции на успех:
Тут прошу отметить для себя очень важный момент: мы должны использовать “=== false” для сравнения, вместо “== false”. Для тех, кто не в курсе, это поможет нам отличать пустой результат от булевого значения false, которое и будет указывать на ошибку.
Получение информации
Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.
Возвращаемый массив содержит следующую информацию:
Обнаружение перенаправления в зависимости от браузера
В этом первом примере мы напишем код, который сможет обнаружить перенаправления URL, основанные на различных настройках браузера. Например, некоторые веб-сайты перенаправляют браузеры сотового телефона, или любого другого устройства.
Сначала мы указываем список URL сайтов, которые будем проверять. Точнее, нам понадобятся адреса данных сайтов. Далее нам необходимо определить настройки браузера, чтобы протестировать каждый из этих URL. После этого мы воспользуемся циклом, в котором пробежимся по всем полученным результатам.
Когда вы запустите данный код, то должны будете получить примерно следующий результат:
Создание POST запроса на определённый URL
При формировании GET запроса передаваемые данные могут быть переданы на URL через “строку запроса”. Например, когда Вы делаете поиск в Google, критерий поиска располагаются в адресной строке нового URL:
Для того чтобы сымитировать данный запрос, вам не нужно пользоваться средствами cURL. Если лень вас одолевает окончательно, воспользуйтесь функцией “file_get_contents()”, для того чтобы получить результат.
Мы можем написать PHP скрипт, который может сымитировать этот вид URL запроса. Сначала давайте создадим простой файл для принятия и отображения POST данных. Назовём его post_output.php:
Затем мы создаем PHP скрипт, чтобы выполнить cURL запрос:
При запуске данного скрипта вы должны получить подобный результат:
Таким образом, POST запрос был отправлен скрипту post_output.php, который в свою очередь, вывел суперглобальный массив $_POST, содержание которого мы получили при помощи cURL.
Загрузка файла
Загрузка файла будет выглядеть практически так же, как и обычный POST запрос, так как все формы загрузки файла работают только с ним.
А вот и код скрипта, который выполняет указанный выше функционал:
Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:
Множественный cURL
Одной из самых сильных сторон cURL является возможность создания "множественных" cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.
Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.
В следующем цикле мы проверяем условие, пока переменная $active = 'true'. Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно 'true', до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение 'блокируется', пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.
А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей.
Проверяем ссылки в WordPress
Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 404, после чего предоставит нам подробнейший отчёт.
Сразу же скажу, что это не пример создания плагина для WordPress. Это всего на всего хороший полигон для наших испытаний.
Давайте же наконец начнём. Сначала мы должны сделать выборку всех ссылок из базы данных:
Сначала мы формируем конфигурационные данные для взаимодействия с базой данных, далее пишем список доменов, которые не будут участвовать в проверке ($excluded_domains). Также мы определяем число, характеризующее количество максимальных одновременных соединений, которые мы будем использовать в нашем скрипте ($max_connections). Затем мы присоединяемся к базе данных, выбираем посты, которые содержат ссылки, и накапливаем их в массив ($url_list).
Следующий код немного сложен, так что разберитесь в нём от начала до конца:
Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии.
Я использовал данный скрипт на своем блоге (с некоторыми неработающими ссылками, которые добавил нарочно для того, чтобы протестировать его работу) и получил следующий результат:
В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее.
Пару слов о других полезных опциях cURL
FTP загрузка
В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.
Заключение
Сегодня мы познакомились с тем, как можно применить библиотеку cURL в своих корыстных целях. Я надеюсь, что вам понравилась данная статья.
Спасибо! Удачного дня!
5 последних уроков рубрики "PHP"
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Читайте также: