Você está na página 1de 5

50 dicas sobre desempenho e segurana

Desafiado pelo nosso caro Pedro Pinto para escrever um artigo, apresento este artigo sobre programao web em PHP. Como devem saber, o PHP uma linguagem de scripting server-side, Open !ource e bastante popular, sendo utili"ada por in#meros sites e aplica$es web din%micas, inclusive o pr&prio pplware e seu f&rum. O facto de ser Open !ource significa 'ue 'ual'uer pessoa pode contribuir para o pro(ecto, por e)emplo, consultando o seu c&digo fonte e sugerindo poss*veis correc$es, optimi"a$es e funcionalidades, ou testando e documentando o mesmo, ou mesmo compilar e construir os bin+rios , sua medida, escol-endo as bibliotecas 'ue dese(e e alterando o c&digo fonte do 'ue dese(ar ou precisar.

Como 'ual'uer linguagem de programao, esta encontra se optimi"ada para se obter o maior rendimento poss*vel das suas funcionalidades, mas cabe ao programador a deciso da abordagem 'ue ir+ tomar para desenvolver a sua aplicao e c-egar a um consenso entre segurana e desempen-o. .en-o ento tra"er um con(unto de dicas e boas pr+ticas para optimi"ao do vosso c&digo PHP, para mel-orar o desempen-o geral das vossas aplica$es web. /uitas destas dicas foram confirmadas em tutoriais, apresenta$es e relat&rios pela pr&pria 0end 1empresa 'ue desenvolve activamente o PHP2, ou em outros locais, sendo citado esses mesmos locais onde estas foram encontradas.

50 dicas sobre desempenho e segurana no PHP:

3. 4 funo echo mais r+pida 'ue print. /as a diferena no muito not+vel, sendo mais lento em algumas ocasi$es.

5. 4o trabal-ar com !trings, caso no utili"e avaliao de vari+veis no meio da string 1 Ol+ 67name8 9: 2, evite utili"ar aspas duplas 12 e opte por aspas simples 1;2 por'ue o PHP ir+ sempre procurar pela e)ist<ncia de vari+veis em strings com aspas duplas 1string e)emplo:2. =. Prefira usar a funo sprintf ao invs de vari+veis no meio de strings com aspas duplas. > apro)imadamente 3?) mais r+pido. @. Atili"e m#ltiplos par%metros na funo ec-o 1ec-o ;string3B, ;string5B , ;string =B C 2em ve" de concatenao de strings 1 ec-o ;string3B. ;string5B . ;string =B C 2. Dote 'ue a diferena est+ entre a utili"ao de ponto 1.2 E concatenao, e v*rgula 1,2 E par%metro. Fsto apenas se refere a strings na funo ec-o9 G. Hvite reali"ar c+lculos dentro de ciclos. Defina o limite m+)imo para os seus ciclos for antes e no l+ dentro. Deste e)emploI for 17)J?C 7) K count17arraL2C 7)2, a funo count c-amada a cada iterao do ciclo, 'uando o valor poderia estar ser guardado numa vari+vel 7ma)Jcount17arraL2C antes desse mesmo ciclo. M. Neali"e o Unset das suas vari+veis ou atribua l-es o valor DAOO para libertar mem&ria, especialmente em arraLs com grandes dimens$es. Do caso de ob(ectos, ambas as ac$es anteriores iro causar a invocao do destrutor 1funo PPdestruct122 da classe. Dote 'ue no caso da atribuio de DAOO, a vari+vel s& ser+ destru*da assim 'ue perder todas as refer<ncias para a mesma. Q. Hvite mtodos m+gicos como PPget, PPset, PPautoload. R. Atili"e re'uire12 S include12 invs de re'uirePonce12 S includePonce12, pois estas #ltimas necessitam de verificar se o fic-eiro (+ no foi inclu*do no c&digo. T. Atili"e camin-os absolutos em includes e re'uires ao invs de camin-os relativos 1..Sfic-eiro.p-p2 por'ue levam menos tempo a serem resolvidos para endereos recon-ec*veis pelo sistema operativo. 3?. re'uire12 e include12 so id<nticos com uma diferenaI Da funo re'uire, a e)ecuo fal-a com erro fatal se o fic-eiro estiver em falta. 33. Desde a verso G do PHP, o momento temporal em 'ue o script iniciou a sua e)ecuo pode ser encontrado em 7P!HN.HNUVNHWAH!XPXF/HVY. Atili"e isto em ve" das fun$es time12 ou microtime12. 35. Nege) baseado em bibliotecas PCNH muito mais r+pido 'ue HNHZ, mas se possivel recorra a fun$es nativas mais r+pidas como strncasecmp, strpbr[ e stripos. 3=. Wuando analisar \/O no PHP, e)perimente )ml5arraL, 'ue fa" uso das fun$es \/O do PHP. Para HX/O pode e)perimentar DO/ document do PHP ou DO/ \/O na verso @ do PHP. 3@. strPreplace mais r+pido 'ue pregPreplace, mas ,s ve"es strtr mais r+pido 'ue strPreplace com grandes strings. Atili"ar arraL12 dentro de strPreplace usualmente mais r+pido 'ue m#ltiplos strPreplace. 3G. 4o contr+rio de outras linguagens de programao populares, declara$eselse if: no PHP so mais r+pidas 'ue declara$es select tambm con-ecido como caseSswitc-. Com a evoluo cont*nua do p-p, actualmente a diferena muito insignificante, mas denota se 'ue a utili"ao do operador JJJ 1id<ntico2 nas condi$es if mais r+pido 'ue a utili"ao do operador JJ 1igual2. 3M. !upresso de erros com ] bastante custoso a n*vel de desempen-o. 3Q. Para redu"ir a utili"ao de largura de rede, active modPdeflate no 4pac-e v5 ou tente modPg"ip em 4pac-e v3. 3R. Hncerre as cone)$es , sua base de dados 'uando no precisar mais delas.

3T. Atili"ar 7rowUVidVY Q ve"es mais r+pido 'ue 7rowUidY, por'ue se no fornecer aspas, o PHP ter+ 'ue adivin-ar: 'ual o *ndice 'ue se refere, assumindo 'ue no se(a uma constante. 5?. Atili"e as tags K^p-p _ ^` para declarar PHP pois todos os outros estilos encontram se classificados como DEPRECATED, incluindo as tags curtas 1K^ _ ^` 2. 53. Atili"e c&dico estrito, evite supressao de erros, notifica$es 1notices2 e avisos 1warnings2 resultando num c&digo mais limpo e com menos sobrecargas. Considere activar sempre errorPreporting1HP4OO2 1em ambiente de desenvolvimento2. 55. !cripts PHP so gerados 5 3? ve"es mais lentamente pelo -ttpd do 4pac-e 'ue uma pagina est+tica. Xente utili"ar mais p+ginas est+ticas em ve" de scripts no servidor. 5=. Os scripts PHP 1se no utili"arem cac-e2 so interpretados e compilados no momento e cada ve" 'ue so c-amados. Fnstale um produto de gesto de cac-e do PHP 1como o memcac-ed ou e4ccelerator ou Xurc[ //Cac-e2 para tipicamente incrementar o desepen-o em 5G 3??a removendo o tempos de compilao. Pode tambm configurar e4ccelerator no cPanel utili"ando HasL4pac-e=. 5@. Ama alternativa ,s tcnicas de cac-e 'uando se tem p+ginas 'ue no mudam muito fre'uentemente reali"ar cac-e do HX/O produ"ido pelas p+ginas PHP. Xente !martL ou Cac-e Oite. 5G. Atili"e a funo isset onde possivel em lugar da funo strlen. 1por e)emploI if 1strlen17foo2 K G2 6 ec-o boo is too s-ort:C 8 .!. if 19isset17foo6G822 6 ec-o boo is too s-ort:C 8 2. 5M. cc7i mais r+pido 'ue 7 icc, logo utili"e pre incremento 'uando poss*vel. 5Q. baa uso das in#meras fun$es predefinidas do PHP, no tente construir as suas pr&prias pois as nativas iro ser com certe"a muito mais r+pidas. !e tiver fun$es dispendiosas a n*vel temporal e recursos, considere escreve las como e)tens$es C ou m&dulos. 5R. Crie um perfil 1profile2 do seu c&digo. Am profiler revelar+ os consumos das variadas sec$es do seu c&digo. O \debug debugger (+ contem um profiler. Profiling ir+ mostrar uma s*ntese dos gargalos e)istentes. 5T. Documente o seu c&digo9 4dopte o estilo de documentao do p-pdoc 1semel-ante a (avadoc do dava2, para poder utili"ar sem problemas a ferramenta de gerao autom+tica de documentao do p-p. =?. 4prenda a diferena entre bom c&digo e mau c&digo. =3. 4garre se aos padr$es de programao, pois estes iro facilitar a compreenso dos c&digos criados por outras pessoas e vice versa. =5. !epara o c&digo, conte#do e apresentaoI dei)e o seu c&digo PHP separado do seu HX/O. ==. Do se preocupe em utili"ar sistemas comple)os de templates como !martL, se possivel utili"e fun$es inclu*das no PHP como obPgetPcontents e simplesmente pu)e os dados da sua base de dados 1aconsel-o vivamente a leitura da citao2. =@. eNuncae confie nas vari+veis provenientes do lado do utili"ador 1como o 7PPO!X2 utili"e mLs'lPrealPescapePstring 'uando recorrer ao mLs'l, e -tmlspecialc-ars 'uando reali"ar output dessas mesmas vari+veis para HX/O. Atili"e mLs'lPrealPescapePstring em ve" de mLs'lPescapePstring 1DEPRECATED2 ou addslas-es.

=G. Por 'uest$es de segurana, nunca dei)e algo 'ue possa e)por informao sobre camin-os, e)tens$es e configura$es, como o displaLPerrors ou p-pinfo12 na sua directoria rai" 1aplica se principalmente em ambientes de produo2. =M. Desligue as registerPglobals 1esto desactivadas por defeito por alguma ra"o92. Den-um script em ambiente de produo necessita disto activado, pois representa um enorme risco de segurana. Corri(a 'ual'uer script 'ue necessite esta funcionalidade activa e 'ue recorra a unregisterPglobals12. baa isto o mais rapidamente possivel por'ue a funcionalidade ser+ removida no PHPM. =Q. Hvite usar te)to simples 'uando arma"enar ou avaliar passwords, evitando assim 'ual'uer e)posio. 4o invs, utili"e uma -as-, como a -as- mdG ou s-a3 ou uma combinao de ambas 1e se possivel e necess+rio, recorrendo a sal 1salt22. =R. Atili"e ip5long12 e long5ip12 para arma"enar endereos FP como inteiros 1long2 ao invs de strings. =T. Wuando utili"ar -eader1;OocationI ;.7url2C lembre se de colocar , frente um die12C por'ue o script continua a e)ecutar mesmo 'ue a locali"ao mude. @?. Hm Programao Orientada a Ob(ectos, se e)istir um mtodo 'ue possa ser est+tico 1static met-od2, declare o est+tico. .elocidade mel-orada por um factor de @. . @3. Fncrementar uma vari+vel local num mtodo de Programao OO o mais r+pido, sendo apro)imadamente o mesmo 'ue aceder a uma vari+vel local numa funo. Fncrementar uma vari+vel global 5 ve"es mais lento 'ue uma vari+vel local. @5. Fncrementar uma propriedade de um ob(ecto 1eg. 7t-is `propcc2 = ve"es mais lento 'ue incrementar uma vari+vel local. @=. Fncrementar uma vari+vel local no definida T a 3? ve"es mais lento 'ue incrementar uma vari+vel pr iniciali"ada. @@. !omente declarar uma vari+vel global dentro de uma funo sem a utili"ar t<m efeitos negativos no desempen-o 1apro)imadamente o mesmo 'ue incrementar uma vari+vel local2, visto o PHP provavelmente verificar se a mesma (+ e)iste. @G. Fnvocao de mtodos parece ser independente do n#mero de mtodos definidos na classe, por'ue ao adicionar 3? mtodos e)tras na classe de teste 1antes e depois do mtodo de teste2, no -ouve mudanas no desempen-o. @M. /todos em classes derivadas e)ecutam mais depressa 'ue 'ue os mtodos nas classes base. @Q. 4 c-amada de uma funo com um par%metro e sem corpo 1corpo va"io2, leva apro)imadamente o mesmo tempo 'ue fa"er Q R opera$es de incrementao de vari+veis locais 17varcc2. C-amadas de mtodos similares levam apro)imadamente o tempo de 3G opera$es de incrementao de vari+veis locais. @R. Dem tudo precisa de ser reali"ado em Programao Orientada a Ob(ectos, pois normalmente s& sobrecarrega o programa, visto as c-amadas de mtodos e ob(ectos consumirem muita mem&ria. @T. Hvite o problema de in(eco de cabeal-os na funo mail12 do PHP. G?. NXb/9 O PHP oferece um enorme e fant+stico manual, sendo possivelmente um dos mel-ores na Fnternet, contendo a documentao de todas as bibliotecas em ingl<s simples 1tambm dispon*vel em portugu<s do frasil2, um con(unto de e)emplos pr+ticos e participao da comunidade com ainda mais e)emplos e dicas. !implesmente AXFOF0H O999 4 lista foi retirada, tradu"ida e adaptada de -m5[.com.

Denoto este site onde podero verificar alguns testes simples de benc-mar[ing onde se analisa a velocidade de diferentes fun$es e estruturas de deciso. Xen-am em mente 'ue os testes podem ser facilmente adulterados pela carga do servidor onde a p+gina est+ alo(ada, sendo necess+rio actuali"ar 1recarregando a p+gina2 e observar os resultados varias ve"es. Dei)o o desafio para enumerarem o vosso top G de dicas e outras 'ue con-eam e no foram mencionadas, se poss*vel indicando a fonte.