Нека усъвършенстваме уменията си за работа с cURL. PHP CURL - Функции и примери за използване Често използвани CURL функции и константи

c URL е много полезен инструмент за команден ред за прехвърляне на данни от или към сървър. Curl поддържа различни протоколи като FILE, HTTP, HTTPS, IMAP, IMAPS, LDAP, DICT, LDAPS, TELNET, FTPS, GOPHER, RTMP, RTSP, SCP, SFTP, POP3, POP3S, SMB, SMBS, SMTP, SMTPS и TFTP .

cURL може да се използва по много различни и интересни начини. С този инструмент можете да изтегляте, качвате и управлявате файлове, да проверявате своя имейл адрес или дори да актуализирате състоянието си в някои уебсайтове на социални медии или да проверявате времето навън. В тази статия ще разгледаме петте най-полезни и основни употреби на инструмента cURL на всеки .

1. Проверете URL адреса

Една от най-честите и най-прости употреби на cURL е отпечатването на самата команда, последвана от URL адреса, който искате да тествате

Curl https://domain.ru

Тази команда ще покаже съдържанието на URL адреса на вашия терминал

2. Запазете URL изхода във файл

Curl -o уебсайт https://domain.ru % Общо % Получени % Xferd Средна скорост Време Време Време Текущо Dload Качване Общо изразходвана лява скорост 100 41793 0 41793 0 0 275k 0 --:--:-- - -:-- :-- --:--:-- 2.9M

В този пример изходът ще бъде записан във файл с име „website“ в текущата работна директория.

3. Качване на файлове с помощта на Curl

Можете да изтегляте файлове с помощта на Curl, като добавите опцията -o към командата. Използва се за запазване на файлове на локалния сървър със същите имена като на отдалечения сървър

Curl -O https://domain.ru/file.zip

В този пример архивът 'file.zip' ще бъде изтеглен в текущата работна директория.

Можете също да качите файл с различно име, като добавите опцията -o към cURL.

Curl -o archive.zip https://domain.ru/file.zip

Така архивът „file.zip“ ще бъде изтеглен и записан като „Archive.zip“.

cURL може да се използва и за изтегляне на множество файлове наведнъж, както е показано в примера по-долу

Curl -O https://domain.ru/file.zip -O https://domain.com/file2.zip

Curl може да се използва и за сигурно качване на файлове през SSH чрез следната команда

Curl -u потребител sftp://server.domain.ru/path/to/file

Моля, обърнете внимание, че трябва да използвате пълния път до файла, който искате да изтеглите

4. Вземете информация от HTTP хедъра на уебсайта

Можете лесно да получите информация за HTTP заглавка от всеки уебсайт, като добавите опцията -I ('i') към cURL.

Curl -I http://domain.ru HTTP/1.1 200 OK Дата: Sun, 16 Oct 2016 23:37:15 GMT Сървър: Apache/2.4.23 (Unix) X-Powered-By: PHP/5.6.24 Връзка : затворете Content-Type: text/html; charset=UTF-8

5. Достъп до FTP сървър

За достъп до FTP сървъра с помощта на Curl трябва да използвате следната команда

Curl ftp://ftp.domain.ru --user потребителско име:парола

Curl ще се свърже с FTP сървъра и ще изведе всички файлове и директории в домашната директория на потребителя

Можете да изтеглите файла чрез FTP

Curl ftp://ftp.domain.ru/file.zip --потребителско име:парола

и качете файла на FTP сървъра

Curl -T file.zip ftp://ftp.domain.ru/ --user потребителско име:парола

Можете да проверите страницата Curl ръчно, за да видите всички налични опции на cURL и нейната функционалност

Мъжка къдрица

PS.Ако тази публикация ви е харесала, моля, споделете я с приятелите си в социалните мрежи, като използвате бутоните по-долу или просто оставете коментар. благодаря

Реален практически пример: трябва да рестартирате вашия рутер (модем), за да промените IP адреса. За да направите това, трябва да: влезете в рутера, отидете на страницата за поддръжка и щракнете върху бутона „Рестартиране“. Ако това действие трябва да се извърши няколко пъти, тогава процедурата трябва да се повтори. Съгласете се, не искате да правите тази рутина ръчно всеки път. cURL ви позволява да автоматизирате всичко това. Само с няколко cURL команди можете да получите разрешение и да завършите задачата на рутера.

  • cURL е полезен за извличане на данни от уебсайтове в командния ред.
Друг практически пример: искаме да внедрим показването на обща статистика за няколко сайта. Ако използваме cURL, тогава това става напълно тривиална задача: използвайки cURL, ние се удостоверяваме в услугата за събиране на статистически данни (ако е необходимо), след което (отново използвайки cURL команди) получаваме необходимите страници, анализираме данните, от които се нуждаем; процедурата се повтаря за всички наши сайтове, след което добавяме и показваме крайния резултат.

Тези. случаите на използване на cURL са съвсем реални, въпреки че в повечето случаи cURL е необходим на програмисти, които го използват за своите програми.

CURL поддържа много протоколи и методи за оторизация, може да прехвърля файлове, работи правилно с бисквитки, поддържа SSL сертификати, проксита и много други.

cURL в PHP и командния ред

Можем да използваме cURL по два основни начина: в PHP скриптове и в командния ред.

За да активирате cURL в PHP на сървъра, трябва да разкоментирате реда във файла php.ini

Разширение=php_curl.dll

И след това рестартирайте сървъра.

На Linux трябва да инсталирате curl пакета.

В Debian, Ubuntu или Linux Mint:

$ sudo apt-get install curl


Във Fedora, CentOS или RHEL:

$ sudo yum инсталирайте curl

За да видим ясно разликата в използването в PHP и в командния ред, ще изпълним едни и същи задачи два пъти: първо в PHP скрипт и след това в командния ред. Нека се опитаме да не се объркаме.

Извличане на данни чрез cURL

Извличане на данни чрез cURL в PHP

Пример в PHP:

Много е просто:
$target_url- адреса на сайта, който ни интересува. След адреса на сайта можете да поставите двоеточие и да добавите адреса на порта (ако портът е различен от стандартния).

curl_init- инициализира нова сесия и връща манипулатор, който в нашия пример е присвоен на променлива $ch.

След това изпълняваме заявката с функцията cURL curl_exec, на който се предава дескриптор като параметър.

Всичко е много логично, но когато този скрипт се изпълни, съдържанието на сайта ще се покаже на нашата страница. Но какво, ако не искаме да показваме съдържанието, но искаме да го запишем в променлива (за последваща обработка или анализиране).

Нека добавим малко към нашия скрипт:

0) ( echo "Грешка при извиване: " . curl_error($ch); ) curl_close($ch); ?>

Имаме линия curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- задава опции. Пълен списък с опции можете да намерите на тази страница:

Скрит от гостите

$response_data = curl_exec($ch);

Сега стойността на скрипта се присвоява на променливата $response_data, с която могат да се извършват допълнителни операции. Например, можете да покажете съдържанието му.

Шевове

If (curl_errno($ch) > 0) ( echo "Curl error: " . curl_error($ch); )

служат за отстраняване на грешки в случай на възникване на грешки.

Извличане на данни чрез cURL в командния ред

В командния ред просто въведете

където вместо mi-al.ru- адреса на вашия уебсайт.

Ако трябва да копирате данни в променлива, вместо да показвате резултата на екрана, направете следното:

Temp="curl mi-al.ru"

Някои данни обаче все още се показват:

За да предотвратите показването им, добавете ключа -s:

Temp="curl -s mi-al.ru"

Можете да видите какво е записано:

Echo $temp | по-малко

Основно и HTTP удостоверяване

Удостоверяването, най-просто казано, представлява въвеждане на потребителско име и парола.

Основното удостоверяване е удостоверяване от страна на сървъра. За целта се създават два файла: .htaccessи .htpasswd

Съдържанието на файла .htaccess е нещо подобно

AuthName "Само за регистрирани потребители!" AuthType Basic изисква валиден потребител AuthUserFile /home/freeforum.biz/htdocs/.htpassw


Съдържанието на файла .htpasswd е нещо подобно:

Миал:CRdiI.ZrZQRRc

Тези. хеш за вход и парола.

Когато се опитате да получите достъп до защитена с парола папка, браузърът ще покаже нещо подобно:

HTTP удостоверяването е случаят, когато въвеждаме потребителско име и парола във формуляр на уебсайт. Именно това удостоверяване се използва при влизане в поща, форуми и т.н.

Основно cURL удостоверяване (PHP)

Има сайт

Скрит от гостите

Нека опитаме нашия първоначален скрипт:

0) ( echo "Curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Въпреки че скриптът смята, че няма грешка, изходът изобщо не ни харесва:

Добавете два реда:

Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

В първия ред задаваме типа на удостоверяване - основен. Вторият ред съдържа името и паролата, разделени с двоеточие (в нашия случай името и паролата са същите - ru-board). Оказа се така:

0) ( echo "Curl error: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?> Да опитаме: 30946 Страхотно!

Основно cURL удостоверяване (на командния ред) Същото може да се постигне на командния ред с един ред: curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Не забравих да посоча типа удостоверяване, просто в cURL основният тип удостоверяване е по подразбиране.

Всичко се получи толкова бързо в командния ред, че от разочарование написах следната програма. Тя се свързва със сайта и изтегля последната актуализация:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Update_FED_201(1).(2).(2).7z" | уникален | опашка -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

  • Само с още няколко команди можете да добавите:
  • разопаковане на архива в посочената директория;
  • стартиране на актуализации на ConsultantPlus (това са актуализации за него);
  • можете да проверите дали последната налична актуализация вече е изтеглена или се е появила нова;
добавете всичко към Cron за ежедневни актуализации.

cURL за HTTP удостоверяване

Трябва да знаем:

  • адрес, на който да изпратите данни за удостоверяване
  • метод на изпращане GET или POST
  • вход
  • парола
Понякога тези данни не са достатъчни. Нека да го разберем.

Адресът, на който трябва да изпратите данните, може да бъде взет от формуляра за удостоверяване. Например:

Оглеждаме имота действие. Тези. последната страница е login.php. Нуждаем се от пълния адрес, като този

Скрит от гостите

Тук намираме и начина на изпращане: метод="пост"

Също така знам данните за вход и паролата: admin и qwerasdfzxcv
Тези. Низ се изпраща на сървъра от формуляра чрез метода POST. Теоретично нашият предишен скрипт, към който добавихме нов ред, трябва да работи. Тези. трябва да се извърши удостоверяване.

0) ( echo "Грешка при извиване: ". curl_error($ch); ) else () curl_close($ch); ?>

Нов ред в скрипта

curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

тук curl_setopt- вече познатата функция за настройка на опции за cURL, CURLOPT_POSTFIELDS- това е името на опцията, която задаваме. CURLOPT_POSTFIELDSсъдържа всички данни, които се прехвърлят чрез метода POST. Е, самата линия LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- това са същите данни, които предаваме.

Ако разгледате внимателно формата, ще видите, че тя съдържа и скрити полета. И данните могат да бъдат обработени или допълнени с JavaScript. Можете да изучавате всичко това, но аз предпочитам по-прост метод.

Използвам Wireshark. Тази програма е предназначена да надушва (прихваща) трафик. И именно в него е много удобно да се види какво точно се предава на сайта.

Гледайте това малко видео:


Тези. с адреса, на който се прехвърлят данните, познах правилно. Но предаденият низ се оказа много по-сложен.

Въведох правилния параметър и също така леко промених скрипта, така че не само да влезе, но и да получи нещо от рутера:

0) ( echo "Curl error: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)"; $response_data2, $results2); , "", $results2); $results2 = str_replace("";", "", $results2); echo "Име на Wi-fi мрежа: $резултати2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $results3 = str_replace("f_wpa.wpapsk1.value", "", $results3);"; ) curl_close($ch); ?>

Между другото, ако собственикът актуализира паролата (но не актуализира фърмуера), тогава новата парола винаги може да се види на

Скрит от гостите

(Това е добре позната уязвимост в рутерите D-Link DIR-300, D-Link DIR-320 и D-Link DAP-1353).

HTTP cURL удостоверяване на командния ред

Вече знаем пълния адрес, както и низа, който ще бъде предаден. Така че е просто:

Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php

Мисля, че всичко е ясно, след като вече разгледахме тези срокове. Ако някой не разбира, попитайте в коментарите.

Пример за използване на cURL за извличане и анализ на данни би бил следният набор от команди:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn " && echo "Име на Wi-Fi мрежа" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Парола за Wi-Fi мрежа" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Би било по-правилно да напишете това заглавие, както следва: „Сложни“ случаи на разрешение. Тези. Поставете думата „сложно“ в кавички. Те изглеждат сложни само на пръв поглед, когато не е ясно: къде се извършва изпращането, какви са имената на полетата, какво точно се изпраща и т.н.

Но всъщност всички те се свеждат до методите POST или GET. За да разберете какво точно се изпраща, можете да запазите страницата с формата на вашия диск и да добавите функция за показване на данните, генерирани за изпращане, към бутона за изпращане. Или още по-просто - като мен, Wireshark.

Ако данните са правилни, но не се извършва удостоверяване, тогава трябва да копаете в следните посоки:

  • задайте правилния референтен низ
  • задайте "правилния" низ на потребителския агент.
Всичко това може да се направи с помощта на основни методи на cURL, но няма да навлизам в това. Урокът вече беше достатъчно дълъг, но исках да покажа и няколко трика с cURL.

Съвети и трикове cURL

cURL и получаване на бисквитки в допълнение към CURLOPT_COOKIEJAR

Мисля, че вече е ясно, че cURL обработва бисквитките правилно - съхранява ги, използва ги, когато сървърът ги поиска и т.н. Но понякога бисквитките трябва да бъдат запазени. Има опция за това, наречена CURLOPT_COOKIEJAR, но не винаги е възможно да се използва. На това е посветен първият ни трик.

Понякога, поради начина, по който PHP е конфигуриран на сървъра, опции като CURLOPT_COOKIEJAR (позволява ви да запазите получените бисквитки във файл) и CURLOPT_COOKIEFILE (позволява ви да използвате бисквитки от файл) не са достъпни за нас. защото те казват, че с помощта на тези опции можем да откраднем всеки файл от техния сървър. Ето решението на този проблем:

1) Ние не използваме CURLOPT_FOLLOWLOCATION
2) Използвайте curl_setopt($ch, CURLOPT_HEADER, 1)
3) Съберете бисквитки от заглавката по следния начин:

Preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results);

4) Задайте ги с помощта на curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Втори съвет. Можем да се превърнем от нападатели в жертви. За да избегнем да станем жертва на атака от тип човек по средата, ние правим това.

Моля всички, спрете да задавате настройката CURLOPT_SSL_VERIFYPEER на false или 0. Ако вашата PHP инсталация няма актуален набор от основни CA сертификати, изтеглете един от уебсайта на curl и го запазете на вашия сървър:

Скрит от гостите

След това задайте пътя във вашия файл php.ini, например в Windows:

Curl.cainfo=c:phpcacert.pem

Деактивирането на CURLOPT_SSL_VERIFYPEER позволява атака човек по средата (MITM), която не искаме!

Е, последният съвет за днес. Знаете ли, че са възможни голям брой асинхронни curl заявки?

За това можете да използвате curl_multi_init. Подробности и примерен код в официалната документация

Скрит от гостите

Скрит от гостите


Относно cURL в командния ред

Скрит от гостите


Втората част от урока по cURL също е подготвена за четене на руски: "".

cURL е специален инструмент, предназначен за прехвърляне на файлове и данни чрез синтаксис на URL. Тази технология поддържа много протоколи като HTTP, FTP, TELNET и много други. cURL първоначално е проектиран да бъде инструмент за команден ред. За наш късмет библиотеката cURL се поддържа от езика за програмиране PHP. В тази статия ще разгледаме някои от разширените функции на cURL, а също така ще се докоснем до практическото приложение на придобитите знания с помощта на PHP.

Защо cURL?

Всъщност има доста алтернативни начини за извадка от съдържание на уеб страница. В много случаи, главно поради мързел, използвах прости PHP функции вместо cURL:

$съдържание = file_get_contents("http://www.nettuts.com"); // или $lines = file("http://www.nettuts.com"); // или readfile("http://www.nettuts.com");

Тези функции обаче практически нямат гъвкавост и съдържат огромен брой недостатъци по отношение на обработката на грешки и т.н. Освен това има определени задачи, които просто не можете да изпълните с тези стандартни функции: взаимодействие с бисквитки, удостоверяване, подаване на формуляр, качване на файлове и т.н.

cURL е мощна библиотека, която поддържа много различни протоколи, опции и предоставя подробна информация за URL заявките.

Основна структура

  • Инициализация
  • Задаване на параметри
  • Изпълнение и извличане на резултат
  • Освобождаване на памет

// 1. инициализация $ch = curl_init(); // 2. задайте параметри, включително url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. вземете HTML като резултат $output = curl_exec($ch); // 4. затваряне на връзката curl_close($ch);

Стъпка #2 (т.е. извикването на curl_setopt()) ще бъде обсъдена много повече в тази статия, отколкото всички други стъпки, т.к. На този етап се случват всички най-интересни и полезни неща, които трябва да знаете. В cURL има огромен брой различни опции, които трябва да бъдат посочени, за да можете да конфигурирате URL заявката по най-внимателния начин. Няма да разглеждаме целия списък, а ще се съсредоточим само върху това, което считам за необходимо и полезно за този урок. Всичко останало можете да изучавате сами, ако тази тема ви интересува.

Проверка на грешки

Освен това можете също да използвате условни изрази, за да проверите дали дадена операция е завършила успешно:

// ... $изход = curl_exec($ch); if ($output === FALSE) ( echo "cURL Грешка: " . curl_error($ch); ) // ...

Тук ви моля да отбележите един много важен момент: трябва да използваме „=== false“ за сравнение, вместо „== false“. За тези, които не са запознати, това ще ни помогне да направим разлика между празен резултат и булева стойност false, което ще покаже грешка.

Получаване на информация

Друга допълнителна стъпка е да получите данни за cURL заявката, след като е била изпълнена.

// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Взех " . $info["общо_време"] . "секунди за url". $info["url"]; //...

Върнатият масив съдържа следната информация:

  • "url"
  • "тип_съдържание"
  • "http_код"
  • „header_size“
  • “request_size”
  • "файлово време"
  • „ssl_verify_result“
  • „redirect_count“
  • „общо_време“
  • „namelookup_time“
  • „време за свързване“
  • „предварително_прехвърляне“
  • „size_upload“
  • „size_download“
  • „скорост_изтегляне“
  • “speed_upload”
  • „дължина_на_съдържание за изтегляне“
  • „upload_content_length“
  • “начален_час на прехвърляне”
  • “пренасочване_време”

Откриване на пренасочване в зависимост от браузъра

В този първи пример ще напишем код, който може да открие URL пренасочвания въз основа на различни настройки на браузъра. Например, някои уебсайтове пренасочват браузърите на мобилен телефон или друго устройство.

Ще използваме опцията CURLOPT_HTTPHEADER, за да дефинираме нашите изходящи HTTP заглавки, включително името на браузъра на потребителя и наличните езици. В крайна сметка ще можем да определим кои сайтове ни пренасочват към различни URL адреси.

// тестване на URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // тестване на браузъри $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5 .6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => масив ("user_agent" => "Mozilla/5.0 (iPhone; U ; CPU като Mac OS X; en) AppleWebKit/420+ (KHTML, като Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent" => "Mozilla/4.0 (съвместим; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "език" => "fr,fr-FR;q=0.5")); foreach ($urls като $url) ( echo "URL: $url\n"; foreach ($browsers като $test_name => $browser) ( $ch = curl_init(); // посочете URL адреса curl_setopt($ch, CURLOPT_URL , $url); // задаване на заглавки за браузъра curl_setopt($ch, CURLOPT_HTTPHEADER, array("Потребителски агент: ($browser["user_agent"])", "Accept-Language: ($browser["language"] )" )); // не се нуждаем от съдържанието на страницата curl_setopt($ch, CURLOPT_NOBODY, 1); // трябва да получим HTTP заглавки curl_setopt($ch, CURLOPT_HEADER, 1); // връщаме резултати вместо изход curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); // имаше ли HTTP пренасочване ("!Location: (.*)!", $output , $matches) ( echo " $test_name: пренасочва към $matches\n"; ) else ( echo "$test_name: без пренасочване\n"; ) ) echo "\n\n";

Първо, ние определяме списък с URL адреси на сайтове, които ще проверяваме. По-точно, трябват ни адресите на тези сайтове. След това трябва да дефинираме настройките на браузъра, за да тестваме всеки от тези URL адреси. След това ще използваме цикъл, в който ще преминем през всички получени резултати.

Трикът, който използваме в този пример, за да зададем настройките на cURL, ще ни позволи да получим не съдържанието на страницата, а само HTTP заглавките (съхранени в $output). След това, използвайки прост регулярен израз, можем да определим дали низът „Location:“ присъства в получените заглавки.

Когато стартирате този код, трябва да получите нещо подобно:

Създаване на POST заявка към конкретен URL адрес

При формиране на GET заявка, предадените данни могат да бъдат предадени на URL чрез „низ за заявка“. Например, когато търсите в Google, думата за търсене се поставя в адресната лента на новия URL адрес:

Http://www.google.com/search?q=ruseller

Не е необходимо да използвате cURL, за да симулирате тази заявка. Ако мързелът ви надвие напълно, използвайте функцията „file_get_contents()“, за да получите резултата.

Но работата е там, че някои HTML форми изпращат POST заявки. Данните от тези форми се транспортират през тялото на HTTP заявката, а не както в предишния случай. Например, ако сте попълнили формуляр във форум и сте кликнали върху бутона за търсене, най-вероятно ще бъде направена POST заявка:

http://codeigniter.com/forums/do_search/

Можем да напишем PHP скрипт, който може да симулира този вид URL заявка. Първо нека създадем прост файл за приемане и показване на POST данни. Нека го наречем post_output.php:

Print_r($_POST);

След това създаваме PHP скрипт, за да направим cURL заявката:

$url = "http://localhost/post_output.php"; $post_data = масив ("foo" => "bar", "query" => "Nettuts", "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // показваме, че имаме POST заявка curl_setopt($ch, CURLOPT_POST, 1); // добавяне на променливи curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $изход = curl_exec($ch); curl_close($ch); ехо $ изход;

Когато стартирате този скрипт, трябва да получите резултат като този:

Така POST заявката беше изпратена до скрипта post_output.php, който от своя страна изведе суперглобалния $_POST масив, чието съдържание получихме с помощта на cURL.

Качване на файл

Първо, нека създадем файл, за да го генерираме и да го изпратим във файла upload_output.php:

Print_r($_FILES);

И ето кода на скрипта, който изпълнява горната функционалност:

$url = "http://localhost/upload_output.php"; $post_data = масив ("foo" => "bar", // файл за качване "upload" => "@C:/wamp/www/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); $изход = curl_exec($ch); curl_close($ch); ехо $ изход;

Когато искате да качите файл, всичко, което трябва да направите, е да го подадете като нормална пост променлива, предшествана от символ @. Когато стартирате писмения скрипт, ще получите следния резултат:

Множество cURL

Една от най-силните страни на cURL е възможността за създаване на "множество" манипулатори на cURL. Това ви позволява да отворите връзка към множество URL адреси едновременно и асинхронно.

В класическата версия на cURL заявката изпълнението на скрипта е спряно и URL операцията на заявката чака завършване, след което скриптът може да продължи да работи. Ако възнамерявате да взаимодействате с цял куп URL адреси, това ще доведе до доста значителна инвестиция на време, тъй като в класическата версия можете да работите само с един URL наведнъж. Въпреки това можем да коригираме тази ситуация, като използваме специални манипулатори.

Нека да разгледаме примерния код, който взех от php.net:

// създаване на няколко ресурса 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); $активно = нула; //изпълнете do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) докато ($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);

Идеята е, че можете да използвате множество манипулатори на cURL. Използвайки прост цикъл, можете да следите кои заявки все още не са изпълнени.

В този пример има два основни цикъла. Първият do-while цикъл извиква curl_multi_exec(). Тази функция не може да се блокира. Работи възможно най-бързо и връща статуса на заявката. Докато върнатата стойност е константата 'CURLM_CALL_MULTI_PERFORM', това означава, че работата все още не е завършена (например http заглавки в момента се изпращат към URL); Ето защо ние продължаваме да проверяваме тази върната стойност, докато не получим различен резултат.

В следващия цикъл проверяваме условието, докато променливата $active = "true". Това е вторият параметър към функцията curl_multi_exec(). Стойността на тази променлива ще бъде "истина", докато някоя от съществуващите промени е активна. След това извикваме функцията curl_multi_select(). Изпълнението му е "блокирано", докато има поне една активна връзка, докато не се получи отговор. Когато това се случи, ние се връщаме към основния цикъл, за да продължим да изпълняваме заявки.

Сега нека приложим наученото към пример, който ще бъде наистина полезен за много хора.

Проверка на връзки в WordPress

Представете си блог с огромен брой публикации и съобщения, всяко от които съдържа връзки към външни интернет ресурси. Някои от тези връзки може вече да са мъртви по различни причини. Страницата може да е изтрита или сайтът изобщо да не работи.

Ще създадем скрипт, който ще анализира всички връзки и ще намери незареждащи се уебсайтове и 404 страници, след което ще ни предостави подробен отчет.

Нека веднага кажа, че това не е пример за създаване на плъгин за WordPress. Това е абсолютно добра тестова площадка за нашите тестове.

Нека най-накрая да започнем. Първо трябва да извлечем всички връзки от базата данни:

// конфигурация $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // инициализация на променливи $url_list = array(); $working_urls = масив(); $dead_urls = масив(); $not_found_urls = масив(); $активно = нула; // свързване с MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Не може да се свърже: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Може not select db: " . mysql_error()); ) // изберете всички публикувани публикации с връзки $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post "" ; $r = mysql_query($q) или die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // извличане на връзки с помощта на регулярни изрази if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ съвпадения) / / премахване на дубликати $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Няма URL за проверка"); )

Първо генерираме конфигурационни данни за взаимодействие с базата данни, след което пишем списък с домейни, които няма да участват в проверката ($excluded_domains). Ние също така дефинираме число, характеризиращо броя на максималните едновременни връзки, които ще използваме в нашия скрипт ($max_connections). След това се присъединяваме към базата данни, избираме публикациите, които съдържат връзки, и ги събираме в масив ($url_list).

Следният код е малко сложен, така че преминете през него от началото до края:

// 1. множествен манипулатор $mh = curl_multi_init(); // 2. добавете набор от URL адреси за ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

Тук ще се опитам да обясня всичко подробно. Номерата в списъка отговарят на номерата в коментара.

  1. 1. Създайте множествен манипулатор;
  2. 2. Ще напишем функцията add_url_to_multi_handle() малко по-късно. Всеки път, когато бъде извикан, ще започне обработка на нов url. Първоначално добавяме 10 ($max_connections) URL адреса;
  3. 3. За да започнем, трябва да изпълним функцията curl_multi_exec(). Докато връща CURLM_CALL_MULTI_PERFORM, все още имаме какво да правим. Нуждаем се от това главно за създаване на връзки;
  4. 4. Следва основният цикъл, който ще работи, докато имаме поне една активна връзка;
  5. 5. curl_multi_select() виси в очакване на URL търсенето да завърши;
  6. 6. Още веднъж, трябва да накараме cURL да свърши някаква работа, а именно да извлече данните за върнатия отговор;
  7. 7. Информацията се проверява тук. В резултат на изпълнение на заявката ще бъде върнат масив;
  8. 8. Върнатият масив съдържа cURL манипулатор. Ще го използваме, за да изберем информация за отделна cURL заявка;
  9. 9. Ако връзката е била мъртва или времето за изчакване на скрипта е изтекло, тогава не трябва да търсим http код;
  10. 10. Ако връзката ни върна страница 404, тогава http кодът ще съдържа стойността 404;
  11. 11. В противен случай имаме работеща връзка пред нас. (Можете да добавите допълнителни проверки за код на грешка 500 и т.н.);
  12. 12. След това премахваме манипулатора на cURL, защото вече не ни трябва;
  13. 13. Сега можем да добавим друг url и да стартираме всичко, за което говорихме преди;
  14. 14. На тази стъпка скриптът завършва работата си. Можем да премахнем всичко, от което не се нуждаем, и да генерираме отчет;
  15. 15. Накрая ще напишем функция, която ще добави url към манипулатора. Статичната променлива $index ще се увеличава при всяко извикване на тази функция.

Използвах този скрипт в моя блог (с някои повредени връзки, които добавих нарочно, за да го тествам) и получих следния резултат:

В моя случай скриптът отне малко по-малко от 2 секунди, за да обходи 40 URL адреса. Увеличението на производителността е значително при работа с още повече URL адреси. Ако отворите десет връзки едновременно, скриптът може да се изпълни десет пъти по-бързо.

Няколко думи за други полезни опции за cURL

HTTP удостоверяване

Ако URL адресът има HTTP удостоверяване, можете лесно да използвате следния скрипт:

$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); $изход = curl_exec($ch); curl_close($ch);

FTP качване

PHP също има библиотека за работа с FTP, но нищо не ви пречи да използвате cURL инструменти тук:

// отваряме файла $file = fopen("/path/to/file", "r"); // url трябва да съдържа следното съдържание $url = "ftp://username: [имейл защитен]:21/път/към/нов/файл"; $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")); curl_close($ch);

Използване на прокси

Можете да изпълните своята URL заявка чрез прокси:

$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"); $изход = curl_exec($ch); curl_close($ch);

Функции за обратно извикване

Също така е възможно да се укаже функция, която да се задейства дори преди cURL заявката да завърши. Например, докато съдържанието на отговора се зарежда, можете да започнете да използвате данните, без да чакате да се зареди напълно.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"прогрес_функция"); curl_exec($ch); curl_close($ch); функция progress_function($ch,$str) (ехо $str; връщане strlen($str);)

