Milan Kryl

Kryl Blog - RSS

PHP optimalizace 3

30. 05. 2004 - 23:36

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 ;o)

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.