Тези, които използват cURL след актуализации до 5.6.1, 5.5.17, се сблъскаха с факта, че модулът cURL спря да работи. Оттогава проблемът не е изчезнал. Дори в най-новата версия на PHP 5.6.4 този проблем продължава.

Как да разберете дали cURL работи за вас?

Създавайте php файли копирайте там:

Отворете го от сървъра. Ако изходът е нещо като:

Масив ( => 468736 => 3 => 3997 => 0 => 7.39.0 => x86_64-pc-win32 => OpenSSL/1.0.1j => 1.2.7.3 => Масив ( => dict => файл => ftp => ftps => gopher => http => https => imap => imaps => ldap => pop3 => pop3s => rtsp => scp => sftp => smtp => smtps => telnet => tftp) )

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

Първо, разбира се, проверете файла php.ini, намерете реда там

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

И се уверете, че не е предшествано от точка и запетая.

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

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

В същото време и Apache, и PHP работят както обикновено.

Три решения:

  1. Метод първи (не кошер). Ако имате PHP 5.6.*, тогава вземете версията на PHP 5.6.0, оттам вземете стария файл php_curl.dll и го заменете с вашия нов от версията, например PHP 5.6.4. За тези с PHP 5.5.17 и по-нова версия, трябва да вземете същия файл от PHP 5.5.16 и да го замените също. Единственият проблем тук е да намерите тези стари версии. Можете, разбира се, да поровите в http://windows.php.net/downloads/snaps/php-5.6 , но лично аз не намерих това, което ми трябваше там. А и самото решение някак не е съвсем кошерно.
  2. Вторият метод (много бърз, но също не кошер). Копирайте файла libssh2.dll от PHP директорията в директорията Apache24bin и рестартирайте Apache.
  3. Трети метод (кошер – кашер хората ръкопляскат изправени). Трябва да добавите вашата PHP директория към PATH. Как да направите това е много добре описано в официалната документация.

Ние проверяваме:

Воала, секцията cURL е на мястото си.

Защо така? Откъде идва този проблем? На този въпрос няма отговор, въпреки че механизмът на възникването му вече е описан.

Проблемът изглежда е свързан с факта, че 5.6.1 трябваше да бъде пуснат с актуализиран libcurl 7.38.0. Но това не е известно със сигурност, авторите на PHP кимат към Apache, казвайки, че има някои грешки там.

Механизмът на проблема: ако системният PATH не е включен PHP директория, тогава, когато услугата Apache стартира, тя не може да намери новата dll (libssh2.dll), която е зависимост за php_curl.

Съответни доклади за грешки:

Фатална грешка: Извикване на недефинирана функция curl_multi_init() в ...

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

В допълнение, гугълът даде още няколко заключения:

В интернет има достатъчно "инструкции за глупаци", в които подробно, със снимки, се разказва как да се разкоментира редът extension=php_curl.dll във файла php.ini.

На официалния сайт на PHP, в раздела за инсталиране на cURL, има само две предложения относно системата Windows:

За да работите с този модул в Windows файлове libeay32.dll и ssleay32.dll трябва да съществуват в системата променлива на средатаПЪТЕКА. Нямате нужда от файла libcurl.dll от сайта cURL.

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

Има и някои луди съвети и инструкции (дори успях да опитам някои).

На сайта за докладване на грешки в PHP вече се доближих до разгадаването на необходимостта от включване на директорията с PHP в системната променлива PATH.

Като цяло, за тези, които имат проблем с cURL и които трябва да „включат директория с PHP в системната променлива PATH“, отидете на инструкцията, вече спомената по-горе http://php.net/manual/ru/faq.installation .php#faq .installation.addtopath . Там всичко е просто и най-важното е, че това, което трябва да се направи, е написано на човешки език.

Имаме: php 5.2.3, Windows XP, Apache 1.3.33
Проблем - cURL модулът не се открива, ако PHP се стартира от Apache
В php.ini extension=php_curl.dll не е коментиран, extension_dir е зададен правилно,
libeay32.dll и ssleay32.dll се копират в c:\windows\system32.
Функцията phpinfo() обаче не показва cURL модула сред инсталираните и когато Apache стартира, в дневника се записва следното:

Стартиране на PHP: Не може да се зареди динамична библиотека "c:/php/ext/php_curl.dll" - Посоченият модул не може да бъде намерен.

Ако стартирате php от командна линия, тогава скриптовете, съдържащи команди от cURL, работят добре и ако се стартират от Apache, те дават следното:
Фатална грешка: Извикване на недефинирана функция: curl_init() - и независимо как е инсталиран PHP - като CGI или като модул.

В интернет многократно попадах на описание на този проблем - специално за модула cURL, но решенията, които бяха предложени там, не помагат. И вече промених PHP 5.2 на PHP 5.2.3 - пак не помогна.

Давид Мзареулян [досие]
Имам един php.ini - проверих го с търсене в диска. Фактът, че се използва един и същ php.ini, също се потвърждава лесно от факта, че промените, направени в него, засягат както стартирането на скриптове от Apache, така и от командния ред.

Даниил Иванов [досие] По-добре направете файл с обаждане

и го отворете с браузър.
И след това стартирайте в командата php ред-i | grep ini и проверете пътищата до php.ini така, както ги вижда php, а не според наличието на файла на диска.

Даниил Иванов [досие] Какво извежда php -i? Двоичният файл по подразбиране може да търси конфигурацията другаде, в зависимост от опциите за компилиране. Не за първи път се сблъсквам с това, че mod_php.dll и php.exe разглеждат различни ini файлове и това, което работи в единия, не работи в другия.

Василий Свиридов [досие]
php -i произвежда следното:

Път на конфигурационен файл (php.ini) => C:\WINDOWS
Зареден конфигурационен файл => C:\PHP\php.ini

Преместване на файла php.ini в директория Windows ситуациине се променя.

Даниил Иванов [досие]
Какво ще кажете за останалите модули? Например php_mysql??? Свързване? Или просто cURL е толкова гаден?

Хм, и при мен не се зарежда... На много различна конфигурация (Apache 2.2 плюс PHP 5.1.6 под Zend Studio). Но не това е важното. Експеримент с стартиране на Apache от командния ред (по-точно от FAR) показа нещо интересно. Без да се опитвате да свържете Kurl - всичко започва в пакет. При опит за свързване Kurl дава грешка в ... php5ts.dll.

Здравейте!
Имах подобен проблем, дълго време търсих решение, сложи още нова версия PHP, в крайна сметка намери този форум. Тук нямаше решение, затова опитах допълнително сам.

Настроих zend студио за себе си, а преди това имаше по-ранна версия на PHP. Може би някой от тях е инсталирал библиотеките си и те са останали там - остарели.

Благодаря за съветите, особено последния от "Nehxby". Влязох в C:\windows\system32 и открих, че библиотеките libeay32.dll и ssleay32.dll не са със същия размер като оригиналните. Инсталирах memcached, може би след това. Така че, ако сте добавили chot, отидете в system32 :)

имаше същия проблем, използва командата php -i | grep ini
показа, че библиотеката zlib1.dll липсва
беше в папката с Apache, написах копие в папката с PHP
Повторих командата, показа, че библиотеката zlib.dll не е достатъчна, записах я в папката Apache и всичко работи.
и всички библиотеки също бяха php5ts.dll, така че помислете за наличието на всички необходими библиотеки.

Реших да добавя. Защото и аз се сблъсках с този проблем. Попаднах на този форум чрез връзка в друг сайт. Като цяло всички предложени опции не са нищо повече от патерици. същността на решението в Windows. трябва да зададете променливата PATH. уточнявайки къде имате PHP. и Hallelujah 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". За тези, които не са запознати, това ще ни помогне да направим разлика между празен резултат и фалшива булева стойност, което ще покаже грешка.

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

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

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

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

  • "url"
  • "тип съдържание"
  • http_code
  • „header_size“
  • "request_size"
  • „файлово време“
  • „ssl_verify_result“
  • „redirect_count“
  • "общо време"
  • „namelookup_time“
  • „време за свързване“
  • "време_предпрехвърляне"
  • "size_upload"
  • размер_изтегляне
  • “скорост_изтегляне”
  • “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"])", "Приемане на език: ($browser["език"])" ) ); // нямаме нужда от съдържание на страница curl_setopt($ch, CURLOPT_NOBODY, 1); // трябва да получим HTTP заглавки curl_setopt($ch, CURLOPT_HEADER, 1); // връщане на резултати вместо изход curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // Имаше ли HTTP пренасочване? if (preg_match("!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 = array("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()); докато ($d = mysql_fetch_assoc($r)) ( // извличане на връзки чрез регулярни изрази if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $matches)) ( foreach ($matchs as $url) ( $tmp = parse_url($url) ; if (in_array($tmp["host"], $excluded_domains)) ( continue; ) $url_list = $url; ) ) ) // премахване на дубликати $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")); // посочва ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch); 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 за свои егоистични цели. Надявам се тази статия да ви е харесала.

Благодаря ти! Приятен ден!