Функция като тази ТРЯБВА да върне дължината на низа, което е изискване.

Заключение

Днес научихме как можете да използвате библиотеката cURL за свои егоистични цели. Надявам се, че тази статия ви е харесала.

благодаря ви приятен ден!

CURL е софтуерен пакет, състоящ се от помощна програма за команден ред и библиотека за прехвърляне на данни чрез синтаксис на URL.

CURL поддържа много протоколи, включително DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP.

Качете отделен файл
Следната команда ще получи съдържанието на URL адреса и ще го покаже на стандартния изход (т.е. вашия терминал).

Curl https://mi-al.ru/ > mi-al.htm % Общо % Получен % Xferd Средна скорост Време Време Време Текущо изтегляне Качване Общо изразходвана лява скорост 100 14378 0 14378 0 0 5387 0 --: --:- - 0:00:02 --:--:-- 5387

Запазване на изхода на cURL във файл
Можем да запазим резултата от командата curl във файл с помощта на опциите -o/-O.
  • (o малки букви) резултатът ще бъде записан във файла, указан в командния ред
  • (главни букви O) името на файла ще бъде взето от URL адреса и ще се използва за запазване на получените данни.

$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

Страницата gettext.html сега ще бъде запазена във файл, наречен „mygettext.html“. Когато curl се изпълнява с опцията -o, той показва лентата за напредъка на изтеглянето, както следва.

% Общо % Получен % Xferd Средна скорост Време Време Текущо Dload Качване Общо изразходвана лява скорост 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987

Когато използвате curl -O (главни букви O), той сам ще запази съдържанието във файл, наречен „gettext.html“ на локалната машина.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

Забележка: Когато curl трябва да запише данни в терминала, той деактивира лентата за напредък, за да избегне объркване с отпечатаните данни. Можем да използваме опциите '>'|'-o'|'-O', за да прехвърлим резултатите във файл.

Извличане на множество файлове наведнъж
Можем да изтеглим няколко файла наведнъж, като посочим всички URL адреси в командния ред.

Curl -O URL1 -O URL2

Командата по-долу ще изтегли както index.html, така и gettext.html и ще ги запази със същите имена в текущата директория.

Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html

Моля, обърнете внимание, че когато изтеглим няколко файла от един и същ сървър, както е показано по-горе, curl ще се опита да използва отново връзката.

Следвайте заглавките на HTTP Location с опцията -L
По подразбиране CURL не следва HTTP местоположение в заглавки (пренасочвания). Когато заявената уеб страница бъде преместена на друго място, съответният отговор ще бъде изпратен в заглавките на HTTP местоположение.
Например, когато някой въведе google.com в своя браузър от своята страна, той автоматично ще бъде пренасочен към „google.co.xx“. Това се прави въз основа на заглавката на HTTP местоположение, както е показано по-долу.

Curl https://www.google.com/?gws_rd=ssl

302 Преместен

302 Преместен

Документът е преместен тук.

Горният резултат казва, че исканият документ е преместен в „

Скрит от гостите

.
Можете да кажете на curl да следва пренасочвания, това се прави с помощта на опцията -L, както е показано по-долу. Сега изходният html код ще бъде изтеглен от

Скрит от гостите

.

Curl -L https://www.google.com/?gws_rd=ssl

Подновяване на предишно изтегляне

С помощта на опцията -C можете да продължите изтегляне, което е било спряно по някаква причина. Това ще бъде полезно, когато изтеглянето на големи файлове е неуспешно.
Ако кажем '-C -', тогава curl ще търси откъде да възобнови изтеглянето. Можем също да посочим '-C<смещение>’. Посоченото отместване в байта ще бъде пропуснато от началото на изходния файл.
Започнете голямо изтегляне с curl и натиснете Ctrl-C, за да го спрете по средата на изтеглянето.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 20,1%

Инжектирането е спряно при 20,1%. Използвайки “curl -C -” можем да продължим да зареждаме от мястото, където сме спрели. Сега изтеглянето ще продължи от 20,1%.

Curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ################ 21,1%

Ограничение на скоростта на данни
Можете да ограничите скоростта на трансфер на данни с опцията –limit-rate. Можете да подадете максималната скорост като аргумент.

$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

Горната команда ще ограничи скоростта на трансфер до 1000 байта/секунда. curl може да използва по-високи скорости в пиковете. Но средната скорост ще бъде приблизително 1000 байта/секунда.
По-долу е лентата за напредъка на горната команда. Можете да видите, че текущата скорост е около 1000 байта.

% Общо % Получен % Xferd Средна скорост Време Време Време Текущо Dload Качване Общо изразходвана лява скорост 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999

Заредете файл само ако е бил променен преди/след определено време
Можете да получите файлове, които са се променили след определено време, като използвате опцията -z в curl. Това ще работи както за FTP, така и за HTTP.

Командата по-горе ще зареди yy.html само ако е бил модифициран по-скоро от дадената дата и час.

Горната команда ще зареди file.html, ако е бил променен преди зададената дата и час. Въведете „man curl_getdate“, за да научите повече за различните поддържани синтаксиси за изрази за дата.

Преминаване на HTTP удостоверяване в cURL
Понякога уебсайтовете изискват потребителско име и парола, за да видят съдържанието си. Използвайки опцията -u, можете да предадете тези идентификационни данни от cURL към уеб сървъра, както е показано по-долу.

$ curl -u потребителско име:парола URL

Забележка: По подразбиране curl използва основно HTTP удостоверяване. Можем да зададем други методи за удостоверяване с помощта на –ntlm | – дайджест.


cURL може да се използва и за изтегляне на файлове от FTP сървъри. Ако посоченият FTP път е директория, тогава по подразбиране ще се покаже списък с файлове в нея.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php

Горната команда ще изтегли файла xss.php от ftp сървъра и ще го запише в локална директория.

$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/

Тук URL адресът се отнася до директория. Следователно cURL ще изброява файлове и директории на дадения URL адрес.


CURL поддържа диапазони, посочени в URL адреси. Когато е зададен диапазон, ще бъдат заредени съответните файлове в този диапазон. Това ще бъде полезно при изтегляне на пакети от огледални FTP сайтове.

$ curl ftp://ftp.uk.debian.org/debian/pool/main//

Командата по-горе ще изброи всички пакети в диапазона a-z в терминала.

Качване на файлове на FTP сървър
Curl може да се използва и за качване на FTP сървър с опцията -T.

$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

Горната команда ще качи файл с име myfile.txt на FTP сървъра. Можете също да качвате няколко файла наведнъж, като използвате диапазони.

$ curl -u ftpuser:ftppass -T "(файл1,файл2)" ftp://ftp.testserver.com

По избор можем да използваме „.“ за получаване от стандартен вход и предаване на отдалечената машина.

$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Горната команда ще получи изхода от потребителя от стандартния вход и ще съхрани съдържанието на ftp сървъра като „myfile_1.txt“.
Можете да посочите '-T' за всеки URL адрес и всяка двойка адрес-файл ще определи какво къде да се качи

Повече информация с повишена подробност и опция за проследяване
Можете да разберете какво се случва, като използвате опцията -v. Опцията -v активира вербален режим и ще отпечата подробности.

Curl -v https://www.google.co.th/?gws_rd=ssl

Горната команда ще изведе следното

* Преустроен URL към: https://www.google.co.th/?gws_rd=ssl * Името на хоста НЕ е намерено в DNS кеша * Опитвам се 27.123.17.49... * Свързан към www.google.co.th (27.123. 17.49) порт 80 (#0) > GET / HTTP/1.1 > Потребителски агент: curl/7.38.0 > Хост: www.google.co.th > Приемане: */* >< HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...

Ако имате нужда от по-подробна информация, тогава можете да използвате опцията –trace. Опцията –trace ще позволи пълно проследяване на всички входящи/изходящи данни за даден файл

Предлагам да поговорим малко за езика за програмиране PHP и по-специално да се докоснем до темата за разширенията КЪДРИЦА, т.е. възможност за взаимодействие с различни сървъри, използващи различни протоколи от самия PHP скрипт.

Преди да започнем да разглеждаме curl, искам да ви напомня, че вече засегнахме езика PHP, например в материала за качване в Excel в PHP или възможността за удостоверяване в PHP, а сега нека поговорим за възможността за изпращайте заявки към PHP.

Какво е CURL?

КЪДРИЦАе библиотека от PHP функции, които могат да се използват за изпращане на заявки, като HTTP, от PHP скрипт. CURL поддържа протоколи като HTTP, HTTPS, FTP и други. Можете да изпращате HTTP заявки, като използвате методите GET, POST и PUT.

CURL може да бъде полезен в случаите, когато трябва да извикате отдалечен скрипт и да получите резултата или просто да запазите HTML кода на извиканата страница, като цяло всеки може да намери собствената си употреба, но въпросът е, че можете да изпращате заявки, докато скриптът се изпълнява.

Свързване на библиотеката CURL в PHP

За да използвате библиотеката CURL, трябва да я свържете съответно.

Забележка! Като пример ще използваме PHP 5.4.39 на Windows 7 и ще използваме Apache 2.2.22 като уеб сървър.

Първото нещо, което трябва да направите, е да копирате библиотеките ssleay32.dll, libeay32.dll, libssh2.dllте се намират в директорията с PHP, в системната директория на Windows, а именно в C:\Windows\System32.

След това свържете библиотеката php_curl.dll към php.ini, т.е. разкоментирайте следващия ред

Библиотеката не е свързана

;разширение=php_curl.dll

Библиотеката е свързана

Разширение=php_curl.dll

Това е всичко, рестартирайте Apache, извикайте функцията phpinfo() и ако връзката е успешна, трябва да имате curl раздел


