Nemrtví - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



PHP

Nemrtví

php

6. prosince 2002, 00.00 | Nemrtví ožívají a vstupují mezi nás. Pod tíhou jejich života padá nejedna bezpečnostní politika serveru. Ztráty jsou obrovské.
Tisíce nemrtvých se vrhá do boje, aby zanedlouho zemřeli a opět se zrodili jako pták rodící z popela svého.

"Nemrtví ožívají a vstupují mezi nás. Pod tíhou jejich života padá nejedna bezpečnostní politika serveru. Ztráty jsou obrovské. Tisíce nemrtvých se vrhá do boje, aby zanedlouho zemřeli a opět se zrodili jako pták rodící z popela svého."

Takto by asi začal autor populární literatury, kdyby chtěl zpracovat moje téma. Osobně jsem se rozmýšlel, zda tento článek budu publikovat či nikoliv. Důvodem mi byl jeho obsah, který může učinit dost dobrého pro programátora. Ale lze velmi jednoduše zneužít takovým způsobem, že během pár minut vytuhne nejen spuštěný server ale i node.

Asi je jasné, jak jsem se rozhodl :o) Předem a důrazně upozorňuji, že uvedené postupy zakazuji použít pro napadání serverů.

O čem tedy bude dnes řeč? Správně by se to asi mělo nazývat komutovaný výkon. Kdy jeden skript může ovládat množství jiných skriptů na jiných serverech.

Reálné řešení: (hlavní) skript na výchozím serveru bude spouštět (cílové) skripty na jiném serveru1. Data na zpracování může předávat před GET požadavek či HTTP hlavičku. Aby hlavní skript po zadání nějakého úkolu nemusel, čekat na jeho výsledek. Zapíší se např. do souborů na server, kde běží daný cílový skript. Hlavní skript tedy okamžitě po odeslání požadavku může spojení ukončit a věnovat se jiným serverům či cílovým skriptům. Výsledky si vyzvedne v budoucnosti, opět připojením přes socket. Nyní si však počká na vrácená data.

Možná, že toto řešení je uvedeno i v nějaké jiné publikaci. Nemíním však zůstat jen u tohoto. Skript by pak mohl vypadat nějak takto: (Připomínám, že zde uvedené skripty jsou jen iluzorní a nejsou plně funkční implementací.)

// spusť nějaký skript
$fp = fsockopen ("www.svecpetr.com", 80, $errno, $errstr, 30);
if (!$fp) {
 echo "$errstr ($errno)<br>\n";
} else {
    fputs ($fp, "GET /myscript.php?data=yourdata HTTP/1.0\r\nHost: www.svecpetr.com\r\n\r\n");
// nečekej na obsah
    fclose ($fp);
}
// pokračuj v práci

Vyzvednutí výsledku, lze provést stejným způsobem, kdy se bude odkazovat na datový soubor, u kterého si počkáte na jeho obsah.

Je nezbytné si uvědomit: takovýto hlavní skript se pravděpodobně bude opakovat cyklech a pravděpodobně do nekonečna. To pro mě není moc přijatelná myšlenka. Už z důvodu, že např. u PHP je omezena doba spuštění skriptu na 30 sekund2. Pokud není zapnutý Safe Mode lze ji prodloužit na nekonečno funkcí set_time_limit. To bych však nedoporučoval. Lehce se stane, že někde zapomenete zrušit některá data a při každém kolečku se zvyšuje použitá paměť, což by mohlo způsobit ukončení procesu pro nedostatek paměti.

Inteligentnější si bylo nechat tento skript udělat několik cyklů a pak ho ukončit3. Tím se smaže veškerá paměť (včetně chyb). Problém však nastane, jak ho zase spustit. Ručně je to zcela nereálné.

Řešení se skrývá např. v CRONu. Stačí nastavit, aby spouštěl hlavní skript zhruba tak často, jak často ho budete ukončovat. Ovšem na hostincích nebývá od administrátorů taková důvěra. A omezí vám např. CRONa tak, že čas spuštění může být každých minimálně 15 minut. Brání se, abyste jim zbytečně nebrali výkon stroje.

Co však dělat potřebuji-li spouštět skript častěji. A navíc mám v PHP zapnutý Safe Mode, takže nemohu prodloužit dobu spuštění skriptu4?

Řešení se nachází v již zmíněném skriptu, stačí pouze před jeho ukončením spustit sebe sama, stejným způsobem jako by se jednalo o skript na jiném serveru5. V dalším kroku pak již stačí jen použít funkci sleep na tolik sekund, kolik chcete aby skript byl neaktivní a pak se rozjede. Funkce sleep je jedna z funkcí, u kterých se čas nad nimi strávený nezapočítává do max_execution_time. Tudíž tento skript pak může být spuštěný klidně 5 minut.

Pár rad závěrem: při spuštění skriptu jako sebe sama je absolutně nutné okamžitě po požadavku původní skript ukončit. Jinak totiž zůstane v paměti jak nový, tak starý proces. Což se po nedlouhé době projeví nedostatkem paměti pro celý systém.

Dávejte velký pozor na to co obsahuje spouštěný skript. Stačí je totiž jen nepatrně špatně napsat může vám klidně vzít i velmi vysoké procento výpočetního výkonu stroje.

Výhoda: takto dynamicky spouštěné skripty jsou bez zásahu obsluhy schopny zvyšovat svůj výkon tím, že se zkracuje doba do dalšího spuštění či se jich spouští více najednou.6 Opět však pozor na spotřebu výkonu.


1. – Technicky vzato to může být i výchozí server.
2. – Případně jiná uvedená max_execution_time.
3. – Používáte-li databázi měli byste uvažovat o persistent connection.
4. – Existují některý operace, které se do času spuštění nezapočítávají, tudíž skript pak může běžet déle než 30 sekund.
5. – Místo jména hosta raději použijte IP adresu, ať se zbytečně nedíváte do DNS.
6. – Tohoto lze samozřejmě dosáhnout i přímo přes Crona. Pokud ovšem nemáte právo editovat tabulku Cron Tab je toto výhodným řešením.

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 » Rubriky  » HTML  

Poslat článek

Nyní máte možnost poslat odkaz článku svým přátelům:

Váš e-mail:

(Není povinný)

E-mail adresáta:

Odkaz článku:

Vzkaz:

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: