PHP optimalizace 3
Již potřetí se můj příspěvek bude týkat PHP optimalizací. Není to ani tak kvůli tomu, že bych se o to momentálně zajímal. Nacházím ale prezentace, které se na to dívají ze zajímavých pohledů a chtěl bych si to uchovat.
Tentokrát jsem objevil prezentaci Accelerating PHP Applications z Mezinárodní konference PHP, pořádané 5. května v Amsterdamu. Opakuje některá témata, která jsem již řešil v minulých dvou příspěvcích, ale také přináší další podněty k optimalizaci.
Začít od základu - kompilací
Pokud chcete něco optimalizovat, doporučuje se začít hned od začátku. Tedy kompilací PHP. Nakompilovat si jen co je potřeba a vyladit parametry přesně pro počítač, na kterém PHP bude běžet.
- parametrem -O3 zapnout všechny optimalizace kompilátoru
- nechat kompilátor vyladit kód pro váš procesor -march -mcpu (používat opatrně!!!)
- zkusit donutit kompilátor, aby použil některé ze specialitek vašeho procesoru -msse -mmmx -mfpmath=sse
export CFLAGS="-O3 -msse -mmmx -march=pentium3 -mcpu=pentium3 -funroll-loops -mfpmath=sse" ./configure make make install
Při kompilaci přidejte pouze taková rozšíření, která budete používat. A ta málo používaná nakompilujte jako sdílené moduly (shared modules). Nahrají se jen ve skriptech, kde budou potřeba. (použítím funkce dl() ) Úplně nejlepší bude volba --disable-all
Až 20% výkonu získáte, pokud bude PHP kompilováno staticky přímo do apache. Bohužel ale při každém upgrade PHP bude nutné překompilovat i apache.
Statická kompilace PHP
# PHP ./configure --with-apache=/path/to/apache_source # Apache ./configure --activate-module=src/modules/php4/libphp4.a
Pro vlastní objektové soubory použijte utilitu strip, která odstraní přebytečné symboly. Nejen, že ušetří místo, ale také paměť pro modul až o 20-30%.
Konfigurace PHP
Po úspěšné kompilaci je další na řadě nastavení php.ini. Některá nastavení mohou mít výrazný vliv na rychlost PHP.
- zakázat register_globals (default od 4.2.0)
- zakázat direktivy magic_quotes_* (ale s ujištěním, že vaše aplikace veškeré potřebné vstupy escapuje!)
- vypnout expose_php
- vypnout register_argc_argv pro skripty volané z webu.
- pokud to není nezbytně nutné, tak nezapínat always_populate_raw_post_data
Další urychlení získáte umístěném ini souborů pro newebové použití PHPčka tam, kde jsou vyhledávány nejdříve.
PHP CLI /usr/local/lib/php-cli.ini PHP CGI /usr/local/lib/php-cgi-fcgi.ini nebo ./php-cgi-fcgi.ini
Jak neotvírat soubory!
Většina php skriptů provádí souborové IO operace. Ať to je include souborů, čtení souborů a nebo zápis. Jednou společnou chybou většiny vývojářů je, že tyto operace provádí pomaleji než je možné.
<?php include "soubor.php"; ?>
Vždy používejte plnou cestu k souboru, když jej otvíráte. Vyhnete se tak náročné normalizaci cesty k souboru.
<?php // absolutní include "/cesta/k/souboru.php"; // nebo relativní include "./soubor.php"; ?>
Práce se sessions
Společným jmenovatelem mnoha PHP souborů je použití sessions. I zde se dá několik věcí optimalizovat.
- nepoužívejte session.auto_start
- nepovolujte session.use_trans_sid
- kdykoliv je možné, tak nastavte session.cache_limiter nastavte na private_no_expire
- pro každého uživatele (virtualhost) nastavte vlastní adresář pro uložení sessions
- pokud je to možné, vyhýbejte se automatickému garbage collectoru a uzavírejte sessions sami.
Databáze
I přesto, že vaše PHP skripty budou bleskové, tak pomalé dotazy mohou veškeré optimalizace zničit. Najděte nejpomalejší skripty a dotazy a ty se pokuste vylepšit.
Pokud stále ještě používáte MySQL 3.23.x tak zvažte přechod na MySQL 4.x A co tím získáte?
- cache dotazů
- vnořené dotazy
- rychlejší hromadné inserty
- vylepšený FULLTEXT
Samozřejmě, že nejen MySQL databází svět PHP je živ. Použití konkrétní databáze záleží na vašich potřebách a nemálo i na vašem rozpočtu. (MySQL, PostreSQL, Oracle)
To je vše co mě zaujalo ve zmíněné prezentaci. Pokud jste ještě nečetli předchozí díly, tak bych si dovolil nabídnout k nahlédnutí - PHP optimalizace 1, PHP optimalizace 2.
Tip: Nevíte čím obdarovat nejbližší? Nechte je napsat Ježíškovi.