php.ini

Cresteti viteza aplicatiilor web prin modificarea configurarii php

Acest articol doreste sa va ajute sa mariti viteza aplicatiilor php pe care le scrieti prin tweaking la configurarile php default. Timpul castigat prin aceste modificari poate nu va fi asa vizibil din partea de user, dar poate usura un pic munca server-ului, deasemenea unele vor avea si un impact in partea de securitate a aplicatiei.

Daca esti pe un server shared si nu stii cum se schimba configurarea php ar fi poate mai bine sa citesti acest articol inainte.

Dar destul cu palavrageala hai sa vedem exact despre ce e vorba. Voi scrie numele configurari, setarea pe care o recomand si motivatia pentru aceasta configurare.

short_open_tag = Off

Aceasta va anula short tags ( <? .... ?> ) care nu sunt atat de recomandat de folosit si in plus engine-ul php va avea o problema in plus pe care sa il rezolve.

asp_tags = Off

Aceasi explicatie ... nu folosi taguri : <% echo “hello world”; %>

memory_limit = 32M

Aceasta configurare va fi una pe care o vei modifica de cateva ori. Dar e mai bine ca pentru inceput sa o setezi la o valoare mai mica pentru a urmari care scripturi folosesc mai multa memorie si a urmari din ce cauza se inampla aces lucru.
Un articol despre consumul de memorie in php poti gasi aici .

register_long_array = Off

Aceasta configurare spune engine-ului PHP sa nu mai declare variabilele de tip $HTTP_*_VARS care sunt de mult timp nefolosite. Valoarea default e On. Din cauza ca nimeni nu prea le foloseste ( doar daca nu aveti nevoie pentru compatibilitate cu vreun script mai vechi ) e recomandat sa le aveti off, pentru motive de performanta. In locul lor este recomandat sa folosti matricile superglobale $_GET, $_POST etc.

register_argc_argv = Off

Aceasta setare e mai mult sau mai putin la fel ca cea de sus register_long_arrays ( daca credeti ca ma insel, certati-ma intr-un comentariu ) asa ca o vom seta tot off.

auto_globals_jit = On

Aceasta setare va opri php sa genereze variabilele SERVER si ENV la inceputul scriptului ( asa cum face in configuratia default ), in schimb generandule pe masura ce ele sunt necesare (Just In Time). Aceasta ar trebui sa ajute la performanta prin reducerea cantitatii de memorie folosita de scriptul php.
Pentru ca aceasta setare sa functioneze este nevoie ca register_globals, register_long_arrays, si register_argc_argv sa fie disabled.
Ca un inside info : am incercat pe unul din servere aceasta configuratie si nu a mers, variabilele SERVER si ENV fiind nule, dar cred ca era ceva in neregula pentru ca am incercat pe alt server si a mers :D.

magic_quotes_gpc

Aceasta setare s-a dovedit a fi o adevarata durere de cap cateodata. Cand este on , toate ' (ghilimele simple), " (ghilimele duble), \ (backslash) si valori NUL's sunt "anulate" cu un backslash automat. De ce este asa rau ? Pentru ca nu detineti dumneavoastra controlul asupra acestui lucru. De exemplu daca folositi un mysql wrapper pentru interactiunea cu baza de date care are deja o functie de escape ( probabil si mai mult decat atat, una de clean pentru coduri sql ), ceea ce va face ca valorile introduse sa fie de doua ori "escaped" si dupa cateva edit-uri sa zicem valoarea va fi plina de backslash-uri. Asa ca mai bine o setezi off si iti faci propriul escape, si poate si o functie de clean pentru valorile folosite in interogarile SQL pentru a preveni SQL Injection.

always_populate_raw_post_data = Off

Raw Post data este o setare mai avansata, asa ca daca nu stii despre ce e vorba inseamna ca nu o folosesti asa ca mai bine o setezii off si ii mai iei o grija din lista de treburi facute de engine-ul php

Cam atat pentru acum .... daca v-am fost util s-au vreti sa ma certati ca am batut campii ... folositi cu incredere formularul de comentarii


Cum se poate schimba configurarea php pe un server shared ?

Cateodata in aplicatiile pe care le creati veti fi nevoiti sa modificati o anumita configurare a php-ului de la valoarea default la valoare necesara pentru a putea dezvolta aplicatia. Cea mai intalnita modificare este aceea legata de flag-ul global_registers si anume setarea lui off ( nu am nici cea mai mica idee de ce unele servere inca mai au global_registers on ).

Daca este vorba de un server local pe care il rulazi pe calculatorul tau, sau de un server la care ai acces de root, solutia este foarte simpla : trebuie doar sa modifici ce doresti in fisierul de configurare (php.ini) ce ai nevoie, restart la server ... si voila job done.

Dar ce se intampla daca esti pe un hosting shared. Nu poti sa ceri echipei de suport a serverului sa modifice configurarea pentru tine ( nu prea ar putea nici daca ar vrea, deoarece ar afecta toate site-urile de pe server si ar fi cativa oameni nervosi pe chatul de suport in cateva minute de la schimbare :D ). Din fericire persoanele care au construit software-ul rulat de server ( apache in cele mai multe cazuri ) s-au gandit la tine si la situatia asta si au adaugat 2 posibilitati ca tu sa poti schimba local configurarile php fara a afecta celelalte domenii hostate pe server.

1. Crearea unui fisier PHP.ini local

Pur si simplu creezi un nou fisier php.ini in root-ul domeniului si adaugi configurarile de care ai nevoie in aceast fisier ca si cum el ar fi cel din directorul de instalare al php-ului. Aceasta va face ca acele setari sa fie suprascrise de la cele globale doar pentru domeniul tau. Revenind la situatia noastra de a seta register_globals off ar tb sa adaugi urumatoarea linie :

“register_globals = off”

2. Modificarea configurarii cu fisierul .htaccess

A doua metoda ar fi sa te folosesti de fisierul .htaccess ( cunoscut de uni doar pentru partea de url_rewrite ). Pentru aceasta trebuie sa stii o anumit sintaxa:

# pentru a modifica un atribut flag
php_flag [name] [value]

# pentru a modifica un atribut valoare
php_value [name] [value]

Revenind la exemplul nostru : php_flag register_globals off

Pentru a testa daca modificarile facute au fost efectuate, poti folosi functia phpinfo(). Noile setari ar trebui sa apara in coloana LOCAL.
Ar trebui sa stii ca nu toate serverele suporta aceste 2 metode, unele suporta doar una dintre ele, asa ca ar fi indicat sa intrebi baieti de la suport care din aceste metode este suportata de server, nu de alta dar sa nu te chinui degeaba si sa spui ca ti-am spus eu prostii.

Si inca o nota, nu toate setarile php pot fi modificate local. O lista cu toate setarile si cum pot fi ele modificate se gaseste pe site-ul oficial php :
http://www.php.net/manual/en/ini.php#ini.list
Setarile care pot fi suprascrise local au PHP_INI_PERDIR sau PHP_INI_ALL in coloana Changeable. Cele care au PHP_INI_SYSTEM pot fi modificate doar din fisierul php.ini din folderul de instalare al php-ului.

Cam asta a fost. Sper ca v-a redus googling time-ul putin.
Cheers.