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:
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í.)
|
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.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007