Kako pravilno pretraživati koristeći google.com
Vjerovatno svi znaju kako se ovo koristi pretraživač, kao Google =) Ali ne znaju svi da ako pravilno sastavite upit za pretraživanje koristeći posebne konstrukcije, možete postići rezultate onoga što tražite mnogo efikasnije i brže =) U ovom članku pokušat ću pokazati šta i kako morate da uradite kako biste ispravno pretraživali
Google podržava nekoliko naprednih operatora pretraživanja koji imaju posebno značenje prilikom pretraživanja na google.com. Tipično, ovi operateri mijenjaju pretragu ili čak govore Googleu da to uradi u potpunosti razne vrste traži. Na primjer, dizajn link: je poseban operater, a zahtjev link:www.google.com neće vam dati normalnu pretragu, već će umjesto toga pronaći sve web stranice koje imaju veze na google.com.
alternativni tipovi zahtjeva
keš memorija: Ako u svoj upit uključite druge riječi, Google će istaknuti te riječi unutar keširanog dokumenta.
na primjer, cache: www.web stranicaće prikazati keširani sadržaj sa istaknutom riječju "web".
link: Upit za pretragu iznad će prikazati web stranice koje sadrže veze do navedenog upita.
na primjer: link:www.siteće prikazati sve stranice koje imaju link na http://www.site
povezano: Prikazuje web stranice koje su "povezane" sa navedenom web stranicom.
na primjer, povezano: www.google.comće navesti web stranice koje su slične početna stranica Google.
info: Informacije o upitu: predstavit će neke od informacija koje Google ima o web stranici koju tražite.
na primjer, info:websiteće pokazati informacije o našem forumu =) (Armada - Forum za odrasle webmastere).
Ostali zahtjevi za informacijama
definirati: Upit define: će pružiti definiciju riječi koje unesete nakon njega, prikupljene iz različitih izvora na mreži. Definicija će biti za cijelu unesenu frazu (to jest, uključit će sve riječi u tačnom upitu).
dionice: Ako započnete upit s dionicama: Google će obraditi ostatak upita kao simbole dionica i povezati se na stranicu koja prikazuje gotove informacije za ove simbole.
na primjer, dionice: Intel yahooće prikazati informacije o Intelu i Yahoou. (Imajte na umu da biste trebali upisati simbole za najnovije vijesti, a ne naziv kompanije)
Modifikatori upita
stranica: Ako u svoj upit uključite site:, Google će ograničiti rezultate na one web stranice koje pronađe u toj domeni.
Također možete pretraživati po pojedinačnim zonama, kao što su ru, org, com, itd ( site:com site:ru)
allintitle: Ako pokrenete upit sa allintitle:, Google će ograničiti rezultate na sve riječi upita u naslovu.
na primjer, allintitle: google pretraga
će vratiti sve Google stranice pretraživanjem kao što su slike, blog, itd
naslov: Ako u svoj upit uključite intitle:, Google će ograničiti rezultate na dokumente koji sadrže tu riječ u naslovu.
na primjer, naslov: Posao
allinurl: Ako pokrenete upit sa allinurl: Google će ograničiti rezultate na sve riječi upita u URL-u.
na primjer, allinurl: google pretragaće vratiti dokumente sa google i pretražiti u naslovu. Također, kao opciju, možete razdvojiti riječi kosom crtom (/) tada će riječi s obje strane kose crte biti pretraživane na istoj stranici: Primjer allinurl: foo/bar
inurl: Ako u svoj upit uključite inurl:, Google će ograničiti rezultate na dokumente koji sadrže tu riječ u URL-u.
na primjer, Animacija inurl:site
tekst: pretražuje samo navedenu riječ u tekstu stranice, zanemarujući naslov i tekstove linkova i druge stvari koje nisu povezane sa ovim modifikatorom -. allintext: one. dalje, sve riječi u upitu će se pretraživati samo u tekstu, što također može biti važno, zanemarujući često korištene riječi u linkovima
na primjer, intext:forum
raspon datuma: pretraživanja u vremenskom okviru (datumski raspon:2452389-2452389), datumi za vremena su naznačeni u julijanskom formatu.
Pa, i razne druge stvari zanimljivi primjeri zahtjevi
Primjeri pisanja upita za Google. Za spamere
Inurl:control.guest?a=sign
Site:books.dreambook.com “URL početne stranice” “Potpiši moj” inurl:sign
Sajt: www.freegb.net Početna stranica
Inurl:sign.asp “Broj znakova”
“Poruka:” inurl:sign.cfm “Pošiljalac:”
Inurl:register.php “Registracija korisnika” “Website”
Inurl:edu/knjiga gostiju “Upišite se u knjigu gostiju”
Inurl:objavite “Objavite komentar” “URL”
Inurl:/archives/ “Komentari:” “Sjećate se informacija?”
“Skriptu i knjigu gostiju Kreirao:” “URL:” “Komentari:”
Inurl:?action=add “phpBook” “URL”
Naslov: "Pošalji novu priču"
Časopisi
Inurl:www.livejournal.com/users/ mode=reply
Inurl greatestjournal.com/ mode=reply
Inurl:fastbb.ru/re.pl?
Inurl:fastbb.ru /re.pl? "Knjiga gostiju"
Blogovi
Inurl:blogger.com/comment.g?”postID””anonymous”
Inurl:typepad.com/ “Objavite komentar” “Zapamtite lične podatke?”
Inurl:greatestjournal.com/community/ “Objavi komentar” “adrese anonimnih postera”
“Ostavite komentar” “adrese anonimnih postera” -
Naslov: "Objavi komentar"
Inurl:pirillo.com “Objavi komentar”
Forumi
Inurl:gate.html?”name=Forumi” “mode=reply”
Inurl:”forum/posting.php?mode=reply”
Inurl:"mes.php?"
Inurl:”members.html”
Inurl:forum/memberlist.php?”
cURL je poseban alat koji je dizajniran za prijenos datoteka i podataka koristeći URL sintaksu. Ova tehnologija podržava mnoge protokole kao što su HTTP, FTP, TELNET i mnoge druge. cURL je prvobitno dizajniran da bude alat komandna linija. Na našu sreću, cURL biblioteku podržava jezik PHP programiranje. U ovom članku ćemo pogledati neke od naprednih karakteristika cURL-a, a također ćemo ih pokriti praktična primjena stečeno znanje koristeći PHP.
Zašto cURL?
U stvari, ima ih mnogo alternativnim načinima uzorci sadržaja web stranica. U mnogim slučajevima, uglavnom zbog lijenosti, koristio sam jednostavan PHP funkcije umjesto cURL:
$content = file_get_contents("http://www.nettuts.com"); // ili $lines = file("http://www.nettuts.com"); // ili readfile("http://www.nettuts.com");
Međutim, ove funkcije nemaju praktički nikakvu fleksibilnost i sadrže ogroman broj nedostataka u pogledu rukovanja greškama itd. Osim toga, postoje određeni zadaci koje jednostavno ne možete postići sa ovim standardnim funkcijama: interakcija s kolačićima, autentifikacija, podnošenje obrasca, prijenos datoteka itd.
cURL je moćna biblioteka koja podržava mnogo različitih protokola, opcija i pruža detaljne informacije o URL zahtjevima.
Osnovna struktura
- Inicijalizacija
- Dodjela parametara
- Izvršenje i dohvaćanje rezultata
- Oslobađanje memorije
// 1. inicijalizacija $ch = curl_init(); // 2. specificirati parametre, uključujući url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. dobiti HTML kao rezultat $output = curl_exec($ch); // 4. zatvoriti vezu curl_close($ch);
Korak #2 (tj. pozivanje curl_setopt()) će biti razmatran mnogo više u ovom članku nego o svim ostalim koracima, jer U ovoj fazi se dešavaju sve najzanimljivije i najkorisnije stvari koje trebate znati. U cURL-u postoji ogroman broj različitih opcija koje se moraju specificirati da bi se URL zahtjev mogao konfigurirati na najpažljiviji način. Nećemo razmatrati cijelu listu, već ćemo se fokusirati samo na ono što smatram potrebnim i korisnim za ovu lekciju. Sve ostalo možete sami proučiti ako vas ova tema zanima.
Provjera greške
Osim toga, također možete koristiti uslovne izjave za provjeru uspješnosti operacije:
// ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Greška: " . curl_error($ch); ) // ...
Ovdje vas molim da primijetite jednu vrlo važnu stvar: moramo koristiti “=== false” za poređenje, umjesto “== false”. Za one koji nisu upoznati, ovo će nam pomoći da razlikujemo prazan rezultat i logičku vrijednost false, što će ukazivati na grešku.
Dobijanje informacija
Drugi dodatni korak je pribavljanje podataka o cURL zahtjevu nakon što je on izvršen.
// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Uzeo". $info["total_time"] . "sekunde za url". $info["url"]; //…
Vraćeni niz sadrži sljedeće informacije:
- "url"
- "content_type"
- "http_code"
- “header_size”
- “request_size”
- "filetime"
- “ssl_verify_result”
- “redirect_count”
- “ukupno_vrijeme”
- “namelookup_time”
- “connect_time”
- “pretransfer_time”
- “size_upload”
- “size_download”
- “speed_download”
- “speed_upload”
- “download_content_length”
- “upload_content_length”
- “starttransfer_time”
- “redirect_time”
Detekcija preusmeravanja u zavisnosti od pretraživača
U ovom prvom primjeru, napisat ćemo kod koji može otkriti URL preusmjeravanja na osnovu različitih postavki pretraživača. Na primjer, neke web stranice preusmjeravaju preglednike mobilni telefon, ili bilo koji drugi uređaj.
Koristit ćemo opciju CURLOPT_HTTPHEADER da definiramo naša odlazna HTTP zaglavlja, uključujući ime korisnika u pretraživaču i dostupne jezike. Na kraju ćemo moći odrediti koje nas web lokacije preusmjeravaju na različite URL-ove.
// testirati URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testiranje pretraživača $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" => niz ("user_agent" => "Mozilla/5.0 (iPhone; U CPU poput Mac OS X en) AppleWebKit/420+ (KHTML, kao Gecko) Verzija/3.0 Mobile/1A537a Safari/419.3", "jezik" => "en"), "francuski" => niz ("user_agent"; => "Mozilla/4.0 (kompatibilan; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls kao $url) ( echo "URL: $url\n"; foreach ($preglednici kao $test_name => $browser) ( $ch = curl_init(); // specificirajte url curl_setopt($ch, CURLOPT_URL , $url // specificirajte zaglavlja za pretraživač curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Prihvati-Jezik: ($browser["language"]); )" )); // ne treba nam sadržaj stranice curl_setopt($ch, CURLOPT_NOBODY, 1); // trebamo dobiti HTTP zaglavlja curl_setopt($ch, CURLOPT_HEADER, 1); // vraća rezultate umjesto izlaza curl_setopt($ch, CURLOPT_RETURNTRANSFER, $output = curl_close($ch) da li je bilo HTTP preusmjeravanja("!Location: (.*)!"); , $matches) ( echo " $test_name: preusmjerava na $matches\n"; ) else ( echo "$test_name: nema preusmjeravanja\n"; ) ) echo "\n\n";
Prvo navodimo listu URL-ova web lokacija koje ćemo provjeriti. Tačnije, potrebne su nam adrese ovih lokacija. Zatim moramo definirati postavke pretraživača za testiranje svakog od ovih URL-ova. Nakon toga ćemo koristiti petlju u kojoj ćemo proći kroz sve dobijene rezultate.
Trik koji koristimo u ovom primjeru za postavljanje cURL postavki će nam omogućiti da dobijemo ne sadržaj stranice, već samo HTTP zaglavlja (pohranjena u $output). Zatim, koristeći jednostavan regex, možemo utvrditi da li je string “Location:” bio prisutan u primljenim zaglavljima.
Kad trčiš ovaj kod, trebali biste dobiti nešto poput sljedećeg rezultata:
Kreiranje POST zahtjeva za određeni URL
Prilikom formiranja GET zahtjev Preneseni podaci se mogu proslijediti na URL putem „stringa upita“. Na primjer, kada pretražujete Google, pojam za pretraživanje se postavlja u adresnu traku novog URL-a:
Http://www.google.com/search?q=ruseller
U cilju simulacije ovaj zahtjev, ne morate koristiti cURL objekte. Ako vas lijenost potpuno savlada, koristite funkciju “file_get_contents()” da dobijete rezultat.
Ali stvar je u tome što neki HTML obrasci šalju POST zahtjeve. Podaci ovih obrazaca se prenose kroz tijelo HTTP zahtjeva, a ne kao u prethodnom slučaju. Na primjer, ako ste popunili obrazac na forumu i kliknuli na dugme za pretragu, tada će najvjerovatnije biti poslat POST zahtjev:
Http://codeigniter.com/forums/do_search/
Možemo pisati PHP skripta, koji može simulirati ovu vrstu URL-a zahtjeva. Prvo napravimo jednostavnu datoteku za prihvatanje i prikaz POST podaci. Nazovimo ga post_output.php:
Print_r($_POST);
Zatim kreiramo PHP skriptu da napravimo cURL zahtjev:
$url = "http://localhost/post_output.php"; $post_data = niz ("foo" => "bar", "query" => "Nettuts", "action" => "Pošalji"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // označava da imamo POST zahtjev curl_setopt($ch, CURLOPT_POST, 1); // dodaj varijable curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;
Kada pokrenete ovu skriptu trebalo bi da dobijete ovakav rezultat:
Dakle, POST zahtjev je poslan skripti post_output.php, koja zauzvrat izlazi superglobalni niz$_POST, čiji smo sadržaj dobili pomoću cURL-a.
Učitavanje fajla
Prvo, napravimo datoteku kako bismo je generirali i poslali u datoteku upload_output.php:
Print_r($_FILES);
A evo i koda skripte koji izvodi gornju funkcionalnost:
$url = "http://localhost/upload_output.php"; $post_data = niz ("foo" => "bar", // fajl za upload "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); $output = curl_exec($ch); curl_close($ch); echo $output;
Kada želite da otpremite fajl, sve što treba da uradite je da ga prosledite kao normalnu promenljivu posta, kojoj prethodi simbol @. Kada pokrenete napisanu skriptu, dobit ćete sljedeći rezultat:
Višestruki cURL
Jedan od najvecih snage cURL je mogućnost kreiranja "više" cURL rukovalaca. Ovo vam omogućava da istovremeno i asinhrono otvorite vezu na više URL-ova.
U klasičnoj verziji cURL zahtjeva, izvršenje skripte je obustavljeno i čeka se završetak URL operacije zahtjeva, nakon čega skripta može nastaviti. Ako namjeravate komunicirati s cijelom gomilom URL-ova, to će dovesti do prilično značajnog ulaganja vremena, jer u klasičnoj verziji možete raditi samo s jednim URL-om odjednom. Međutim, ovu situaciju možemo ispraviti korištenjem posebnih rukovatelja.
Pogledajmo primjer koda koji sam uzeo sa php.net:
// kreiramo nekoliko cURL resursa $ch1 = curl_init(); $ch2 = curl_init(); // specificira URL i druge parametre 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); //kreirajte višestruki cURL rukovalac $mh = curl_multi_init(); //dodavanje nekoliko rukovaoca curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //izvrši do ( $mrc = curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) ( if (curl_multi_select($mh) != -1) ( uradi ( $mrc = curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM ) ) //zatvaranje curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Ideja je da možete koristiti više cURL rukovalaca. Koristeći jednostavnu petlju, možete pratiti koji zahtjevi još nisu dovršeni.
U ovom primjeru postoje dvije glavne petlje. Prvo uradi-while petlja poziva funkciju curl_multi_exec(). Ova funkcija se ne može blokirati. Radi najbrže što može i vraća status zahtjeva. Sve dok je vraćena vrijednost konstanta 'CURLM_CALL_MULTI_PERFORM', to znači da posao još nije završen (na primjer, u trenutno slanje je u toku http zaglavlja u URL-u); Zato nastavljamo provjeravati ovu povratnu vrijednost dok ne dobijemo drugačiji rezultat.
U sljedećoj petlji provjeravamo uvjet dok je varijabla $active = "true". To je drugi parametar funkcije curl_multi_exec(). Vrijednost ove varijable će biti jednaka "true" do bilo kojeg od postojeće promjene je aktivan. Zatim pozivamo funkciju curl_multi_select(). Njegovo izvođenje je "blokirano" dok postoji barem jedna aktivna veza, sve dok se ne dobije odgovor. Kada se to dogodi, vraćamo se u glavnu petlju kako bismo nastavili s izvršavanjem upita.
Sada primijenimo ovo znanje na primjer koji će biti zaista koristan velikom broju ljudi.
Provjera veza u WordPress-u
Zamislite blog sa ogromnim brojem postova i poruka, od kojih svaka sadrži linkove na vanjske internetske resurse. Neki od ovih linkova možda su već mrtvi iz različitih razloga. Stranica je možda izbrisana ili stranica možda uopće ne radi.
Napravit ćemo skriptu koja će analizirati sve linkove i pronaći web stranice koje se ne učitavaju i 404 stranice, a zatim nam dostaviti detaljan izvještaj.
Odmah da kažem da ovo nije primjer kreiranja dodatka za WordPress. Ovo je apsolutno dobar poligon za naše testove.
Hajde da konačno počnemo. Prvo moramo preuzeti sve linkove iz baze podataka:
// konfiguracija $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inicijalizacija varijabli $url_list = array(); $working_urls = array(); $dead_urls = niz(); $not_found_urls = niz(); $active = null; // povezivanje na MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Ne mogu se povezati: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Može not select db: " . mysql_error()); ) // izaberi sve objavljene postove sa linkovima $q = "IZABIR post_content IZ wp_posts GDJE post_content KAO "%href=%" I post_status = "objavi" I post_type = "post "" ; $r = mysql_query($q) ili die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // dohvati veze koristeći regularni izrazi if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $matches)) ( foreach ($podudara se kao $url) ( $tmp = parse_url($url) if (in_array($tmp["host"], $excluded_domains)) (nastavi; ) $url_list = $url ) ) // ukloni duplikate $url_list = array_values($url_list)); if (!$url_list) ( die("Nema URL za provjeru"); )
Prvo generišemo konfiguracione podatke za interakciju sa bazom podataka, zatim pišemo listu domena koji neće učestvovati u proveri ($excluded_domains). Također definiramo broj koji karakterizira broj maksimalnih istovremenih veza koje ćemo koristiti u našoj skripti ($max_connections). Zatim se pridružujemo bazi podataka, biramo postove koji sadrže linkove i akumuliramo ih u niz ($url_list).
Sljedeći kod je malo komplikovan, pa ga prođite od početka do kraja:
// 1. višestruki rukovalac $mh = curl_multi_init(); // 2. dodati skup URL-ova za ($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; } }
Ovdje ću pokušati sve detaljno objasniti. Brojevi na listi odgovaraju brojevima u komentaru.
- 1. Kreirajte višestruki rukovalac;
- 2. Napisat ćemo funkciju add_url_to_multi_handle() malo kasnije. Svaki put kada se pozove, počinje obrada novog URL-a. U početku dodajemo 10 ($max_connections) URL-ova;
- 3. Za početak, moramo pokrenuti funkciju curl_multi_exec(). Sve dok vraća CURLM_CALL_MULTI_PERFORM, još uvijek imamo nešto da radimo. Ovo nam je potrebno uglavnom za stvaranje veza;
- 4. Zatim dolazi glavna petlja, koja će raditi sve dok imamo barem jednu aktivnu vezu;
- 5. curl_multi_select() visi čekajući da se URL pretraga završi;
- 6. Još jednom, moramo natjerati cURL da obavi neki posao, odnosno dohvati podatke povratnog odgovora;
- 7. Informacije su ovdje provjerene. Kao rezultat izvršavanja zahtjeva, niz će biti vraćen;
- 8. Vraćeni niz sadrži cURL rukovalac. Koristićemo ga za odabir informacija o zasebnom cURL zahtjevu;
- 9. Ako je veza mrtva ili je skripta istekla, onda ne bismo trebali tražiti nikakav http kod;
- 10. Ako nam je link vratio stranicu 404, onda će http kod sadržavati vrijednost 404;
- 11. Inače, pred nama je radna karika. (Možete dodati dodatne provjere za kod greške 500, itd...);
- 12. Zatim uklanjamo cURL rukovalac jer nam više nije potreban;
- 13. Sada možemo dodati još jedan url i pokrenuti sve o čemu smo prije pričali;
- 14. U ovom koraku, skripta završava svoj rad. Možemo ukloniti sve što nam nije potrebno i napraviti izvještaj;
- 15. Konačno ćemo napisati funkciju koja će dodati url rukovatelju. Statička varijabla $index će se povećavati svaki put kada se ova funkcija pozove.
Koristio sam ovu skriptu na svom blogu (sa nekim neispravnim linkovima koje sam dodao namjerno da je testiram) i dobio sam sljedeći rezultat:
U mom slučaju, skripti je trebalo nešto manje od 2 sekunde da pređe kroz 40 URL-ova. Povećanje performansi je značajno kada se radi sa još više URL-ova. Ako otvorite deset veza u isto vrijeme, skripta se može izvršiti deset puta brže.
Nekoliko riječi o drugim korisnim cURL opcijama
HTTP autentifikacija
Ako je uključeno URL adresa Ako imate HTTP autentifikaciju, lako možete koristiti sljedeću skriptu:
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specificiramo korisničko ime i lozinku curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // ako je preusmjeravanje dozvoljeno curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // zatim spremamo naše podatke u cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
FTP upload
PHP takođe ima biblioteku za rad sa FTP-om, ali ništa vas ne sprečava da ovde koristite cURL alate:
// otvorite datoteku $file = fopen("/path/to/file", "r"); // url bi trebao sadržavati sljedeći sadržaj $url = "ftp://username: [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($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); curl_close($ch);
Korištenje proxyja
Svoj URL zahtjev možete izvršiti putem proxyja:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // odredimo adresu curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // ako trebate dati korisničko ime i lozinku curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);
Funkcije povratnog poziva
Također je moguće odrediti funkciju koja će se pokrenuti čak i prije nego što cURL zahtjev završi. Na primjer, dok se sadržaj odgovora učitava, možete početi koristiti podatke bez čekanja da se potpuno učitaju.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close($ch); funkcija progress_function($ch,$str) ( echo $str; vrati strlen($str); )
Funkcija poput ove MORA vratiti dužinu stringa, što je uslov.
Zaključak
Danas smo naučili kako možete koristiti cURL biblioteku za svoje sebične svrhe. Nadam se da ste uživali u ovom članku.
Hvala vam! ugodan dan!
Ovaj članak je odavno trebao biti prepisan (previše "štedenja na šibicama"), ali nikad nisam stigao do toga. Neka to odmeri i podseti nas koliko smo glupi u mladosti.
Jedan od glavnih kriterija uspjeha bilo kojeg internetskog resursa je brzina njegovog rada, a iz godine u godinu korisnici postaju sve zahtjevniji u pogledu ovog kriterija. Optimizacija rada PHP skripti je jedan od metoda za osiguranje brzine sistema.
U ovom članku želio bih javnosti predstaviti svoju kolekciju savjeta i činjenica o optimizaciji skripti. Zbirku mi je trebalo dosta vremena da sastavim i bazira se na nekoliko izvora i ličnih eksperimenata.
Zašto zbirka savjeta i činjenica, a ne stroga pravila? Jer, kao što sam vidio, ne postoji „apsolutno ispravna optimizacija“. Mnoge tehnike i pravila su kontradiktorna i nemoguće ih je sve pratiti. Morate odabrati skup metoda koje su prihvatljive za korištenje bez ugrožavanja sigurnosti i pogodnosti. Zauzeo sam preporučljiv stav i stoga imam savjete i činjenice koje možete, ali ne morate slijediti.
Da ne bude zabune, podijelio sam sve savjete i činjenice u 3 grupe:
- Optimizacija koda
- Beskorisna optimizacija
Optimizacija na nivou logike i organizacije aplikacije
Mnogi savjeti i činjenice u vezi sa ovom grupom za optimizaciju su vrlo značajni i pružaju vrlo veliki dobitak u vremenu.- Stalno profilirajte svoj kod na serveru (xdebug) i klijentu (firebug) kako biste identificirali uska grla koda
Treba napomenuti da je potrebno profilirati i serverski i klijentski dio, jer se sve greške servera ne mogu otkriti na samom serveru. - Broj korisničkih funkcija koje se koriste u programu ni na koji način ne utječe na brzinu
Ovo omogućava programu da koristi bezbroj prilagođenih funkcija. - Aktivno koristite prilagođene funkcije
Pozitivan učinak postiže se činjenicom da se operacije unutar funkcija izvode samo s lokalnim varijablama. Učinak ovoga je veći od cijene poziva prilagođenih funkcija. - Preporučljivo je implementirati "kritično teške" funkcije u programskom jeziku treće strane u obliku PHP ekstenzije
Za to su potrebne vještine programiranja na jeziku treće strane, što značajno povećava vrijeme razvoja, ali u isto vrijeme omogućava korištenje tehnika koje prevazilaze mogućnosti PHP-a. - Obrada statične html datoteke je brža od interpretirane php datoteke
Razlika u vremenu na klijentu može biti oko 1 sekunda, tako da ima smisla jasno odvojiti statične stranice od stranica koje generiraju PHP alati. - Veličina obrađene (povezane) datoteke utječe na brzinu
Približno 0,001 sekunda se troši na obradu svaka 2 KB. Ova činjenica nas tjera da minimiziramo kod skripte kada ga prenosimo na proizvodni server. - Pokušajte ne koristiti require_once ili include_once cijelo vrijeme
Ove funkcije treba koristiti kada je moguće ponovo pročitati datoteku, u drugim slučajevima preporučljivo je koristiti require i include . - Prilikom grananja algoritma, ako postoje konstrukcije koje se možda neće obraditi i njihov volumen je oko 4 KB ili više, tada je optimalnije uključiti ih pomoću uključivanja.
- Preporučljivo je koristiti provjeru poslanih podataka na klijentu
To je zbog činjenice da se prilikom provjere podataka na strani klijenta broj zahtjeva s netočnim podacima naglo smanjuje. Sistemi za validaciju podataka na strani klijenta su izgrađeni prvenstveno koristeći JS i krute elemente forme (odaberite). - Preporučljivo je izgraditi velike DOM strukture za nizove podataka na klijentu
Ovo je veoma efikasan metod optimizacija pri radu sa ekranom veliki volumen podaci. Njegova suština se svodi na sledeće: niz podataka se priprema na serveru i prenosi do klijenta, a konstrukcija DOM struktura se obezbeđuje JS funkcijama. Kao rezultat toga, opterećenje se djelimično preraspoređuje sa servera na klijenta. - Sistemi izgrađeni na AJAX tehnologiji su znatno brži od sistema koji ne koriste ovu tehnologiju
To je uzrokovano smanjenjem izlaznog volumena i preraspodjelom opterećenja na klijenta. U praksi je brzina sistema sa AJAX-om 2-3 puta veća. komentar: AJAX, zauzvrat, stvara niz ograničenja za korištenje drugih metoda optimizacije, na primjer, rad sa baferom. - Kada primite zahtjev za objavu, uvijek vratite nešto, možda čak i razmak
U suprotnom, klijentu će biti poslana stranica o grešci koja teži nekoliko kilobajta. Ova greška vrlo čest u sistemima koji koriste AJAX tehnologiju. - Dohvaćanje podataka iz datoteke je brže nego iz baze podataka
To je uglavnom zbog cijene povezivanja s bazom podataka. Na moje iznenađenje, ogroman postotak programera manijakalno pohranjuje sve podatke u bazu podataka, čak i kada je korištenje datoteka brže i praktičnije. komentar: Možete pohraniti podatke u datoteke koje se ne pretražuju u suprotnom, trebali biste koristiti bazu podataka. - Nemojte se povezivati na bazu podataka osim ako je potrebno
Iz meni nepoznatog razloga, mnogi programeri se povezuju na bazu podataka u fazi čitanja postavki, iako kasnije možda neće postavljati upite bazi podataka. Ovo je loša navika koja u prosjeku košta 0,002 sekunde. - Koristite trajnu vezu s bazom podataka kada postoji mali broj istovremeno aktivnih klijenata
Vremenska korist je zbog nedostatka troškova za povezivanje sa bazom podataka. Vremenska razlika je otprilike 0,002 sekunde. komentar: at velike količine Nije preporučljivo da korisnici koriste trajne veze. Kada radite s trajnim vezama, mora postojati mehanizam za prekid veza. - Korištenje složenih upita baze podataka je brže od korištenja nekoliko jednostavnih
Vremenska razlika zavisi od mnogih faktora (volumen podataka, podešavanja baze podataka, itd.) i meri se u hiljaditim, a ponekad čak i stotim delovima sekunde. - Korištenje kalkulacija na strani DBMS-a je brže od kalkulacija na strani PHP-a za podatke pohranjene u bazi podataka
To je zbog činjenice da ovakvi proračuni na strani PHP-a zahtijevaju dva upita bazi podataka (prijem i promjena podataka). Vremenska razlika ovisi o mnogim faktorima (volumen podataka, postavke baze podataka, itd.) i mjeri se u hiljaditim i stotim dijelovima sekunde. - Ako se uzorci podataka iz baze podataka rijetko mijenjaju i mnogi korisnici pristupaju tim podacima, onda ima smisla spremiti uzorak podataka u datoteku
Na primjer, možete koristiti sljedeći jednostavan pristup: uzimamo uzorke podataka iz baze podataka i spremamo ih kao serijalizirani niz u datoteku, a zatim bilo koji korisnik koristi podatke iz datoteke. U praksi, ovaj metod optimizacije može pružiti višestruko povećanje brzine izvršavanja skripte. komentar: Prilikom upotrebe ovu metodu potrebno je pisati alate za generiranje i promjenu podataka u pohranjenim datotekama. - Keširajte podatke koji se rijetko mijenjaju s memcached-om
Dobitak u vremenu može biti prilično značajan. komentar: Keširanje je efikasno za statičke podatke, efekat je smanjen i može biti negativan. - Rad bez objekata (bez OOP-a) je oko tri puta brži od rada sa objektima
Također se troši više memorije. Nažalost, PHP interpreter ne može raditi sa OOP-om tako brzo kao sa redovnim funkcijama. - Što je veća dimenzija niza, oni rade sporije
Gubitak vremena nastaje zbog rukovanja ugniježđenim strukturama.
Optimizacija koda
Ovi savjeti i činjenice daju beznačajno povećanje brzine u odnosu na prethodnu grupu, ali zajedno ove tehnike mogu dati dobar dobitak u vremenu.- echo i print su znatno brži od printf
Vremenska razlika može dostići nekoliko hiljaditih delova sekunde. To je zato što se printf koristi za izlaz formatiranih podataka i tumač provjerava cijeli red za takve podatke. printf se koristi samo za izlaz podataka kojima je potrebno formatiranje. - echo $var."text" je brži od echo "$var text"
To je zato što je PHP motor u drugom slučaju primoran da traži varijable unutar stringa. Za velike količine podataka i stare PHP verzije uočljive su razlike tokom vremena. - echo "a" je brži od echo "a" za nizove bez varijabli
To je zato što u drugom slučaju PHP motor pokušava pronaći varijable. Za velike količine podataka, razlike u vremenu su prilično uočljive. - eho "a","b" je brži od eho "a"."b"
Izlaz podataka odvojenih zarezom je brži nego tačkom. To je zato što u drugom slučaju dolazi do konkatenacije nizova. Za velike količine podataka, razlike u vremenu su prilično uočljive. Napomena: ovo radi samo sa funkcijom echo, koja može uzeti više redova kao argumente. - $return="a"; $return.="b"; echo $return; brže od eha "a"; eho "b";
Razlog je taj što izlaz podataka zahtijeva neke dodatne operacije. Za velike količine podataka, razlike u vremenu su prilično uočljive. - ob_start(); eho "a"; eho "b"; ob_end_flush(); brže od $return="a"; $return.="b"; echo $return;
To je zato što se sav posao obavlja bez pristupa varijablama. Za velike količine podataka, razlike u vremenu su prilično uočljive. komentar: Ova tehnika je neefikasna ako radite sa AJAX-om, jer je u ovom slučaju poželjno vratiti podatke kao jedan niz. - Koristite "profesionalni umetak" ili?> a b
Statički podaci (vanjski kod) se obrađuju brže od izlaza PHP podaci. Ova tehnika se naziva profesionalno umetanje. Za velike količine podataka, razlike u vremenu su prilično uočljive. - readfile je brži od file_get_contents, file_get_contents je brži od zahtjeva, a require je brži od uključivanja za izlaz statičkog sadržaja iz jedne datoteke
Vrijeme potrebno za čitanje prazne datoteke varira od 0,001 za readfile do 0,002 za include . - require je brži od uključivanja za interpretirane datoteke
komentar: pri grananju algoritma, kada je moguće ne koristiti interpretiranu datoteku, morate koristiti include , jer Zahtev uvek uključuje fajl. - if (...) (...) else if (...) () je brži od prekidača
Vrijeme ovisi o broju grana. - if (...) (...) else if (...) () je brži od if (...) (...); ako (...) ();
Vrijeme zavisi od broja grana i uslova. Trebali biste koristiti else ako je moguće, jer je to najbrža "uslovna" konstrukcija. - Najčešći uslovi konstrukcije if (...) (...) else if (...) () treba postaviti na početak grane
Tumač skenira konstrukciju od vrha do dna dok ne nađe da je uslov zadovoljen. Ako tumač utvrdi da je uslov ispunjen, onda ne gleda na ostatak konstrukcije. - < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
To je zato što će u drugom slučaju operacija sizeOf biti izvršena na svakoj iteraciji. Vremenska razlika izvršenja zavisi od broja elemenata niza. - x = sizeOf($array); for($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
Vremenska razlika je značajna i povećava se kako se niz povećava. - preg_replace je brži od ereg_replace, str_replace je brži od preg_replace, ali strtr je brži od str_replace
Vremenska razlika zavisi od količine podataka i može doseći nekoliko hiljaditih delova sekunde. - String funkcije su brže od regularnih izraza
Ovo pravilo je posljedica prethodnog. - Uklonite varijable niza koje više nisu potrebne za oslobađanje memorije.
- Izbjegavajte korištenje potiskivanja grešaka @
Suzbijanje grešaka proizvodi niz vrlo sporih operacija, a budući da stopa ponovnih pokušaja može biti vrlo visoka, gubitak brzine može biti značajan. - if (isset($str(5))) (...) je brži od if (strlen($str)>4)(...)
To je zato što se standardna isset test operacija koristi umjesto strlen funkcije za manipulaciju stringovima. - 0,5 je brže od 1/2
Razlog je što se u drugom slučaju vrši operacija dijeljenja. - return je brži od globalnog kada vraća vrijednost varijable iz funkcije
To je zato što se u drugom slučaju kreira globalna varijabla. - $row["id"] je brži od $row
Prva opcija je 7 puta brža. - $_SERVER['REQUEST_TIME'] je brži od vremena() za određivanje kada se skripta treba pokrenuti
- if ($var===null) (...) je brži od if (is_null($var)) (...)
Razlog je taj što u prvom slučaju nema upotrebe funkcije. - ++i je brži od i++, --ja brže, nego ja--
Ovo je uzrokovano karakteristikama PHP jezgra. Vremenska razlika je manja od 0,000001, ali ako ponovite ove procedure hiljade puta, onda bolje pogledajte ovu optimizaciju. - Povećanje inicijalizirane varijable i=0; ++i; brži od neinicijaliziranog ++i
Vremenska razlika je oko 0,000001 sekunde, ali zbog moguće učestalosti ponavljanja ovu činjenicu treba imati na umu. - Upotreba povučenih varijabli je brža od deklariranja novih
Ili da preformulišem drugačije: ne stvarajte nepotrebne varijable. - Rad s lokalnim varijablama je otprilike 2 puta brži nego s globalnim
Iako je vremenska razlika manja od 0,000001 sekunde, ali zbog visoke frekvencije ponavljanja, trebali biste pokušati raditi s lokalnim varijablama. - Direktan pristup varijabli je brži od pozivanja funkcije unutar koje je ova varijabla definirana nekoliko puta
Pozivanje funkcije traje oko tri puta više vremena nego pozivanje varijable.
Beskorisna optimizacija
Brojne metode optimizacije nemaju nikakvog efekta u praksi veliki uticaj na brzinu izvršavanja skripte (dobitak vremena manji od 0,000001 sekunde). Uprkos tome, takva optimizacija je često predmet kontroverzi. Iznio sam ove „beskorisne“ činjenice da im ne obraćate posebnu pažnju prilikom pisanja koda u budućnosti.- echo je brži od printa
- include("apsolutni put") je brži od include("relativni put")
- sizeOf je brži od brojanja
- foreach ($arr kao $key => $value) (...) je brži od resetovanja ($arr); while (list($key, $value) = every ($arr)) (...) za asocijativne nizove
- Nekomentirani kod je brži od komentiranog koda jer odlazi dodatno vrijeme da pročitate fajl
Jako je glupo smanjivati obim komentara radi optimizacije, samo treba izvršiti minimizaciju u radnim (“borbenim”) skriptama. - Varijable s kratkim imenima su brže od varijabli s dugim imenima
Ovo je uzrokovano smanjenjem količine koda koji se obrađuje. Slično kao u prethodnoj tački, samo trebate izvršiti minimizaciju u radnim („borbenim“) skriptama. - Označavanje koda pomoću tabulatora je brže od korištenja razmaka
Slično prethodnoj tački.
Za pisanje ovog članka djelomično su korišteni materijali.