Ако не е там, това означава само едно нещо: библиотеката не се е заредила; най-честата причина за това е, че горните DLL файлове не са били копирани в системната директория на Windows.

Пример CURL - искане на отдалечена страница за показване на екрана

В този пример просто ще поискаме отдалечена страница чрез HTTP, използвайки метода GET и ще покажем нейното съдържание на екрана.

Имаме тестова директория, в която има 2 PHP файла: test_curl.php и test.php, където test_curl.php е скриптът, в който ще използваме curl, а test.php е отдалеченият скрипт, който ще извикаме. Коментирах кода подробно.

Код test_curl.php

Код test.php

Заглавие 1"; прекъсване; случай 2: ехо "<Н2>Заглавие 2"; прекъсване; случай 3: ехо "<Н3>Заглавие 3"; прекъсване; ) ) ?>

В резултат на това, ако стартирате test_curl.php, ще видите съобщението „Заглавие 1“ на екрана, можете да експериментирате с подаването на id параметри ( в този случай 2 или 3).

Пример за CURL - извикване на отдалечен скрипт и получаване на резултата

Сега нека се опитаме да извикаме скрипта и да получим резултата, за да го обработим по-късно, например, нека използваме метода POST. Нека оставим имената на файловете същите.

Код test_curl.php

Код test.php

И ако стартираме test_curl.php, тогава на екрана ще се покаже 111, т.е. 1.11, получено в резултат на достъп до отдалечен скрипт, умножено по 100.

Сега нека поговорим за функциите и техните константи.

Често използвани CURL функции и константи

  • curl_init - Инициализира сесия;
  • curl_close - Затваря сесията;
  • curl_exec - Изпълнява заявка;
  • curl_errno - Връща кода на грешката;
  • curl_setopt - Задава параметър за сесията, например:
    • CURLOPT_HEADER – стойност 1 означава, че трябва да се върнат заглавки;
    • CURLOPT_INFILESIZE - параметър за указване на очаквания размер на файла;
    • CURLOPT_VERBOSE - стойност 1 означава, че CURL ще показва подробни съобщения за всички извършени операции;
    • CURLOPT_NOPROGRESS – забранява индикатора за напредък на операцията, стойност 1;
    • CURLOPT_NOBODY – ако не се нуждаете от документ, а само от заглавки, тогава задайте стойност на 1;
    • CURLOPT_UPLOAD - за качване на файл на сървъра;
    • CURLOPT_POST – изпълнение на заявка чрез метода POST;
    • CURLOPT_FTPLISTONLY — получаване на списък с файлове в директорията на FTP сървъра, стойност 1;
    • CURLOPT_PUT — изпълни заявка, използвайки метода PUT, стойност 1;
    • CURLOPT_RETURNTRANSFER - връща резултата, без да го извежда в браузъра, стойност 1;
    • CURLOPT_TIMEOUT – максимално време за изпълнение в секунди;
    • CURLOPT_URL – посочване на адрес за контакт;
    • CURLOPT_USERPWD - низ с потребителско име и парола във формата :;
    • CURLOPT_POSTFIELDS – данни за POST заявка;
    • CURLOPT_REFERER - задава стойността на HTTP хедъра “Referer:”;
    • CURLOPT_USERAGENT - задава стойността на HTTP хедъра “User-Agent:”;
    • CURLOPT_COOKIE — съдържанието на заглавката „Cookie:“, която ще бъде изпратена с HTTP заявката;
    • CURLOPT_SSLCERT - име на файла със сертификата в PEM формат;
    • CURLOPT_SSL_VERIFYPEER – стойност 0, за да забраните проверката на сертификата на отдалечения сървър (по подразбиране 1);
    • CURLOPT_SSLCERTPASSWD — парола за файла със сертификата.
  • curl_getinfo - Връща информация за операцията, вторият параметър може да бъде константа, за да посочи какво точно трябва да се покаже, например:
    • CURLINFO_EFFECTIVE_URL - последно използван URL;
    • CURLINFO_HTTP_CODE - последно получен HTTP код;
    • CURLINFO_FILETIME — дата на модификация на заредения документ;
    • CURLINFO_TOTAL_TIME — време за изпълнение на операцията в секунди;
    • CURLINFO_NAMELOOKUP_TIME — време за разрешаване на името на сървъра в секунди;
    • CURLINFO_CONNECT_TIME — време, прекарано за установяване на връзка, в секунди;
    • CURLINFO_PRETRANSFER_TIME — време, изминало от началото на операцията до готовност за реален трансфер на данни, в секунди;
    • CURLINFO_STARTTRANSFER_TIME — време, изминало от началото на операцията до прехвърлянето на първия байт данни, в секунди;
    • CURLINFO_REDIRECT_TIME — време, изразходвано за пренасочване, в секунди;
    • CURLINFO_SIZE_UPLOAD - брой байтове при качване;
    • CURLINFO_SIZE_DOWNLOAD - брой байтове при изтегляне;
    • CURLINFO_SPEED_DOWNLOAD - средна скорост на изтегляне;
    • CURLINFO_SPEED_UPLOAD - средна скорост на изтегляне;
    • CURLINFO_HEADER_SIZE - общият размер на всички получени заглавки;
    • CURLINFO_REQUEST_SIZE - общият размер на всички изпратени заявки;
    • CURLINFO_SSL_VERIFYRESULT - резултатът от проверката на SSL сертификата, поискан чрез настройка на параметъра CURLOPT_SSL_VERIFYPEER;
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD - размерът на изтегления документ, прочетен от хедъра Content-Length;
    • CURLINFO_CONTENT_LENGTH_UPLOAD - размер на качените данни;
    • CURLINFO_CONTENT_TYPE - съдържанието на получената заглавка Content-type или NULL, ако тази заглавка не е получена.

Можете да научите повече за CURL функциите и константите за тях на официалния уебсайт на PHP -

Споделете