Sbírka tipů a faktů o optimalizaci PHP skriptů. Zvládnutí cURL Pár slov o dalších užitečných možnostech cURL

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. 1. Vytvořte vícenásobnou obsluhu;
  2. 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. 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. 4. Následuje hlavní smyčka, která se bude provádět, dokud máme alespoň jedno aktivní připojení;
  5. 5. curl_multi_select() zamrzne a čeká na dokončení vyhledávání URL;
  6. 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. 7. Zde probíhá ověřování informací. V důsledku požadavku bude vráceno pole;
  8. 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. 9. Pokud byl odkaz mrtvý nebo skript vypršel, neměli bychom hledat žádný http kód;
  10. 10. Pokud nám odkaz vrátil stránku 404, pak http kód bude obsahovat hodnotu 404;
  11. 11. Jinak máme před sebou funkční odkaz. (Můžete přidat další kontroly na kód chyby 500 atd...);
  12. 12. Dále odstraníme obsluhu cURL, protože ji již nepotřebujeme;
  13. 13. Nyní můžeme přidat další url a spustit vše, o čem jsme mluvili dříve;
  14. 14. V tomto kroku skript ukončí svou práci. Můžeme odstranit vše, co nepotřebujeme, a vygenerovat zprávu;
  15. 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!

A tak teď budu mluvit o tom, jak něco hacknout bez speciálních znalostí čehokoli. Okamžitě říkám, že to má malý užitek, ale přesto.
Nejprve musíte najít samotné stránky. Chcete-li to provést, přejděte na stránku google.com a vyhledejte dorks

Inurl:pageid= inurl:games.php?id= inurl:page.php?file= inurl:newsDetail.php?id= inurl:gallery.php?id= inurl:article.php?id= inurl:show.php? id= inurl:staff_id= inurl:newsitem.php?num= inurl:readnews.php?id= inurl:top10.php?cat= inurl:historialeer.php?num= inurl:reagir.php?num= inurl:Stray- Questions-View.php?num= inurl:forum_bds.php?num= inurl:game.php?id= inurl:view_product.php?id= inurl:newsone.php?id= inurl:sw_comment.php?id= inurl: news.php?id= inurl:avd_start.php?avd= inurl:event.php?id= inurl:product-item.php?id= inurl:sql.php?id= inurl:news_view.php?id= inurl: select_biblio.php?id= inurl:humor.php?id= inurl:aboutbook.php?id= inurl:ogl_inet.php?ogl_id= inurl:fiche_spectacle.php?id= inurl:communique_detail.php?id= inurl:sem. php3?id= inurl:kategorie.php4?id= inurl:news.php?id= inurl:index.php?id= inurl:faq2.php?id= inurl:show_an.php?id= inurl:preview.php? id= inurl:loadpsb.php?id= inurl:opinions.php?id= inurl:spr.php?id= inurl:pages.php?id= inurl:announce.php?id= inurl:clanek.php4?id= i nurl:participant.php?id= inurl:download.php?id= inurl:main.php?id= inurl:review.php?id= inurl:chappies.php?id= inurl:read.php?id= inurl: prod_detail.php?id= inurl:viewphoto.php?id= inurl:article.php?id= inurl:person.php?id= inurl:productinfo.php?id= inurl:showimg.php?id= inurl:view. php?id= inurl:website.php?id= inurl:hosting_info.php?id= inurl:gallery.php?id= inurl:rub.php?idr= inurl:view_faq.php?id= inurl:artikelinfo.php? id= inurl:detail.php?ID= inurl:index.php?= inurl:profile_view.php?id= inurl:category.php?id= inurl:publications.php?id= inurl:fellows.php?id= inurl :downloads_info.php?id= inurl:prod_info.php?id= inurl:shop.php?do=part&id= inurl:productinfo.php?id= inurl:collectionitem.php?id= inurl:band_info.php?id= inurl :product.php?id= inurl:releases.php?id= inurl:ray.php?id= inurl:produit.php?id= inurl:pop.php?id= inurl:shopping.php?id= inurl:productdetail .php?id= inurl:post.php?id= inurl:viewshowdetail.php?id= inurl:clubpage.php?id= inurl:memberInfo.php?id= inurl:section.php?id= in url:theme.php?id= inurl:page.php?id= inurl:shredder-categories.php?id= inurl:tradeCategory.php?id= inurl:product_ranges_view.php?ID= inurl:shop_category.php?id= inurl:transscript.php?id= inurl:channel_id= inurl:item_id= inurl:newsid= inurl:trainers.php?id= inurl:news-full.php?id= inurl:news_display.php?getid= inurl:index2. php?option= inurl:readnews.php?id= inurl:top10.php?cat= inurl:newsone.php?id= inurl:event.php?id= inurl:product-item.php?id= inurl:sql. php?id= inurl:aboutbook.php?id= inurl:preview.php?id= inurl:loadpsb.php?id= inurl:pages.php?id= inurl:material.php?id= inurl:clanek.php4? id= inurl:announce.php?id= inurl:chappies.php?id= inurl:read.php?id= inurl:viewapp.php?id= inurl:viewphoto.php?id= inurl:rub.php?idr= inurl:galeri_info.php?l= inurl:review.php?id= inurl:iniziativa.php?in= inurl:curriculum.php?id= inurl:labels.php?id= inurl:story.php?id= inurl: hledej.php? ID= inurl:newsone.php?id= inurl:aboutbook.php?id= inurl:material.php?id= inurl:opinions.php?id= inurl:announce.php?id= inurl:rub.php?idr= inurl:galeri_info.php?l= inurl:tekst.php?idt= inurl:newscat.php?id= inurl:newsticker_info.php?idn= inurl:rubrika.php?idr= inurl:rubp.php?idr= inurl: offer.php?idf= inurl:art.php?idm= inurl:title.php?id= inurl:".php?id=1" inurl:".php?cat=1" inurl:".php?catid= 1" inurl:".php?num=1" inurl:".php?bid=1" inurl:".php?pid=1" inurl:".php?nid=1"

tady je malý úryvek. Můžete použít svůj. A tak jsme našli stránky. Například http://www.vestitambov.ru/
Dále si stáhněte tento program

**Skrytý obsah: Abyste viděli tento skrytý obsah, počet vašich příspěvků musí být 3 nebo vyšší.**

Klepněte na tlačítko OK. Poté vložíme místo oběti.
Stiskneme start. Dále čekáme na výsledky.
A tak program našel zranitelnost SQL.

Dále si stáhněte Havij, http://www.vestitambov.ru:80/index.php?module=group_programs&id_gp= vložte tam výsledný odkaz. Nebudu vysvětlovat, jak používat Havij a kde jej stáhnout, není těžké ho najít. Všechno. Obdrželi jste data, která potřebujete – heslo správce, a pak už je to jen na vaší fantazii.

P.S. Tohle je můj první pokus něco napsat. Pokud je to špatně, omlouvám se

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
Skupiny jsou přiděleny podmíněně a některé položky lze přiřadit několika z nich najednou. Údaje jsou uvedeny pro průměrný server (LAMP). Článek se nezabývá otázkami souvisejícími s účinností různých technologií a frameworků třetích stran, protože toto je téma na samostatné diskuse.

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ě.
Na závěr chci ještě jednou připomenout, že mnou uvedené rady a fakta nejsou absolutní a význam jejich aplikace závisí na konkrétní situaci. Je třeba mít na paměti, že optimalizace skriptů je pouze malou částí celého procesu optimalizace a často se bez výše uvedených tipů dá žít.

K napsání článku byly částečně použity materiály.