Jak vyhledávat pomocí google.com
Každý asi umí používat vyhledávač jako je Google =) Ne každý ale ví, že pokud správně poskládáte vyhledávací dotaz pomocí speciálních struktur, můžete mnohem efektivněji a rychleji dosáhnout výsledků toho, co hledáte =) V tomto článku Pokusím se to ukázat a jak to musíte udělat, abyste správně hledali
Google podporuje několik operátorů pokročilého vyhledávání, které mají zvláštní význam při vyhledávání na google.com. Tito operátoři obvykle změní vyhledávání nebo dokonce Googlu řeknou, aby provedl celou věc. Různé typy Vyhledávání. Například konstrukce odkaz: je speciální operátor a dotaz odkaz: www.google.com vám neumožní normální vyhledávání, ale místo toho najde všechny webové stránky, které mají odkazy na google.com.
alternativní typy požadavků
mezipaměti: Pokud do dotazu zahrnete další slova, Google tato zahrnutá slova v dokumentu uloženém v mezipaměti zvýrazní.
Například, cache: www.webové stránky zobrazí obsah uložený v mezipaměti se zvýrazněným slovem „web“.
odkaz: výše uvedený vyhledávací dotaz zobrazí webové stránky, které obsahují odkazy na zadaný dotaz.
Například: odkaz: www.webové stránky zobrazí všechny stránky, které mají odkaz na http://www.site
příbuzný: Zobrazuje webové stránky, které „souvisejí“ se zadanou webovou stránkou.
Například, související: www.google.com zobrazí seznam webových stránek, které jsou podobné domovské stránce Google.
info: Vyžádat informace: poskytne některé informace, které má Google o požadované webové stránce.
Například, info: webové stránky zobrazí informace o našem fóru =) (Armada - Fórum dospělých webmasterů).
Další žádosti o informace
definovat: Dotaz define: poskytne definici slov, která zadáte poté, sestavenou z různých online zdrojů. Definice bude pro celou zadanou frázi (to znamená, že bude zahrnovat všechna slova v přesném dotazu).
zásoby: Začnete-li dotaz s akciemi: Google zpracuje zbytek dotazu jako burzovní ukazatele a odkáže na stránku zobrazující připravené informace pro tyto znaky.
Například, akcie: intel yahoo zobrazí informace o Intel a Yahoo. (Všimněte si, že musíte vytisknout znaky pro nejnovější zprávy, nikoli název společnosti)
Modifikátory požadavků
místo: Pokud do dotazu zahrnete site:, Google omezí výsledky na weby, které najde v dané doméně.
Můžete také hledat jednotlivé zóny, jako je ru, org, com atd ( site:com site:ru)
allintitle: Pokud spustíte dotaz s allintitle:, Google omezí výsledky na všechna slova dotazu v názvu.
Například, allintitle: Google vyhledávání
vrátí všechny stránky vyhledávání Google, jako jsou obrázky, blog atd
titul: Pokud ve svém dotazu zahrnete intitle:, Google omezí výsledky na dokumenty obsahující toto slovo v názvu.
Například, název:Obchod
allinurl: Pokud spustíte dotaz s allinurl: Google omezí výsledky na všechna slova dotazu v URL.
Například, allinurl: vyhledávání google vrátí dokumenty pomocí google a vyhledá v názvu. Také můžete volitelně oddělit slova lomítkem (/), poté budou slova na obou stranách lomítka prohledána na stejné stránce: Příklad allinurl: foo/bar
inurl: Pokud ve svém dotazu zahrnete inurl:, omezí Google výsledky na dokumenty obsahující toto slovo v adrese URL.
Například, Animace inurl:web
intext: hledá zadané slovo pouze v textu stránky, ignoruje nadpis a texty odkazů a další věci nesouvisející s. Existuje také odvozenina tohoto modifikátoru - allintext: ty. dále budou všechna slova v dotazu vyhledána pouze v textu, což je také důležité, ignoruje se často používaná slova v odkazech
Například, intext: fórum
časové období: hledá v časových rámcích (daterange:2452389-2452389), data pro čas jsou specifikována v juliánském formátu.
No a všemožné zajímavé příklady žádostí
Příklady sestavování dotazů pro Google. Pro spammery
inurl:control.guest?a=sign
Site:books.dreambook.com „Adresa URL domovské stránky“ „Podepsat“ inurl:sign
Web: www.freegb.net Domovská stránka
Inurl:sign.asp "Počet postav"
"Zpráva:" inurl:sign.cfm "Odesilatel:"
inurl:register.php “Registrace uživatele” “Webové stránky”
Inurl:edu/guestbook „Zapište se do knihy návštěv“
Inurl:post "Přidat komentář" "URL"
Inurl:/archives/ “Komentáře:” “Pamatujete si informace?”
“Skript a návštěvní kniha vytvořil:” “URL:” “Komentáře:”
inurl:?action=add “phpBook” “URL”
Intitle:"Odeslat nový příběh"
Časopisy
inurl:www.livejournal.com/users/mode=reply
inurl největší žurnál.com/mode=reply
Inurl:fastbb.ru/re.pl?
inurl:fastbb.ru /re.pl? "Kniha hostů"
blogy
Inurl:blogger.com/comment.g?"postID""anonymní"
Inurl:typepad.com/ “Přidejte komentář” “Pamatujete si osobní údaje?”
Inurl:greatestjournal.com/community/ “Přidat komentář” “adresy anonymních plakátů”
"Přidat komentář" "adresy anonymních plakátů" -
Intitle: "Přidat komentář"
Inurl:pirillo.com “Přidat komentář”
Fóra
Inurl:gate.html?”name=Forums” “mode=reply”
inurl:”forum/posting.php?mode=reply”
inurl:"mes.php?"
inurl:”members.html”
inurl:forum/memberlist.php?"
cURL je speciální nástroj, který je určen k přenosu souborů a dat pomocí syntaxe URL. Tato technologie podporuje mnoho protokolů, jako je HTTP, FTP, TELNET a mnoho dalších. cURL byl původně navržen jako nástroj příkazový řádek. Naštěstí pro nás je knihovna cURL podporována programovacím jazykem PHP. V tomto článku se podíváme na některé pokročilé funkce cURL a také se dotkneme praktické aplikace získaných znalostí pomocí PHP.
Proč cURL?
Ve skutečnosti je jich mnoho alternativní způsoby načítání obsahu webové stránky. V mnoha případech, většinou z lenosti, jsem použil jednoduché PHP funkce místo cURL:
$obsah = file_get_contents("http://www.nettuts.com"); // nebo $lines = file("http://www.nettuts.com"); // nebo readfile("http://www.nettuts.com");
Tyto funkce však nemají prakticky žádnou flexibilitu a obsahují obrovské množství nedostatků z hlediska zpracování chyb a tak dále. Kromě toho existují určité úkoly, které s těmito standardními funkcemi jednoduše nevyřešíte: interakce s cookies, autentizace, odeslání formuláře, nahrávání souborů a tak dále.
cURL je výkonná knihovna, která podporuje mnoho různých protokolů, možností a poskytuje detailní informace o žádostech o URL.
Základní struktura
- Inicializace
- Přiřazení parametrů
- Provedení a vyzvednutí výsledku
- Uvolnění paměti
// 1. inicializace $ch = curl_init(); // 2. zadejte možnosti, včetně adresy URL curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. získat HTML jako výsledek $output = curl_exec($ch); // 4. uzavření spojení curl_close($ch);
Krok #2 (tj. volání curl_setopt()) bude v tomto článku probrán mnohem více než všechny ostatní kroky, protože. v této fázi se dějí všechny nejzajímavější a nejužitečnější věci, které potřebujete vědět. V cURL existuje velké množství různých možností, které musí být specifikovány, aby bylo možné nakonfigurovat požadavek URL tím nejdůkladnějším způsobem. Nebudeme brát v úvahu celý seznam jako celek, ale zaměříme se pouze na to, co považuji za nezbytné a užitečné pro tuto lekci. Vše ostatní můžete prozkoumat sami, pokud vás toto téma zajímá.
Kontrola chyb
Kromě toho můžete také použít podmíněné příkazy pro kontrolu, zda byla operace úspěšná:
// ... $output = curl_exec($ch); if ($output === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...
Zde vás žádám, abyste si všimli velmi důležitého bodu: pro srovnání musíme použít „=== false“ místo „== false“. Pro ty, kteří to neznají, nám to pomůže rozlišit mezi prázdným výsledkem a falešnou booleovskou hodnotou, která bude indikovat chybu.
Příjem informací
Dalším dalším krokem je získat data o cURL požadavku po jeho provedení.
// ... curl_exec($ch); $info = curl_getinfo($ch); echo "Vzalo" . $info["total_time"] . " sekundy pro url " . $info["url"]; //...
Vrácené pole obsahuje následující informace:
- "url"
- "typ obsahu"
- http_kód
- "velikost_hlavičky"
- "velikost_požadavku"
- "doba souboru"
- "ssl_verify_result"
- "počet_přesměrování"
- "celkový čas"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- size_download
- "speed_download"
- "speed_upload"
- "délka_obsahu ke stažení"
- "délka_nahraného_obsahu"
- "starttransfer_time"
- "čas_přesměrování"
Detekce přesměrování v závislosti na prohlížeči
V tomto prvním příkladu napíšeme kód, který dokáže detekovat přesměrování URL na základě různých nastavení prohlížeče. Některé webové stránky například přesměrovávají prohlížeče mobilní telefon, nebo jakékoli jiné zařízení.
K určení našich odchozích HTTP hlaviček, včetně názvu prohlížeče uživatele a dostupných jazyků, použijeme možnost CURLOPT_HTTPHEADER. Nakonec budeme schopni určit, které stránky nás přesměrovávají na různé adresy URL.
// testovací URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testování prohlížečů $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" => pole ("user_agent" => "Mozilla/5.0 (iPhone; U ; CPU jako Mac OS X; en) AppleWebKit/420+ (KHTML, jako Gecko) Verze/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "francouzština" => pole ("user_agent" => "Mozilla/4.0 (kompatibilní; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "jazyk" => "fr,fr-FR;q=0.5")); foreach ($urls jako $url) ( echo "URL: $url\n"; foreach ($prohlížeče jako $test_name => $browser) ( $ch = curl_init(); // zadejte url curl_setopt($ch, CURLOPT_URL, $url); // nastavení záhlaví prohlížeče curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language"])" ) ); // nepotřebujeme obsah stránky curl_setopt($ch, CURLOPT_NOBODY, 1); // potřebujeme získat hlavičky HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // vrátí výsledky místo výstupu curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // Došlo k přesměrování HTTP? if (preg_match("!Location: (.*)!", $output, $matches) ) ( echo " $test_name: přesměruje na $matches\n"; ) else ( echo "$test_name: žádné přesměrování\n"; ) ) echo "\n\n"; )
Nejprve určíme seznam adres URL stránek, které budeme kontrolovat. Přesněji, potřebujeme adresy těchto stránek. Dále musíme definovat nastavení prohlížeče, abychom mohli otestovat každou z těchto adres URL. Poté použijeme smyčku, ve které projdeme všechny získané výsledky.
Trik, který používáme v tomto příkladu k nastavení nastavení cURL, nám umožní získat nikoli obsah stránky, ale pouze HTTP hlavičky (uložené v $output). Dále můžeme pomocí jednoduchého regulárního výrazu určit, zda byl v přijatých hlavičkách přítomen řetězec „Umístění:“.
Když spustíte tento kód, měli byste získat něco takového:
Odeslání požadavku POST na konkrétní adresu URL
Při vytváření požadavku GET mohou být přenášená data předána URL prostřednictvím „řetězce dotazu“. Když například vyhledáváte na Googlu, hledaný výraz se umístí do adresního řádku nové adresy URL:
http://www.google.com/search?q=ruseller
S cílem napodobit daná žádost, nemusíte používat cURL. Pokud vás lenost konečně přemůže, použijte funkci „file_get_contents ()“, abyste získali výsledek.
Jde ale o to, že některé formuláře HTML odesílají požadavky POST. Data těchto formulářů jsou přenášena prostřednictvím těla HTTP požadavku, nikoli jako v předchozím případě. Pokud jste například vyplnili formulář na fóru a klikli na tlačítko vyhledávání, bude s největší pravděpodobností odeslán požadavek POST:
http://codeigniter.com/forums/do_search/
Můžeme napsat PHP skript, který dokáže simulovat tento druh URL požadavku. Nejprve vytvořte jednoduchý soubor pro přijetí a zobrazení POST data. Říkejme tomu post_output.php:
Print_r($_POST);
Poté vytvoříme PHP skript pro provedení cURL požadavku:
$url = "http://localhost/post_output.php"; $post_data = array("foo" => "bar", "query" => "Nettuts", "action" => "Odeslat"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // indikuje, že máme požadavek POST curl_setopt($ch, CURLOPT_POST, 1); // přidání proměnných curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $výstup;
Když spustíte tento skript, měli byste získat podobný výsledek:
Požadavek POST byl tedy odeslán skriptu post_output.php, který zase vystoupí superglobální pole$_POST, jehož obsah jsme získali pomocí cURL.
Nahrání souboru
Nejprve vytvořte soubor, abychom jej vytvořili, a odešleme jej do souboru upload_output.php:
Print_r($_FILES);
A zde je kód skriptu, který provádí výše uvedenou funkci:
$url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // soubor k nahrání "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 $výstup;
Když chcete nahrát soubor, vše, co musíte udělat, je předat jej jako běžnou proměnnou příspěvku, před kterým je symbol @. Když spustíte napsaný skript, získáte následující výsledek:
Více cURL
Jednou z největších předností cURL je schopnost vytvářet "více" cURL handlerů. To vám umožní otevřít připojení k více adresám URL současně a asynchronně.
V klasické verzi požadavku cURL je provádění skriptu pozastaveno a očekává se dokončení operace požadavku URL, po které může skript pokračovat. Pokud máte v úmyslu pracovat s velkým množstvím adres URL, bude to poměrně časově náročné, protože v klasickém případě můžete pracovat vždy pouze s jednou URL. Tuto situaci však můžeme napravit pomocí speciálních handlerů.
Podívejme se na příklad kódu, který jsem převzal z php.net:
// vytvořit nějaké cURL zdroje $ch1 = curl_init(); $ch2 = curl_init(); // zadejte URL a další parametry 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); //vytvoření vícenásobného cURL handleru $mh = curl_multi_init(); //přidání více obslužných programů curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $aktivní = null; //provedení do ( $mrc = curl_multi_exec($mh, $aktivní); ) while ($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); ) ) //zavřít curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Myšlenka je, že můžete použít více obslužných programů cURL. Pomocí jednoduché smyčky můžete sledovat, které požadavky ještě nebyly dokončeny.
V tomto příkladu jsou dvě hlavní smyčky. za prvé smyčka do-while volá funkci curl_multi_exec(). Tato funkce je neblokující. Provede se tak rychle, jak jen může, a vrátí stav požadavku. Zatímco vrácená hodnota je konstanta 'CURLM_CALL_MULTI_PERFORM', znamená to, že práce ještě nebyla dokončena (například se právě odesílají hlavičky http v URL); Proto tuto návratovou hodnotu stále kontrolujeme, dokud nedosáhneme jiného výsledku.
V dalším cyklu zkontrolujeme podmínku, zatímco $active = "true". Je to druhý parametr funkce curl_multi_exec(). Hodnota této proměnné se bude rovnat hodnotě „true“, pokud bude kterákoli z nich stávající změny je aktivní. Dále zavoláme funkci curl_multi_select(). Jeho provádění se „blokuje“, pokud existuje alespoň jedno aktivní připojení, dokud není přijata odpověď. Když k tomu dojde, vrátíme se do hlavní smyčky, abychom pokračovali ve vykonávání dotazů.
A nyní aplikujme to, co jsme se naučili, na příkladu, který bude opravdu užitečný pro velké množství lidí.
Kontrola odkazů ve WordPressu
Představte si blog s velkým množstvím příspěvků a zpráv, z nichž každý má odkazy na externí internetové zdroje. Některé z těchto odkazů již mohou být z různých důvodů „mrtvé“. Možná byla stránka smazána nebo stránka vůbec nefunguje.
Vytvoříme skript, který analyzuje všechny odkazy a najde webové stránky, které se nenačítají, a 404 stránek, a pak nám poskytne velmi podrobnou zprávu.
Hned řeknu, že toto není příklad vytvoření pluginu pro WordPress. To je pro nás asi všechno dobré testovací místo.
Pojďme konečně začít. Nejprve musíme načíst všechny odkazy z databáze:
// konfigurace $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inicializace proměnné $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $aktivní = null; // připojení k MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nelze se připojit: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Mohl not select db: " . mysql_error()); ) // vybrat všechny publikované příspěvky s odkazy $q = "VYBRAT post_content FROM wp_posts KDE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post "" ; $r = mysql_query($q) or die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // načtení odkazů pomocí regulární výrazy if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $matches)) ( foreach ($se shoduje s $url) ( $tmp = parse_url($url) ; if (in_array($tmp["host"], $excluded_domains)) ( pokračovat; ) $url_list = $url; ) ) ) // odstranění duplicit $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Žádná adresa URL ke kontrole"); )
Nejprve vygenerujeme konfigurační data pro interakci s databází, poté sepíšeme seznam domén, které se kontroly nezúčastní ($excluded_domains). Definujeme také číslo, které charakterizuje počet maximálních současných připojení, která použijeme v našem skriptu ($max_connections). Poté se připojíme k databázi, vybereme příspěvky, které obsahují odkazy, a shromáždíme je do pole ($url_list).
Následující kód je trochu složitý, takže jej pochopte od začátku do konce:
// 1. vícenásobná obsluha $mh = curl_multi_init(); // 2. přidejte mnoho adres URL pro ($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; } }
Zde se pokusím dát vše do polic. Čísla v seznamu odpovídají číslům v komentáři.
- 1. Vytvořte vícenásobnou obsluhu;
- 2. Funkci add_url_to_multi_handle() napíšeme o něco později. Při každém zavolání bude zpracována nová adresa URL. Zpočátku přidáme 10 ($max_connections) URL;
- 3. Abychom mohli začít, musíme spustit funkci curl_multi_exec(). Dokud bude vracet CURLM_CALL_MULTI_PERFORM, máme stále co dělat. Potřebujeme to hlavně proto, abychom vytvářeli spojení;
- 4. Následuje hlavní smyčka, která se bude provádět, dokud máme alespoň jedno aktivní připojení;
- 5. curl_multi_select() zamrzne a čeká na dokončení vyhledávání URL;
- 6. Ještě jednou potřebujeme přimět cURL, aby udělal nějakou práci, jmenovitě načetl vrácená data odpovědi;
- 7. Zde probíhá ověřování informací. V důsledku požadavku bude vráceno pole;
- 8. Vrácené pole obsahuje obsluhu cURL. To je to, co použijeme k načtení informací o konkrétním požadavku cURL;
- 9. Pokud byl odkaz mrtvý nebo skript vypršel, neměli bychom hledat žádný http kód;
- 10. Pokud nám odkaz vrátil stránku 404, pak http kód bude obsahovat hodnotu 404;
- 11. Jinak máme před sebou funkční odkaz. (Můžete přidat další kontroly na kód chyby 500 atd...);
- 12. Dále odstraníme obsluhu cURL, protože ji již nepotřebujeme;
- 13. Nyní můžeme přidat další url a spustit vše, o čem jsme mluvili dříve;
- 14. V tomto kroku skript ukončí svou práci. Můžeme odstranit vše, co nepotřebujeme, a vygenerovat zprávu;
- 15. Na závěr napíšeme funkci, která do handleru přidá url. Statická proměnná $index bude inkrementována při každém volání této funkce.
Použil jsem tento skript na svém blogu (s některými nefunkčními odkazy přidanými záměrně, abych ho otestoval) a získal jsem následující výsledek:
V mém případě skriptu trvalo necelé 2 sekundy, než prošel 40 URL. Zvýšení výkonu je významné při práci s ještě větším počtem adres URL. Pokud otevřete deset připojení současně, skript může běžet desetkrát rychleji.
Pár slov o dalších užitečných možnostech cURL
HTTP ověřování
Pokud je zapnuto URL adresa existuje HTTP autentizace, pak můžete snadno použít následující skript:
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // zadejte uživatelské jméno a heslo curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // pokud je přesměrování povoleno curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // poté uložte naše data do cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
FTP upload
PHP má také knihovnu pro práci s FTP, ale zde vám nic nebrání používat nástroje cURL:
// otevření souboru $soubor = fopen("/cesta/k/souboru", "r"); // url by měla obsahovat následující obsah $url = "ftp://username: [e-mail chráněný]:21/cesta/k/novému/souboru"; $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, velikost souboru("/cesta/k/souboru")); // zadat ASCII mod curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec ($ch); curl_close($ch);
Pomocí proxy
Svůj požadavek na adresu URL můžete zadat prostřednictvím serveru proxy:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // zadejte adresu curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // pokud potřebujete zadat uživatelské jméno a heslo curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close($ch);
Zpětná volání
Je také možné určit funkci, která bude spuštěna ještě před dokončením požadavku cURL. Když se například načítá obsah odpovědi, můžete začít používat data, aniž byste čekali na jejich úplné načtení.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funkce_progresu"); curl_exec($ch); curl_close($ch); function progress_function($ch,$str) ( echo $str; return strlen($str); )
Taková funkce MUSÍ vrátit délku řetězce, což je požadavek.
Závěr
Dnes jsme se seznámili s tím, jak můžete využít knihovnu cURL pro své vlastní sobecké účely. Doufám, že se vám tento článek líbil.
Děkuji! Měj hezký den!
Tento článek měl být už dávno přepsán (příliš velké "úspory na sirkách"), ale ruce nesahají. Ať to zaváží a připomene nám, jak jsme v mládí hloupí.
Jedním z hlavních kritérií úspěchu jakéhokoli internetového zdroje je rychlost jeho práce a uživatelé jsou každým rokem na toto kritérium stále náročnější. Optimalizace php skriptů je jednou z metod, jak zajistit rychlost systému.
V tomto článku bych chtěl veřejnosti představit svou sbírku tipů a faktů o optimalizaci skriptů. Sbírku jsem sbíral dlouhou dobu na základě několika zdrojů a osobních experimentů.
Proč sbírka tipů a faktů a ne tvrdá a rychlá pravidla? Protože, jak jsem viděl, neexistuje žádná „absolutně správná optimalizace“. Mnoho technik a pravidel je protichůdných a není možné je všechny splnit. Musíte si vybrat sadu metod, které jsou přijatelné pro použití, aniž byste museli obětovat bezpečnost a pohodlí. Zaujal jsem poradní pozici a proto mám rady a fakta, kterými se můžete nebo nemusíte řídit.
Aby nedošlo k záměně, rozdělil jsem všechny tipy a fakta do 3 skupin:
- Optimalizace kódu
- Zbytečná optimalizace
Optimalizace na úrovni logiky a organizace aplikace
Mnoho tipů a faktů souvisejících s touto optimalizační skupinou je velmi významných a přináší velmi velký zisk v čase.- Neustále profilujte svůj kód na serveru (xdebug) a na klientovi (firebug), abyste identifikovali úzká hrdla kódu
Je třeba poznamenat, že musíte profilovat serverovou i klientskou část, protože ne všechny chyby serveru lze detekovat na samotném serveru. - Počet uživatelsky definovaných funkcí použitých v programu nijak neovlivňuje rychlost
To vám umožňuje používat v programu nekonečné množství uživatelsky definovaných funkcí. - Aktivně používejte vlastní funkce
Pozitivního efektu je dosaženo díky skutečnosti, že uvnitř funkcí jsou operace prováděny pouze s lokálními proměnnými. Efekt je větší než náklady na volání funkcí definovaných uživatelem. - Je žádoucí implementovat „kriticky těžké“ funkce v programovacím jazyce třetí strany jako rozšíření PHP
To vyžaduje znalosti programování v jazyce třetí strany, což značně prodlužuje dobu vývoje, ale zároveň umožňuje používat triky přesahující možnosti PHP. - Zpracování statického html souboru je rychlejší než interpretovaného php souboru
Rozdíl v čase na klientovi může být cca 1 sekunda, takže jasné oddělení statických a PHP generovaných stránek dává smysl. - Velikost zpracovávaného (připojeného) souboru ovlivňuje rychlost
Přibližně 0,001 sekundy je vynaloženo na zpracování každé 2 KB. Tato skutečnost nás nutí minimalizovat kód skriptu při jeho přenosu na produkční server. - Snažte se neustále nepoužívat require_once nebo include_once
Tyto funkce by se měly používat, když je možné soubor znovu přečíst, v ostatních případech je žádoucí použít require a include . - Pokud při větvení algoritmu existují konstrukce, které nelze zpracovat a jejich objem je cca 4 KB nebo více, je optimálnější zahrnout je pomocí include.
- Je vhodné využít validaci odesílaných dat na klientovi
Je to dáno tím, že při validaci dat na straně klienta se razantně snižuje počet požadavků s nesprávnými údaji. Systémy ověřování dat na straně klienta jsou primárně sestaveny pomocí JS a hard form prvků (select). - Je žádoucí vytvářet velké konstrukce DOM pro datová pole na klientovi
Toto je velmi účinná metoda optimalizace při práci se zobrazováním velkého množství dat. Jeho podstata se scvrkává na následující: na serveru je připraveno pole dat a přeneseno na klienta a konstrukce DOM struktur je poskytnuta funkcím JS. V důsledku toho je zátěž částečně přerozdělena ze serveru na klienta. - Systémy postavené na technologii AJAX jsou mnohem rychlejší než systémy, které tuto technologii nevyužívají.
Je to způsobeno poklesem objemů výběrů a přerozdělením zátěže na klienta. V praxi je rychlost systémů s AJAXem 2-3x vyšší. Komentář: AJAX zase vytváří řadu omezení pro použití dalších optimalizačních metod, jako je práce s bufferem. - Když obdržíte žádost o příspěvek, vždy něco vraťte, dokonce i mezeru
V opačném případě bude klientovi odeslána chybová stránka, která váží několik kilobajtů. Tato chyba velmi běžné v systémech využívajících technologii AJAX. - Získávání dat ze souboru je rychlejší než z databáze
To je z velké části způsobeno náklady na připojení k databázi. K mému překvapení obrovské procento programátorů šíleně ukládá všechna data do databáze, i když je používání souborů rychlejší a pohodlnější. Komentář: soubory mohou ukládat data, která nejsou prohledávána, jinak by měla být použita databáze. - Nepřipojujte se zbytečně k databázi
Z mně neznámého důvodu se mnoho programátorů připojuje k databázi ve fázi načítání nastavení, i když nemusí provádět další dotazy do databáze. Jde o zlozvyk, který stojí v průměru 0,002 sekundy. - Použijte trvalé připojení k databázi s malým počtem současně aktivních klientů
Časová výhoda je způsobena absencí nákladů na připojení k databázi. Časový rozdíl je přibližně 0,002 sekundy. Komentář: při velkém počtu uživatelů jsou trvalá připojení nežádoucí. Při řešení trvalých spojení musí existovat mechanismus pro ukončení spojení. - Použití složitých databázových dotazů je rychlejší než použití několika jednoduchých
Časový rozdíl závisí na mnoha faktorech (objem dat, nastavení databáze atd.) a měří se v tisícinách a někdy i setinách sekundy. - Použití bočních výpočtů DBMS je rychlejší než boční výpočty PHP pro data uložená v databázi
Je to dáno tím, že pro takové výpočty na straně PHP jsou potřeba dva dotazy do databáze (získání a změna dat). Časový rozdíl závisí na mnoha faktorech (objem dat, nastavení databáze atd.) a měří se v tisícinách a setinách sekundy. - Pokud se ukázková data z databáze mění jen zřídka a k těmto datům přistupuje mnoho uživatelů, pak má smysl uložit ukázková data do souboru
Můžete například použít následující jednoduchý přístup: získáme ukázková data z databáze a uložíme je jako serializované pole do souboru, poté data ze souboru použije libovolný uživatel. V praxi může tato optimalizační metoda poskytnout mnohonásobné zvýšení rychlosti provádění skriptu. Komentář: Při použití této metody je nutné napsat nástroje pro generování a úpravu dat uložených v souboru. - Uchovávejte data, která se s memcached mění jen zřídka
Časový zisk může být poměrně významný. Komentář: ukládání do mezipaměti je efektivní pro statická data, pro dynamická data je efekt snížen a může být negativní. - Práce bez objektů (bez OOP) je asi třikrát rychlejší než práce s objekty
Paměť je také více „vyžraná“. Bohužel PHP interpret nezvládne OOP tak rychle jako běžné funkce. - Čím vyšší je rozměr polí, tím pomaleji pracují.
Ztráta času vzniká zpracováním vnoření konstrukcí.
Optimalizace kódu
Tyto tipy a fakta poskytují mírné zvýšení rychlosti ve srovnání s předchozí skupinou, ale dohromady mohou tyto techniky poskytnout dobrý zisk v čase.- echo a tisk jsou výrazně rychlejší než printf
Časový rozdíl může být až několik tisícin sekundy. Je to proto, že printf se používá k výstupu formátovaných dat a interpret kontroluje celý řádek pro taková data. printf se používá pouze pro výstup dat, která vyžadují formátování. - echo $var."text" je rychlejší než echo "$var."text"
Je to proto, že PHP engine je v druhém případě nucen hledat proměnné uvnitř řetězce. U velkého množství dat a starších verzí PHP jsou časové rozdíly patrné. - echo "a" je rychlejší než echo "a" pro řetězce bez proměnných
Je to proto, že v druhém případě se PHP engine pokouší najít proměnné. U velkého množství dat jsou rozdíly v čase docela patrné. - echo "a","b" je rychlejší než echo "a"."b"
Výstup dat oddělených čárkami je rychlejší než dat oddělených tečkami. Ve druhém případě totiž dochází ke zřetězení řetězců. U velkého množství dat jsou rozdíly v čase docela patrné. Poznámka: to funguje pouze s funkcí echo, která může mít více řádků jako argumenty. - $return="a"; $return.="b"; echo $návrat; rychlejší než echo "a"; echo "b";
Důvodem je, že výstup dat vyžaduje některé další operace. U velkého množství dat jsou rozdíly v čase docela patrné. - ob_start(); echo "a"; echo "b"; ob_end_flush(); rychlejší než $return="a"; $return.="b"; echo $návrat;
Je to proto, že veškerá práce se provádí bez přístupu k proměnným. U velkého množství dat jsou rozdíly v čase docela patrné. Komentář: tato technika není účinná, pokud pracujete s AJAXem, protože v tomto případě je žádoucí vrátit data jako jeden řádek. - Použijte "profesionální vložku" nebo? > a b
Statická data (mimo kód) se zpracovávají rychleji než výstup PHP. Tato technika se nazývá profesionální vkládání. U velkého množství dat jsou rozdíly v čase docela patrné. - readfile je rychlejší než file_get_contents, file_get_contents je rychlejší, než je požadováno, a required je rychlejší než include pro výstup statického obsahu z jednoho souboru
Doba načtení prázdného souboru se pohybuje od 0,001 pro readfile do 0,002 pro include . - vyžadovat je rychlejší než zahrnout pro interpretované soubory
Komentář: při větvení algoritmu, když je možné nepoužívat interpretovaný soubor, musíte použít include , protože vyžadovat vždy obsahuje soubor. - if (...) (...) else if (...) () je rychlejší než switch
Doba závisí na počtu poboček. - if (...) (...) else if (...) () je rychlejší než if (...) (...); li(...)();
Čas závisí na počtu poboček a podmínkách. Pokud je to možné, měli byste použít else, protože je to nejrychlejší „podmíněná“ konstrukce. - Nejběžnější podmínky konstrukce if (...) (...) else if (...) () by měly být umístěny na začátek větve
Interpret skenuje strukturu shora dolů, dokud nenajde podmínku. Pokud interpret zjistí, že podmínka je splněna, pak se na zbytek struktury nepodívá. - < x; ++$i) {...} быстрее, чем for($i = 0; $i < sizeOf($array); ++$i) {...}
Je to proto, že ve druhém případě se operace sizeOf provede při každé iteraci. Rozdíl doby provádění závisí na počtu prvků pole. - x = sizeOf($pole); for($i = 0; $i< x; ++$i) {...} быстрее, чем foreach($arr as $value) {...} для не ассоциативных массивов
Časový rozdíl je významný a zvyšuje se s rostoucím polem. - preg_replace je rychlejší než ereg_replace , str_replace je rychlejší než preg_replace , ale strtr je rychlejší než str_replace
Časový rozdíl závisí na množství dat a může dosáhnout několika tisícin sekundy. - Řetězcové funkce jsou rychlejší než regulární výrazy
Toto pravidlo je důsledkem předchozího. - Odstraňte již nepotřebné proměnné pole, abyste uvolnili paměť.
- Nepoužívejte potlačení chyb @
Potlačení chyb vytváří řadu velmi pomalých operací, a protože frekvence opakování může být velmi vysoká, ztráta rychlosti může být významná. - if (isset($str(5))) (...) je rychlejší než if (strlen($str)>4)(...)
Je to proto, že namísto funkce string strlen je použita standardní operace isset check. - 0,5 je rychlejší než 1/2
Důvodem je, že ve druhém případě se provádí operace dělení. - return je rychlejší než globální, když vrací hodnotu proměnné z funkce
Ve druhém případě je totiž vytvořena globální proměnná. - $row["id"] je rychlejší než $row
První možnost je 7krát rychlejší. - $_SERVER['REQUEST_TIME'] je rychlejší než time() pro určení, kdy se má skript spustit
- if ($var===null) (...) je rychlejší než if (is_null($var)) (...)
Důvodem je, že v prvním případě není použita žádná funkce. - ++i je rychlejší než i++, --jsem rychlejší než já--
To je způsobeno funkcí jádra PHP. Časový rozdíl je menší než 0,000001, ale pokud tyto postupy opakujete tisíckrát, podívejte se na tuto optimalizaci blíže. - Přírůstek inicializované proměnné i=0; ++i; rychlejší než neinicializované ++i
Časový rozdíl je asi 0,000001 sekund, ale vzhledem k možné frekvenci opakování je třeba na tuto skutečnost pamatovat. - Použití "použitých" proměnných je rychlejší než deklarování nových
Nebo to přeformulovat jinak – Nevytvářejte zbytečné proměnné. - Práce s lokálními proměnnými je asi 2x rychlejší než s globálními
Časový rozdíl je sice menší než 0,000001 sekund, ale kvůli vysoká frekvence opakování by se mělo pokusit pracovat s lokálními proměnnými. - Přímý přístup k proměnné je rychlejší než volání funkce, ve které je tato proměnná definována několikrát
Volání funkce trvá asi třikrát déle než volání proměnné.
Zbytečná optimalizace
Řada optimalizačních metod v praxi nemá velký vliv na rychlost provádění skriptu (časový zisk je menší než 0,000001 sekundy). Navzdory tomu je taková optimalizace často předmětem sporů. Tyto „zbytečné“ skutečnosti jsem přinesl, abyste jim později při psaní kódu nevěnovali zvláštní pozornost.- echo je rychlejší než tisk
- include("absolutní cesta") je rychlejší než include("relativní cesta")
- sizeOf je rychlejší než count
- foreach ($arr jako $key => $value) (...) je rychlejší než reset($arr); while (seznam($klíč, $hodnota) = každý ($arr)) (...) pro asociativní pole
- Nekomentovaný kód je při odchodu rychlejší než komentovaný kód dodatečný čas pro čtení souboru
Snižovat objem komentářů kvůli optimalizaci je velmi hloupé, stačí jej minimalizovat v pracovních („bojových“) skriptech. - Proměnné s krátkými názvy jsou rychlejší než proměnné s dlouhými názvy
To je způsobeno snížením množství zpracovávaného kódu. Podobně jako v předchozím bodě jej stačí minimalizovat v pracovních („bojových“) skriptech. - Značení kódu pomocí tabulátorů je rychlejší než pomocí mezer
Podobně jako v předchozím bodě.
K napsání článku byly částečně použity materiály.