PHP Tuning / hangolás / gyorsítás ötletgyűjtő topic
A topic lényege nagyjából annyi, hogy azokat az ötleteket vitassuk meg, amik kizárólag a PHP fejlesztő által elvégezhető optimalizációs tevékenységek. Tehát nem tartozik bele az apache konfig, speciális php modulok (pl. eacc), fájlrendszer (ezek hoszting esetén általában fixek, és az üzemeltető által is alkalmazhatóak), adatbáziskapcsolat és lekérdezések, stb.
Nem számít bele továbbá a szervertől a böngészőig tartó út, azaz milyen sávszélesség, hány fájlt tölt be, stb, ezek finomhangolására több irodalom és eszköz áll rendelkezésre.
Jöhetnek ide linkek, kódrészletek, két soros tippek is akár.
Egy trivialitást ellövök az elején:
- cache-elj, amit lehet (fájlrendszerbe, memcached-be)
■ Nem számít bele továbbá a szervertől a böngészőig tartó út, azaz milyen sávszélesség, hány fájlt tölt be, stb, ezek finomhangolására több irodalom és eszköz áll rendelkezésre.
Jöhetnek ide linkek, kódrészletek, két soros tippek is akár.
Egy trivialitást ellövök az elején:
- cache-elj, amit lehet (fájlrendszerbe, memcached-be)
Ilia.ws, PHP Core fejlesztő,
http://ilia.ws/files/Dutch_PHP_Conference_2010_OPM.pdf
Amit kiemelnék: - output
- output buffering használata (ob_start())
- lekérdezések rendbetétele, egy jó index csodákra képes (EXPLAIN SELECT ...)
- a kód legyen egyszerű (magam részéről nem ajánlom semmilyen idegen keretrendszer használatát)
- notice-ok kiirtása (minden hibánál lefut a teljes php hibafeldolgozás, ami nagyban lassítja a kódot)
Amit hozzátennék:
- karakterláncoknál a szimpla idézőjelek használatával átlag tíz százalékkal gyorsulhat a feldolgozás a macskakörömhöz képest
output buffering?
Ez nekem is csak második
Az "Amit kiemelnék"
Az Output Buffering témával kapcsolatban finomítanék: mi AJAX-os alkalmazást fejlesztünk, ahol az adatok feldolgozása ugye csak akkor történhet meg, amikor minden megérkezett a kliensre, és a válaszidőket látványosan felgyorsította a kisebb kiküldött adatmennyiség.
Grr. Akkor mégis
A bufferinget nem igazán értem hogyan gyorsíthat. Hacsak annyival nem, hogy a tartalom nem chunkedként megy ki, tehát időközben nem számol chunk méreteket, illetve ebből következően (jobban) tudja deflate-elni.
Elnézést kérek, mivel régen
Megnéztem egy űrlapunkat, 408 kilobájt a nyers adat, 22k tömörítve, erre akartam célozni.
Hát, azt kell mondjam,
Ha egy 100k-s stringet kiprintelsz ob nélkül, 100msec, vele 2msec.
De nekem nem az ob_start segített, hanem a php.ini-ben az output_buffering paraméter beállítása. Fogalmam sincs mi a különbség, de amíg csak php kódban volt az ob, addig döglassú volt, utána megtáltosodott. Jó tipp.
karakterláncoknál a szimpla
szimpla || dupla idézőjelek
(egyszerű) karakterláncoknál gyakorlatilag nincs különbség.
Ha változott helyettesítünk be, vagy épp szerepel a karakterláncban a $ jel akkor van.
weblabor-os forrás igaz 2004-es a cikk, de talán szerintem még helytálló.
Ez egy elég jó optimalizációs
Tobbek kozott ezeket a
#teszt file_get_contents vs.
file_get_contents vs. fopen-fread-fclose: 1 - 0
(ha a teljes fájlt be kell olvasni)
Átolvastam az Armando -
A könyvnek 70%-a szól arról, hogy mit tehetünk a PHP-n kívül, amivel gyorsíthatjuk a kiszolgálást (yslow, webszerverek, opcode cache, db, stb.)
15% szól arról, hogy hogyan mérjünk bottlenecket, ha van.
15% az, ami valóban a PHP optimalizálással foglalkozik, a lényeg:
- require_once helyett require
- echonál vesszővel fűzz össze, ne ponttal, és a változókat a stringen belül helyezd el ("helo $name")
- array-t foreach-csel járj végig
- nagy fájl beolvasni file_get_contents-szel gyorsabb, kicsit fopen/fread/fclose-zal (bár a kézi teszttel ezt megerősíteni nem tudtam, inkább cáfolni)
- osztályokban lévő változókat gyorsabb közvetlenül elérni ($class->var), mint getter függvénnyel ($class->getvar())
Ennél mondjuk többet vártam.
osztályokban lévő változókat
Ezzel csak az a baj, hogy egyesek szerint a példányváltozók közvetlen elérése az objektum orientált programozással nem egyeztethető össze. (Java-soktól hallottam, nem tudom, mennyire igaz)
Dinamikus nyelvek
Ehhez csak annyit (aztán
Szóval Javas mondta, de nem a Javaból kiindulva.
Ezt csak mint magyarázat, nem vitatkozni akarok...
foreach csak esszel
... de csak ha primitiv adattipusok vannak a tombodben, mert ha tombok, objektumok vannak benne, akkor latvanyosan gyorsabb tud lenni a for, foleg nagy adatmennyisegre. Persze, csak sorszamozott tomboknel. (kb. 2-3 eve mertem, talan PHP 4-l es 5.1-l, azota valtozhatott)
Az első hozzászólásban
#teszt Fájl írás esetén (bár
Fájl írás esetén (bár nem fájlrendszer-tesztnek indult, de végül az lett), ha a cél fájlrendszer XFS, akkor akár 20-szor annyi ideig is tarthat egy már létező fájlt megnyitni írásra, mint egy nemlétezőt. Az okát nem nyomoztam ki, ext3-on a jelenség nem produkálható, máson nem próbáltam. (Ubuntu Linux 8.04 / kernel 2.6.24-16-server)
És ez bár már szerverhangolás téma, a php session adatokat semmiképpen nem érdemes XFS-re tenni.
Nos, kicsit tovább
Ha pedig memcached-re állítom a session kezelést, a script 1.3-1.8 ms-mal lassabban fut, mint a fájlrendszerbeli megoldás (függetlenül attól, hogy módosulnak-e a session adatok).
Maga a session_start()
Nemrég olvastam az "else