Autor Zpráva
pepak
Profil *
Znáte nějaké up-to-date (PHP 5 s vyhlídkou na PHP 6) články o optimalizaci PHP kódu v real-world aplikacích? Jde mi o takové věci, jako:

- Má smysl minimalizovat počet PHP operací? Pokud by například PHP běželo jako čistý interpret (což bude, obávám se, můj případ na localhostu, ale s trochou štěstí ne na komerčním hostingu), tak by to smysl mělo (při každém spuštění skriptu se bude analyzovat, překládat a provádět komplet celý kód, takže například includnutí nebo neincludnutí nepotřebného skriptu může mít dost velký vliv na výkon celku. Naproti tomu, pokud by si PHP cachovalo zkompilovaný kód (jako to dělá třeba Java), tak mě nějaké soubory navíc nezajímají, protože jejich časová režie bude mít vliv až tehdy, když jejich kód skutečně spustím. Narozdíl od Javy, kde si to řídím ručně, je ovšem otázka, jestli kompilátor správně pozná, kdy má rekompilovat a kde může využít cache.

- Související: Když budu řešit například překlady řetězců nebo SQL dotazy, je výhodnější nadeklarovat je všechny najednou (a pak z nich 80% nepoužít) nebo je lepší deklarovat je nějak selektivně až v okamžiku, kdy je potřebuju. Např. rozdíl mezi:

a)
$sql['dotaz1'] = 'SELECT ...';

$sql['dotaz2'] = 'SELECT ...';

...

mysql_query($sql['dotaz1']);


b)
function sql_dotaz1() { return 'SELECT ...'; }

function sql_dotaz2() { return 'SELECT ...'; }

...

mysql_query(sql_dotaz1());


c) Tohle se provede na místě, kde potřebuju daný dotaz:
require_once('./sql/skupina_dotazu1.php');

mysql_query($dotazy1['dotaz1']);


- Jak moc náročné jsou triviální operace (přiřazení do proměnné, zavolání funkce). Pro přehlednost a snadné aktualizace je třeba vhodné funkce používat (např. si nadeklaruji funkci muj_hash($hodnota) { return md5($hodnota); }, kterou potom v programu používám místo toho, abych volal přímo md5($hodnota) a následně to lovil ve všech možných souborech, až se rozhodnu přejít na SHA1 nebo třeba na Whirlpool).

- Jak je to s dědičností objektů? V klasických kompilovaných jazycích je mi celkem jedno, v jaké hloubce dědičnosti se necházím, protože to pokaždé poběží stejně rychle (prostě tam bude nějaký MOV ECX, [EAX+UkazatelDoTabulkyMetod+4*IndexMetody]; JMP ECX - bez ohledu na hloubku zanoření), ale u PHP si nejsem jistý, jestli by náhodou nebylo lepší pokud možno minimalizovat počty deklarovaných objektů.

- Pochopil jsem správně, že lokální proměnné deklarované jako static se vyhodnotí jenom jednou a potom už tu hodnotu drží, aniž by se vyhodnocovaly (jinými slovy, že když PHP narazí v kódu na static $xyz = neco(), tak se podívá do deklarovaných lokálních proměnných a pokud už tam $xyz má, tak se na celé přiřazení vykašle)?

- Všude se doporučuje cachovat data, z dobrých důvodů. Jsou nějaké best-practices, jak tohle dělat, pokud sice jádro obsahu zůstává pořád stejné, ale detaily se liší? Typický příklad, titulní stránka Seznamu bude po nějakou dobu pořád stejná, ale bude se uživatel od uživatele lišit v oslovení (mě se zobrazí "Ahoj, Pepaku", Cynebealdovi se zobrazí "Ahoj, Cynebealde", anonymovi "Ahoj! Prosím, přihlašte se" a Billu Gatesovi "Hello Bill"). Tohle totiž znemožňuje cachování celé stránky, ideální by bylo nacachovat celou stránku jenom s tou jednou nevyplněnou proměnnou (a to pro každou jazykovou verzi zvlášť).

Zatím zkoumám stránky:
http://www.developertutorials.com/tutorials/php/practical-php-performa nce-8-02-07/page3.html
http://phplens.com/lens/php-book/optimizing-debugging-php.php
http://reinholdweber.com/?p=3

Ale s výjimkou té druhé mi připadají trochu příliš triviální (zabývají se detaily, zatímco mě jde spíš o globální pohled).
M
Profil *
No dle mých zkušeností (eshopy, mnoho tisícovek zboží, návštěvnost podporovaná reklamou), php není problém, MySql to je ta brzda.
Tím phpčkem se neřeší žádné složitosti většinou, jeno se zeptáš do databáze a zobrazíš výsledek. Ale když je dotazů moc nebo jsou příliš složité tak výkon jde do kytek.
srigi
Profil
Obecne sa vyhybj pouzivaniu reg. vyrazov ak to ide. Napr. funkcia str_replace() je vyrazne rychlejsia ako preg_replace().
lordfrikk
Profil
srigi
Všude str_replace() použít nemůžeš, na jednoduché věci je ale zbytečné "sebou tahat" reguláry, to je pravda.
Mastodont
Profil
pepak
Má smysl minimalizovat počet PHP operací?
No pochopitelně, to má snad smysl v každém jazyku.
pokud by si PHP cachovalo zkompilovaný kód
To může, viz APC a další podobná řešení.

require_once('./sql/skupina_dotazu1.php');
mysql_query($dotazy1['dotaz1']); 

To je dost netradiční řešení, protože SQL se dost často skládá dynamicky na základě vstupních parametrů. A statické dotazy můžeš mít přímo v kódu, netřeba includovat.

Jak moc náročné jsou triviální operace (přiřazení do proměnné, zavolání funkce)
To vůbec neřeš, protože optimalizací těchto věcí řešíš pár milisekund. Závažnější je třeba komunikace s DB, tam se dá ušetřit mnohem víc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: