Curl nu funcționează. Perfecționează-ți abilitățile cu cURL. Reapeluri

cURL este un instrument special conceput pentru a transfera fișiere și date folosind sintaxa URL. Această tehnologie acceptă multe protocoale, cum ar fi HTTP, FTP, TELNET și multe altele. cURL a fost conceput inițial pentru a fi un instrument de linie de comandă. Din fericire pentru noi, biblioteca cURL este suportată de limbajul de programare PHP. În acest articol, ne vom uita la unele dintre caracteristicile avansate cURL, precum și vom aborda aplicarea practică a cunoștințelor dobândite folosind PHP.

De ce cURL?

De fapt, există destul de multe modalități alternative de a prelua conținutul unei pagini web. În multe cazuri, mai ales din lene, am folosit funcții PHP simple în loc de cURL:

$content = file_get_contents("http://www.nettuts.com"); // sau $linii = fisier("http://www.nettuts.com"); // sau readfile ("http://www.nettuts.com");

Cu toate acestea, aceste funcții practic nu au flexibilitate și conțin un număr mare de deficiențe în ceea ce privește gestionarea erorilor și așa mai departe. În plus, există anumite sarcini pe care pur și simplu nu le puteți rezolva cu aceste funcții standard: interacțiunea cu cookie-uri, autentificare, trimiterea unui formular, încărcarea fișierelor și așa mai departe.

cURL este o bibliotecă puternică care acceptă multe protocoale și opțiuni diferite și oferă informații detaliate despre solicitările URL.

Structură de bază

  • Inițializare
  • Atribuirea parametrilor
  • Executarea și preluarea rezultatului
  • Eliberarea memoriei

// 1. initializare $ch = curl_init(); // 2. specificați opțiuni, inclusiv url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. obține HTML ca rezultat $output = curl_exec($ch); // 4. închide conexiunea curl_close($ch);

Pasul #2 (adică apelarea curl_setopt()) va fi discutat în acest articol mult mai mult decât toți ceilalți pași, deoarece. în această etapă, se întâmplă toate cele mai interesante și utile lucruri pe care trebuie să le știi. Există un număr mare de opțiuni diferite în cURL care trebuie specificate pentru a putea configura o solicitare URL în modul cel mai complet. Nu vom lua în considerare întreaga listă ca un întreg, ci ne vom concentra doar pe ceea ce consider necesar și util pentru această lecție. Orice altceva le puteți explora singur dacă acest subiect vă interesează.

Verificare erori

În plus, puteți utiliza, de asemenea, instrucțiuni condiționale pentru a testa dacă o operație a reușit:

// ... $ieșire = curl_exec($ch); if ($ieșire === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...

Aici vă rog să rețineți un punct foarte important pentru dvs.: trebuie să folosim „=== false” pentru comparație, în loc de „== fals”. Pentru cei care nu cunosc, acest lucru ne va ajuta să distingem între un rezultat gol și o valoare booleană falsă, care va indica o eroare.

Primirea informațiilor

Un alt pas suplimentar este să obțineți date despre cererea cURL după ce aceasta a fost executată.

// ... curl_exec($ch); $info = curl_getinfo($ch); ecou „Luat” . $info["total_time"] . „secunde pentru url”. $info["url"]; // ...

Matricea returnată conține următoarele informații:

  • "url"
  • "tipul de conținut"
  • http_code
  • „header_size”
  • "request_size"
  • „timpul fișierului”
  • „ssl_verify_result”
  • „redirect_count”
  • "timpul total"
  • „namelookup_time”
  • „connect_time”
  • "pretransfer_time"
  • „size_upload”
  • dimensiune_descărcare
  • „viteză_descărcare”
  • „speed_upload”
  • „download_content_length”
  • „încărcare_conținut_lungime”
  • „starttransfer_time”
  • "redirect_time"

Detectarea redirecționării în funcție de browser

În acest prim exemplu, vom scrie cod care poate detecta redirecționările URL pe baza diferitelor setări ale browserului. De exemplu, unele site-uri web redirecționează browserele unui telefon mobil sau ale oricărui alt dispozitiv.

Vom folosi opțiunea CURLOPT_HTTPHEADER pentru a determina antetele noastre HTTP de ieșire, inclusiv numele browserului utilizatorului și limbile disponibile. În cele din urmă, vom putea determina ce site-uri ne redirecționează către adrese URL diferite.

// URL de testare $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testarea browserelor $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" => array ("user_agent" => "Mozilla/5.0 (iPhone; U); ; CPU ca Mac OS X; ro) AppleWebKit/420+ (KHTML, cum ar fi Gecko) Versiunea/3.0 Mobile/1A537a Safari/419.3", "limba" => "ro"), "franceză" => matrice ("user_agent" => "Mozilla/4.0 (compatibil; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "limba" => "fr,fr-FR;q=0.5"); foreach ($urls ca $url) ( echo „URL: $url\n”; foreach ($browsers ca $test_name => $browser) ( $ch = curl_init(); // specificați url curl_setopt($ch, CURLOPT_URL, $url); // setați antetele browserului curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language"])" ) ); // nu avem nevoie de conținutul paginii curl_setopt($ch, CURLOPT_NOBODY, 1); // trebuie să obținem antete HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // returnează rezultate în loc de curl_setopt($ch) , CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // A existat o redirecționare HTTP? if (preg_match("!Location: (.*)!", $output, $match) ) ( echo " $nume_test: redirecționează către $potriviri\n"; ) else ( echo "$nume_test: fără redirecționare\n"; ) ) echo "\n\n"; )

Mai întâi, specificăm o listă de adrese URL ale site-urilor pe care le vom verifica. Mai exact, avem nevoie de adresele acestor site-uri. În continuare, trebuie să definim setările browserului pentru a testa fiecare dintre aceste adrese URL. După aceea, vom folosi o buclă în care vom parcurge toate rezultatele obținute.

Trucul pe care îl folosim în acest exemplu pentru a seta setările cURL ne va permite să obținem nu conținutul paginii, ci doar anteturile HTTP (stocate în $output). Apoi, folosind o regex simplă, putem determina dacă șirul „Locație:” a fost prezent în anteturile primite.

Când rulați acest cod, ar trebui să obțineți ceva de genul acesta:

Efectuarea unei solicitări POST către o anumită adresă URL

Când se formează o solicitare GET, datele transmise pot fi transmise la adresa URL printr-un „șir de interogare”. De exemplu, când efectuați o căutare pe Google, termenul de căutare este plasat în bara de adrese a noii adrese URL:

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

Nu trebuie să utilizați cURL pentru a simula această solicitare. Dacă lenea te învinge în sfârșit, folosește funcția „file_get_contents ()” pentru a obține rezultatul.

Dar lucrul este că unele formulare HTML trimit solicitări POST. Datele acestor formulare sunt transportate prin corpul cererii HTTP, și nu ca în cazul precedent. De exemplu, dacă ați completat un formular pe un forum și ați făcut clic pe butonul de căutare, atunci cel mai probabil va fi făcută o solicitare POST:

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

Putem scrie un script PHP care poate simula acest tip de solicitare URL. Mai întâi, să creăm un fișier simplu pentru a accepta și afișa datele POST. Să-i spunem post_output.php:

Print_r($_POST);

Apoi creăm un script PHP pentru a executa solicitarea cURL:

$url = "http://localhost/post_output.php"; $post_data = array("foo" => "bar", "query" => "Nettuts", "action" => "Trimite"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // indică faptul că avem o cerere POST curl_setopt($ch, CURLOPT_POST, 1); // adaugă variabile curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când rulați acest script, ar trebui să obțineți un rezultat similar:

Astfel, cererea POST a fost trimisă către scriptul post_output.php, care la rândul său a scos în evidență matricea superglobală $_POST, al cărei conținut l-am obținut folosind cURL.

Fișier încărcat

Mai întâi, să creăm un fișier pentru al forma și să-l trimitem în fișierul upload_output.php:

Print_r($_FILES);

Și iată codul de script care realizează funcționalitatea de mai sus:

$url = "http://localhost/upload_output.php"; $post_data = matrice ("foo" => "bar", // fișier pentru a încărca "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); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când doriți să încărcați un fișier, tot ce trebuie să faceți este să îl transmiteți ca variabilă post obișnuită, precedată de simbolul @. Când rulați scriptul scris, veți obține următorul rezultat:

CURL multiple

Unul dintre cele mai mari puncte forte ale cURL este capacitatea de a crea „mai multe” handlere cURL. Acest lucru vă permite să deschideți o conexiune la mai multe adrese URL în același timp și asincron.

În versiunea clasică a cererii cURL, execuția scriptului este suspendată, iar operația de solicitare URL este de așteptat să se finalizeze, după care scriptul poate continua. Dacă intenționați să interacționați cu o mulțime de adrese URL, acest lucru va consuma destul de mult timp, deoarece în cazul clasic puteți lucra doar cu o singură adresă URL la un moment dat. Cu toate acestea, putem remedia această situație utilizând handlere speciali.

Să aruncăm o privire la exemplul de cod pe care l-am luat de pe php.net:

// creează câteva resurse cURL $ch1 = curl_init(); $ch2 = curl_init(); // specificați URL-ul și alți parametri 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); //creez un handler cURL multiplu $mh = curl_multi_init(); //adăugarea mai multor handlere curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $activ = nul; //execuție do ( $mrc ​​​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($activ && $mrc ​​​​== CURLM_OK) ( dacă (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) //închide curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideea este că puteți utiliza mai mulți handlere cURL. Folosind o buclă simplă, puteți urmări ce solicitări nu au fost încă finalizate.

În acest exemplu, există două bucle principale. Prima buclă do-while apelează funcția curl_multi_exec(). Această caracteristică nu este blocată. Se execută cât de repede poate și returnează starea cererii. În timp ce valoarea returnată este constanta „CURLM_CALL_MULTI_PERFORM”, aceasta înseamnă că munca nu a fost încă finalizată (de exemplu, anteturile http din adresa URL sunt trimise în prezent); De aceea continuăm să verificăm această valoare de returnare până când obținem un rezultat diferit.

În bucla următoare, verificăm condiția în timp ce $activ = „adevărat”. Este al doilea parametru al funcției curl_multi_exec(). Valoarea acestei variabile va fi „adevărată” atâta timp cât oricare dintre modificările existente este activă. Apoi, numim funcția curl_multi_select(). Execuția sa „blochează” atâta timp cât există cel puțin o conexiune activă, până când se primește un răspuns. Când se întâmplă acest lucru, ne întoarcem la bucla principală pentru a continua să executăm cereri.

Și acum să aplicăm ceea ce am învățat cu un exemplu care va fi cu adevărat util pentru un număr mare de oameni.

Verificarea linkurilor în WordPress

Imaginați-vă un blog cu un număr mare de postări și mesaje, fiecare dintre ele având link-uri către resurse externe de internet. Unele dintre aceste link-uri ar putea fi deja „moarte” din diverse motive. Poate că pagina a fost ștearsă sau site-ul nu funcționează deloc.

Vom crea un script care va analiza toate linkurile și va găsi site-uri web care nu se încarcă și 404 pagini, apoi ne va oferi un raport foarte detaliat.

Voi spune imediat că acesta nu este un exemplu de creare a unui plugin pentru WordPress. Acesta este aproape totul un teren de testare bun pentru noi.

Să începem în sfârșit. Mai întâi trebuie să preluăm toate linkurile din baza de date:

// configurare $db_host = "localhost"; $db_user = „rădăcină”; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inițializarea variabilei $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $activ = nul; // se conectează la MySQL dacă (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nu s-a putut conecta: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Poate not select db: " . mysql_error()); ) // selectează toate postările publicate cu link-uri $q = "SELECTează post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post"" ; $r = mysql_query($q) sau die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // preia link-uri folosind expresii regulate if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $ potriviri) ) ( foreach ($se potrivește ca $url) ( $tmp = parse_url($url); if (in_array($tmp["gazdă"], $excluded_domains)) (continuare; ) $url_list = $url; ) ) ) / / elimina duplicatele $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Fără URL de verificat"); )

Mai întâi, generăm date de configurare pentru interacțiunea cu baza de date, apoi scriem o listă de domenii care nu vor participa la verificare ($excluded_domains). De asemenea, definim un număr care caracterizează numărul maxim de conexiuni simultane pe care le vom folosi în scriptul nostru ($max_connections). Apoi ne alăturăm bazei de date, selectăm postările care conțin link-uri și le acumulăm într-o matrice ($url_list).

Următorul cod este puțin complex, așa că înțelegeți-l de la început până la sfârșit:

// 1. handler multiplu $mh = curl_multi_init(); // 2. adăugați o mulțime de adrese URL pentru ($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; } }

Aici voi încerca să pun totul pe rafturi. Numerele din listă corespund numerelor din comentariu.

  1. 1. Creați un handler multiplu;
  2. 2. Vom scrie funcția add_url_to_multi_handle() puțin mai târziu. De fiecare dată când este apelat, o nouă adresă URL va fi procesată. Inițial, adăugăm 10 ($max_connections) URL-uri;
  3. 3. Pentru a începe, trebuie să rulăm funcția curl_multi_exec(). Atâta timp cât returnează CURLM_CALL_MULTI_PERFORM, mai avem ceva de făcut. Avem nevoie de acest lucru în principal pentru a crea conexiuni;
  4. 4. Urmează bucla principală, care va fi executată atâta timp cât avem cel puțin o conexiune activă;
  5. 5. curl_multi_select() se blochează așteptând finalizarea căutării URL;
  6. 6. Încă o dată, trebuie să obținem cURL pentru a lucra, și anume pentru a prelua datele de răspuns returnate;
  7. 7. Informațiile sunt verificate aici. Ca urmare a cererii, va fi returnat o matrice;
  8. 8. Tabloul returnat conține un handler cURL. Acesta este ceea ce vom folosi pentru a prelua informații despre o anumită solicitare cURL;
  9. 9. Dacă linkul era mort sau scriptul nu mai avea timp, atunci nu ar trebui să căutăm niciun cod http;
  10. 10. Dacă linkul ne-a returnat o pagină 404, atunci codul http va conține valoarea 404;
  11. 11. În caz contrar, avem o legătură de lucru în fața noastră. (Puteți adăuga verificări suplimentare pentru codul de eroare 500, etc...);
  12. 12. În continuare, eliminăm handlerul cURL pentru că nu mai avem nevoie de el;
  13. 13. Acum putem adăuga o altă adresă URL și rula tot ce am vorbit înainte;
  14. 14. La acest pas, scriptul își încheie activitatea. Putem elimina tot ce nu avem nevoie și putem genera un raport;
  15. 15. În final, vom scrie o funcție care va adăuga o adresă URL la handler. Variabila statică $index va fi incrementată de fiecare dată când această funcție este apelată.

Am folosit acest script pe blogul meu (cu câteva link-uri întrerupte adăugate intenționat pentru a-l testa) și am obținut următorul rezultat:

În cazul meu, scriptul a durat mai puțin de 2 secunde pentru a rula prin 40 de adrese URL. Câștigul de performanță este semnificativ atunci când aveți de-a face cu și mai multe adrese URL. Dacă deschideți zece conexiuni în același timp, scriptul poate rula de zece ori mai repede.

Câteva cuvinte despre alte opțiuni utile de cURL

Autentificare HTTP

Dacă adresa URL are autentificare HTTP, atunci puteți utiliza cu ușurință următorul script:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specificați numele de utilizator și parola curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // dacă redirecționarea este permisă curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // apoi salvăm datele noastre în cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $ieșire = curl_exec($ch); curl_close($ch);

Încărcare FTP

PHP are și o bibliotecă pentru lucrul cu FTP, dar nimic nu vă împiedică să utilizați instrumentele cURL aici:

// deschide fisierul $fisier = fopen("/cale/spre/fisier", "r"); // URL-ul ar trebui să conțină următorul conținut $url = "ftp://nume utilizator: [email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, file size("/path/to/file")); // specificați modul ASCII curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch); curl_close($ch);

Utilizarea unui proxy

Puteți solicita adresa URL printr-un proxy:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specifica adresa curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // dacă trebuie să furnizați un nume de utilizator și o parolă curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $ieșire = curl_exec($ch); curl_close($ch);

Reapeluri

De asemenea, este posibil să specificați o funcție care va fi declanșată chiar înainte de finalizarea cererii cURL. De exemplu, în timp ce conținutul unui răspuns se încarcă, puteți începe să utilizați datele fără a aștepta să se încarce complet.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funcție_progres"); curl_exec($ch); curl_close($ch); function progress_function($ch,$str) ( echo $str; return strlen($str); )

O astfel de funcție TREBUIE să returneze lungimea șirului, ceea ce este o cerință.

Concluzie

Astăzi ne-am familiarizat cu modul în care puteți folosi biblioteca cURL în propriile scopuri egoiste. Sper că v-a plăcut acest articol.

Mulțumesc! Să aveţi o zi bună!

Avem: php 5.2.3, Windows XP, Apache 1.3.33
Problemă - modulul cURL nu este detectat dacă PHP este rulat de sub Apache
În php.ini extensia=php_curl.dll nu este comentată, extension_dir este setat corect,
libeay32.dll și ssleay32.dll sunt copiate în c:\windows\system32.
Cu toate acestea, funcția phpinfo() nu afișează modulul cURL printre cele instalate, iar atunci când Apache pornește, în jurnal se scrie următoarele:

Pornire PHP: Nu se poate încărca biblioteca dinamică „c:/php/ext/php_curl.dll” - Modulul specificat nu a putut fi găsit.

Dacă rulați php din linia de comandă, atunci scripturile care conțin comenzi de la cURL funcționează bine, iar dacă îl rulați de sub Apache, dau următoarele:
Eroare fatală: Apel la funcția nedefinită: curl_init() - și indiferent de modul în care este instalat PHP - ca CGI sau ca modul.

Pe Internet, am întâlnit în mod repetat o descriere a acestei probleme - în special pentru modulul cURL, dar soluțiile care au fost propuse acolo nu ajută. Și am schimbat deja PHP 5.2 în PHP 5.2.3 - tot nu a ajutat.

David Mzareulyan [dosar]
Am un php.ini - l-am verificat căutând pe disc. Faptul că se folosește același php.ini este ușor confirmat și de faptul că modificările aduse acestuia afectează atât lansarea scripturilor de sub Apache, cât și din linia de comandă.

Daniil Ivanov [dosar] Mai bine faceți un fișier cu un apel

și deschideți-l cu un browser.
Și apoi rulați php -i | grep ini și verificați căile către php.ini așa cum le vede php, nu după prezența fișierului pe disc.

Daniil Ivanov [dosar] Ce iese php -i? Binarul implicit poate căuta configurația în altă parte, în funcție de opțiunile de compilare. Nu este prima dată când dau peste faptul că mod_php.dll și php.exe se uită la diferite fișiere ini și ceea ce funcționează într-unul nu funcționează în celălalt.

Vasili Sviridov [dosar]
php -i produce următoarele:

Calea fișierului de configurare (php.ini) => C:\WINDOWS
Fișier de configurare încărcat => C:\PHP\php.ini

Mutarea fișierului php.ini în directorul Windows nu schimbă situația.

Daniil Ivanov [dosar]
Ce zici de restul modulelor? De exemplu php_mysql??? Te conectezi? Sau este doar cURL care este atât de urât?

Hmm, nici la mine nu se incarca... Pe o configuratie foarte diferita (Apache 2.2 plus PHP 5.1.6 sub Zend Studio). Dar nu asta este ideea. Un experiment cu rularea Apache din linia de comandă (mai precis de la FAR) a arătat ceva interesant. Fără a încerca să conectați Kurl - totul începe într-un pachet. Când încercați să vă conectați, Kurl dă o eroare în ... php5ts.dll.

Salut!
Am avut o problemă similară, am căutat o soluție de mult timp, am instalat o versiune mai nouă de PHP și, în cele din urmă, am găsit acest forum. Nu a fost nicio soluție aici, așa că am încercat și eu în continuare.

Mi-am înființat un studio zend și înainte de asta a existat o versiune anterioară de PHP. Poate că unul dintre ei și-a instalat bibliotecile și au rămas acolo - învechite.

Mulțumesc pentru sfaturi, în special pentru ultimul de la „Nehxby”. Am intrat în C:\windows\system32 și am descoperit că bibliotecile libeay32.dll și ssleay32.dll nu au aceeași dimensiune cu cele originale. Am instalat memcached, poate după aceea. Deci, dacă ați adăugat chot, în system32 mergeți :)

a avut aceeași problemă, a folosit comanda php -i | grep ini
a arătat că biblioteca zlib1.dll lipsește
era in folderul cu Apache, am scris o copie in folderul cu PHP
Am repetat comanda, a arătat că biblioteca zlib.dll nu a fost suficientă, am scris-o în folderul Apache și a funcționat totul.
și toate bibliotecile erau, de asemenea, php5ts.dll, așa că luați în considerare prezența tuturor bibliotecilor necesare.

Hotărât să adauge. Pentru că și eu m-am confruntat cu această problemă. Am dat peste acest forum printr-un link pe alt site. În general, toate opțiunile propuse nu sunt altceva decât cârje. esența soluției în Windows. trebuie să setați variabila PATH. specificând unde aveți PHP. iar Hallelujah curl nu aruncă nicio eroare. ca si alte biblioteci...

Cei care folosesc cURL după actualizările la 5.6.1, 5.5.17 s-au confruntat cu faptul că modulul cURL nu mai funcționează. Problema nu a dispărut de atunci. Chiar și în cea mai recentă versiune a PHP 5.6.4, această problemă a persistat.

Cum știi dacă cURL funcționează pentru tine?

Creați un fișier php și copiați acolo:

Deschide-l de pe server. Dacă rezultatul este ceva de genul:

Array ( => 468736 => 3 => 3997 => 0 => 7.39.0 => x86_64-pc-win32 => OpenSSL/1.0.1j => 1.2.7.3 => Array ( => dict => fisier => ftp => ftps => gopher => http => https => imap => imaps => ldap => pop3 => pop3s => rtsp => scp => sftp => smtp => smtps => telnet => tftp) )

Deci cURL este în regulă, dacă în schimb este o eroare PHP, atunci există o problemă.

Mai întâi, desigur, verificați fișierul php.ini, găsiți linia acolo

Extensie=php_curl.dll

Și asigurați-vă că nu este precedat de punct și virgulă.

Dacă acesta este cazul și cURL nu funcționează, atunci poate fi efectuat un alt test pentru a confirma situația neobișnuită. Creați un alt fișier php cu conținut:

Căutați cURL în browser, dacă există o singură potrivire, atunci modulul cURL nu este încărcat:

În același timp, atât Apache, cât și PHP funcționează ca de obicei.

Trei solutii:

  1. Metoda unu (nu kosher). Dacă aveți PHP 5.6.*, atunci luați versiunea PHP 5.6.0, de acolo luați vechiul fișier php_curl.dll și înlocuiți-l cu cel nou din versiunea, de exemplu, PHP 5.6.4. Pentru cei cu PHP 5.5.17 și mai sus, trebuie să luați același fișier din PHP 5.5.16 și să-l înlocuiți. Singura problemă aici este să găsiți aceste versiuni vechi. Puteți, desigur, să căutați în http://windows.php.net/downloads/snaps/php-5.6 , dar personal nu am găsit acolo ceea ce aveam nevoie. Și decizia în sine nu este cumva cușer.
  2. A doua metodă (foarte rapidă, dar nici cușer). Copiați fișierul libssh2.dll din directorul PHP în directorul Apache24bin și reporniți Apache.
  3. Metoda trei (cușer - oamenii cușer aplaudă în picioare). Trebuie să adăugați directorul PHP la PATH. Cum se face acest lucru este descris foarte bine în documentația oficială.

Verificăm:

Voila, secțiunea cURL este pe loc.

De ce este asta? De unde a apărut această problemă? Nu există niciun răspuns la această întrebare, deși mecanismul apariției sale a fost deja descris.

Problema pare să fie legată de faptul că 5.6.1 trebuia să fie lansat cu un libcurl actualizat 7.38.0. Dar acest lucru nu se știe cu siguranță, autorii PHP dă din cap la Apache, spunând că există niște bug-uri acolo.

Mecanismul problemei: dacă directorul PHP nu este inclus în PATH de sistem, atunci când serviciul Apache pornește, acesta nu poate găsi un nou dll (libssh2.dll), care este o dependență pentru php_curl.

Rapoarte de erori relevante:

Eroare fatală: apel la funcția nedefinită curl_multi_init() în...

În general, au existat probleme cu cURL în PHP, se pare, dacă nu întotdeauna, atunci foarte des. În procesul de căutare pe Google a problemei mele, am dat peste fire, dintre care unele aveau mai mult de o duzină de ani.

În plus, căutarea pe google a mai dat câteva concluzii:

Există destule „instrucțiuni pentru proști” pe Internet, în care spun în detaliu, cu imagini, cum să decomentezi linia extension=php_curl.dll din fișierul php.ini.

Pe site-ul oficial PHP, în secțiunea despre instalarea cURL, există doar două sugestii referitoare la sistemul Windows:

Pentru a lucra cu acest modul pe Windows, fișierele libeay32.dll și ssleay32.dll trebuie să existe în variabila de mediu PATH de sistem. Nu aveți nevoie de fișierul libcurl.dll de pe site-ul cURL.

Le-am citit de zece ori. Am trecut la engleză și am mai citit de câteva ori în engleză. De fiecare dată, din ce în ce mai convins că aceste două propoziții au fost scrise de animale, sau cineva pur și simplu a sărit pe tastatură - nu le înțeleg sensul.

Există și câteva sfaturi și instrucțiuni nebunești (chiar am reușit să încerc câteva).

Pe site-ul de raportare a erorilor PHP, am ajuns deja să rezolv necesitatea de a include directorul cu PHP în variabila de sistem PATH.

În general, pentru cei care au o problemă cu cURL și care trebuie să „includă un director cu PHP în variabila de sistem PATH”, mergi la instrucțiunea deja menționată mai sus http://php.net/manual/en/faq.installation .php#faq .installation.addtopath . Totul este simplu acolo și, cel mai important, ceea ce trebuie făcut este scris în limbaj uman.

  • Serghei Savenkov

    un fel de recenzie „rare”... parcă s-ar grăbi undeva