<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>:::PTBYTE::: &#187; semogj</title>
	<atom:link href="http://www.ptbyte.net/home/archives/author/darthx/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ptbyte.net/home</link>
	<description>Sempre a inovar</description>
	<lastBuildDate>Tue, 31 Jan 2012 17:02:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Problemas</title>
		<link>http://www.ptbyte.net/home/archives/185</link>
		<comments>http://www.ptbyte.net/home/archives/185#comments</comments>
		<pubDate>Mon, 01 Mar 2010 00:20:59 +0000</pubDate>
		<dc:creator>semogj</dc:creator>
				<category><![CDATA[Outros - Geral]]></category>

		<guid isPermaLink="false">http://www.ptbyte.net/home/?p=185</guid>
		<description><![CDATA[<p>Comunicamos a ocorrência de problemas em 2 subdomínios do PTBYTE nos últimos dias.</p>
<p>No subdomínio <a href="http://oslusitanos.ptbyte.net" target="_blank">http://oslusitanos.ptbyte.net</a> detectou-se um problema que impedia o seu acesso e causava uma redução muito significativa do desempenho do nosso servidor de alojamento, tendo sido necessário &#8230; <a href="http://www.ptbyte.net/home/archives/185" class="read_more">Ler o resto.</a></p>]]></description>
			<content:encoded><![CDATA[<p>Comunicamos a ocorrência de problemas em 2 subdomínios do PTBYTE nos últimos dias.</p>
<p>No subdomínio <a href="http://oslusitanos.ptbyte.net" target="_blank">http://oslusitanos.ptbyte.net</a> detectou-se um problema que impedia o seu acesso e causava uma redução muito significativa do desempenho do nosso servidor de alojamento, tendo sido necessário proceder à sua desactivação até este ser correctamente identificado e resolvido. Mais informações serão dadas em breve relativamente ao problema.</p>
<p>Recentemente recebemos outro relatório sobre erros presentes no nosso subdomínio <a href="http://mindtricks.ptbyte.net " target="_blank">http://mindtricks.ptbyte.net </a>que impossibilitavam de igual forma o acesso ao fórum que se encontra presentemente instalado no mesmo, mas os quais foram já resolvidos.</p>
<p><strong>Actualização:</strong> Os problemas encontram-se resolvidos. Pedimos desculpa pelos incómodos causados.</p>
<p><br class="spacer_" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ptbyte.net/home/archives/185/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP &#8211; Mais de 50 dicas sobre desempenho e segurança</title>
		<link>http://www.ptbyte.net/home/archives/132</link>
		<comments>http://www.ptbyte.net/home/archives/132#comments</comments>
		<pubDate>Fri, 26 Feb 2010 10:00:04 +0000</pubDate>
		<dc:creator>semogj</dc:creator>
				<category><![CDATA[Destaque-Site]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação e Desenvolvimento Web]]></category>

		<guid isPermaLink="false">http://www.ptbyte.net/home/?p=132</guid>
		<description><![CDATA[<p>Como devem saber, o PHP é uma linguagem de scripting <em>&#8220;server-side</em>&#8220;, Open-Source e bastante popular, sendo utilizada por inúmeros sites e aplicações web dinâmicas, inclusive este mesmo site.O facto de ser Open-Source significa que qualquer pessoa pode contribuir para &#8230; <a href="http://www.ptbyte.net/home/archives/132" class="read_more">Ler o resto.</a></p>]]></description>
			<content:encoded><![CDATA[<p>Como devem saber, o PHP é uma linguagem de scripting <em>&#8220;server-side</em>&#8220;, Open-Source e bastante popular, sendo utilizada por inúmeros sites e aplicações web dinâmicas, inclusive este mesmo site.O facto de ser Open-Source significa que qualquer pessoa pode contribuir para o projecto, por exemplo, consultando o seu código fonte e sugerindo possíveis correcções, optimizações e funcionalidades, ou testando e documentando o mesmo, ou mesmo compilar e construir os binários à sua medida, escolhendo as bibliotecas que deseje e alterando o código fonte do que desejar ou precisar.</p>
<p style="text-align: center;"><a href="http://www.ptbyte.net/home/wp-content/uploads/2010/02/peluchephp.jpg"><img class="size-medium wp-image-134 aligncenter" title="peluchephp" src="http://www.ptbyte.net/home/wp-content/uploads/2010/02/peluchephp-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p>Como qualquer linguagem de programação, esta encontra-se optimizada para se obter o maior rendimento possivel das suas funcionalidades, mas cabe ao programador a decisão da abordagem que irá tomar para desenvolver a sua aplicação e chegar a um consenso entre segurança e desempenho.</p>
<p><span id="more-132"></span>Venho então trazer um conjunto de dicas e boas práticas para optimização do vosso código PHP, para melhorar o desempenho geral das vossas aplicações web. Muitas destas dicas foram confirmadas em tutoriais, apresentações e relatórios pela própria Zend (empresa que desenvolve activamente o PHP), ou em outros locais, sendo citado esses mesmos locais onde estas foram encontradas.</p>
<h2>50 dicas sobre desempenho e segurança no PHP:<br class="spacer_" /></h2>
<ol>
<li>A função <a href="http://www.php.net/echo" target="_blank"><em>echo</em></a> é mais rápida que <a href="http://www.php.net/print" target="_blank"><em>print</em></a>. <a href="http://web.archive.org/web/20050407085143/http://dynacker.dotgeek.org/printvsecho/" target="_blank">[Citação]</a> Mas a diferença não é muito notável, sendo mais lento em algumas ocasiões. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Ao trabalhar com Strings, caso não utilize avaliação de variáveis no meio da string ( &#8220;Olá {$name} !&#8221; ),  evite utilizar aspas duplas (“) e opte por aspas simples (‘) porque o PHP irá sempre procurar pela existência de variáveis em strings com aspas duplas (&#8220;string exemplo&#8221;). <a href="http://spindrop.us/2007/03/03/php-double-versus-single-quotes/" target="_blank">[Citação]</a></li>
<li>Prefira usar a função <a href="http://pt.php.net/manual/en/function.sprintf.php" target="_blank">sprintf</a> ao invés de variáveis no meio de strings com aspas duplas. É aproximadamente 10x mais rápido. <a href="http://teroheikkinen.iki.fi/blog/php-s_different_echo_methods_performance_comparison/" target="_blank">[Citação]</a></li>
<li>Utilize múltiplos parâmetros na função <a href="http://www.php.net/echo" target="_blank">echo</a> (echo &#8216;string1&#8242;, &#8216;string2&#8242; , &#8216;string 3&#8242; ; )em vez de concatenação de strings ( echo &#8216;string1&#8242;. &#8216;string2&#8242; . &#8216;string 3&#8242; ; ). Note que a diferença está entre a utilização de ponto (.) &#8211; concatenação, e vírgula (,) &#8211; parâmetro. Isto <span style="text-decoration: underline;">apenas</span> se refere a strings na função <a href="http://www.php.net/echo" target="_blank">echo</a>! <a href="http://blog.libssh2.org/index.php?/archives/28-How-long-is-a-piece-of-string.html" target="_blank">[Citação]</a></li>
<li>Evite realizar cálculos dentro de ciclos. Defina o limite máximo para os seus ciclos <em><a href="http://www.php.net/for" target="_blank">for</a></em> antes e não lá dentro. Neste exemplo: <a href="http://www.php.net/for" target="_blank">for</a> ($x=0; $x &lt; count($array); $x), a função <em><a href="http://pt.php.net/manual/en/function.count.php" target="_blank">count</a> </em>é chamada  a cada iteração do ciclo, quando o valor poderia estar ser guardado numa variável $max=count($array); antes desse mesmo ciclo. <a href="http://www.php.lt/benchmark/phpbench.php" target="_blank">[Citação]</a></li>
<li>Realize o <a href="http://pt.php.net/manual/en/function.unset.php" target="_blank"><em>Unset </em></a>das suas variáveis ou atribua-lhes o valor NULL para libertar memória, especialmente em <a href="http://pt.php.net/manual/en/book.array.php" target="_blank">arrays</a> com grandes dimensões. No caso de objectos, ambas as acções anteriores irão causar a invocação do destrutor (<a href="http://pt.php.net/manual/en/language.oop5.decon.php" target="_blank">função __destruct()</a>) da classe. Note que no caso da atribuição de NULL, a variável só será destruída assim que perder todas as referências para a mesma. <a href="http://lists.nyphp.org/pipermail/talk/2003-January/001855.html" target="_blank">[Citação]</a></li>
<li>Evite métodos mágicos como <a href="http://uk2.php.net/manual/en/language.oop5.overloading.php" target="_blank">__get,  __set</a>, <a href="http://www.php.net/__autoload" target="_blank">__autoload</a>. <a href="http://www.ilia.ws/files/zend_performance.pdf" target="_blank">[Citação]</a></li>
<li>Utilize <a href="http://pt.php.net/manual/en/function.require.php" target="_blank">require()</a> / <a href="http://www.php.net/manual/en/function.include.php" target="_blank">include()</a> invés de <a href="http://pt2.php.net/manual/en/function.require-once.php" target="_blank">require_once()</a> /<a href="http://pt2.php.net/manual/en/function.include-once.php" target="_blank"> include_once()</a>, pois estas últimas necessitam de verificar se o ficheiro já não foi incluído no código. <a href="http://peter.mapledesign.co.uk/weblog/archives/writing-faster-php-code-1-require_once" target="_blank">[Citação]</a></li>
<li>Utilize caminhos absolutos em includes e requires ao invés de caminhos relativos (../ficheiro.php) porque levam menos tempo a serem resolvidos para endereços reconhecíveis pelo sistema operativo. <a href="http://t3.dotgnu.info/blog/php/include_once-mostly-harmless.html" target="_blank">[Citação]</a></li>
<li><a href="http://pt.php.net/manual/en/function.require.php" target="_blank">require()</a> e <a href="http://www.php.net/manual/en/function.include.php" target="_blank">include()</a> são idênticos com uma diferença: Na função <a href="http://pt.php.net/manual/en/function.require.php" target="_blank">require</a>, a execução falha com erro fatal se o ficheiro estiver em falta. <a href="http://groups.google.com/group/php.general/browse_thread/thread/72332fe1ed21e104/b1650148cd6e3c17?lnk=st&amp;q=php+require+vs+include+performance#b1650148cd6e3c17" target="_blank">[Citação]</a></li>
<li>Desde a versão 5 do PHP, o momento temporal em que o script iniciou a sua execução pode ser encontrado em <a href="http://www.php.net/manual/en/reserved.variables.server.php#92121" target="_blank">$_SERVER[’REQUEST_TIME’]</a>. Utilize isto em vez das funções  <a href="http://pt.php.net/manual/en/function.time.php" target="_blank">time()</a> ou  <a href="http://pt.php.net/manual/en/function.microtime.php" target="_blank">microtime()</a>. <a href="http://www.php.net/time" target="_blank">[Citação]</a></li>
<li><a href="http://www.regular-expressions.info/" target="_blank">Regex</a> baseado em bibliotecas <a href="http://www.php.net/pcre">PCRE</a> é muito mais rápido que <a href="http://www.php.net/ereg">EREG</a>, mas se possivel recorra a funções nativas mais rápidas como  <a href="http://www.php.net/strncasecmp" target="_blank">strncasecmp</a>, <a href="http://www.php.net/strpbrk" target="_blank">strpbrk</a> e <a href="http://www.php.net/stripos" target="_blank">stripos</a>. <a href="http://talks.php.net/show/php-best-practices/36" target="_blank">[Citação]</a></li>
<li>Quando analisar XML no PHP, experimente <a href="http://www.bin-co.com/php/scripts/xml2array/" target="_blank">xml2array</a>, que faz uso das <a href="http://www.php.net/xml" target="_blank">funções XML do PHP</a>.  Para HTML pode experimentar <a href="http://www.php.net/dom" target="_blank">DOM  document</a> do PHP ou <a href="http://www.php.net/domxml" target="_blank">DOM XML</a> na versão 4 do PHP.  <a href="http://htmlparsing.icenine.ca/" target="_blank">[Citação]</a></li>
<li><a href="http://www.php.net/str_replace" target="_blank">str_replace</a> é mais rápido que  <a href="http://www.php.net/preg_replace">preg_replace</a>, mas às vezes <a href="http://www.php.net/strtr" target="_blank">strtr</a> é mais rápido que <a href="http://www.php.net/str_replace" target="_blank">str_replace</a> com grandes strings. Utilizar <a href="http://pt2.php.net/manual/en/function.array.php" target="_blank">array()</a> dentro de <a href="http://www.php.net/str_replace" target="_blank">str_replace</a> é usualmente mais rápido que múltiplos <a href="http://www.php.net/str_replace" target="_blank">str_replace</a>. <span style="text-decoration: line-through;">[Citação]</span></li>
<li>Ao contrário de outras linguagens de programação populares, declarações“else if” no PHP são mais rápidas que declarações <a href="http://en.wikipedia.org/wiki/Switch_statement">select</a> também conhecido como <a href="http://www.php.net/switch">case/switch</a>.  <a href="http://www.php.lt/benchmark/phpbench.php" target="_blank">[Citação]</a> Com a evolução contínua do php, actualmente a diferença é muito insignificante, mas denota-se que a utilização do operador <a href="http://www.php.net/manual/en/language.operators.comparison.php">=== (idêntico) </a>nas condições if é mais rápido que a utilização do operador <a href="http://www.php.net/manual/en/language.operators.comparison.php">== (igual)</a>.</li>
<li><a href="http://php.net/manual/en/language.operators.errorcontrol.php" target="_blank">Supressão de erros com @</a> é bastante custoso a nível de desempenho. <a href="http://michelf.com/weblog/2005/bad-uses-of-the-at-operator/" target="_blank">[Citação]</a></li>
<li>Para reduzir a utilização de largura de rede, active mod_deflate no Apache v2 <a href="http://howtoforge.com/apache2_mod_deflate" target="_blank">[Citação]</a> ou tente mod_gzip em Apache v1. <a href="http://talks.php.net/show/php-best-practices/40" target="_blank">[Citação]</a></li>
<li>Encerre as conexões à sua  base de dados quando não precisar mais delas. <a href="http://uk.php.net/manual/en/function.mysql-close.php#69063" target="_blank">[Citação]</a></li>
<li>Utilizar $row[’id’] é 7 vezes mais rápido que $row[id], porque se não fornecer aspas, o PHP terá que &#8220;adivinhar&#8221; qual o índice que se refere, assumindo que não seja uma constante. <a href="http://www.php.net/constants#language.constants.syntax" target="_blank">[Citação]</a></li>
<li>Utilize as tags &lt;?php … ?&gt; para declarar  PHP pois todos os outros estilos encontram-se classificados como <em><strong><tt>DEPRECATED</tt></strong></em>, incluindo as tags curtas (&lt;? &#8230; ?&gt; ). <a href="http://talks.php.net/show/php-best-practices/10" target="_blank">[Citação]</a></li>
<li>Utilize códico estrito, evite supressao de erros, notificações (notices) e avisos (warnings) resultando num código mais limpo e com Use strict code, avoid suppressing errors, notices and warnings thus  resulting in cleaner code e menos sobrecargas. Considere activar sempre <a href="http://www.php.net/error_reporting" target="_blank">error_reporting(E_ALL)</a> (em ambiente de desenvolvimento). <a href="http://talks.php.net/show/php-best-practices/11" target="_blank">[Citação]</a></li>
<li>Scripts PHP são gerados 2-10 vezes mais lentamente pelo httpd do Apache que uma pagina estática. Tente utilizar mais páginas estáticas em vez de scripts no servidor. <a href="http://talks.php.net/show/php-best-practices/34" target="_blank">[Citação]</a></li>
<li>Os scripts PHP (se não utilizarem cache) são interpretados e compilados no momento e cada vez que são chamados. Instale um produto de gestão de cache do PHP (como o <a href="http://www.php.net/memcache" target="_blank">memcached</a> ou <a href="http://eaccelerator.net/" target="_blank">eAccelerator</a> ou <a href="http://sourceforge.net/projects/turck-mmcache/" target="_blank">Turck MMCache</a>)  para tipicamente incrementar o desepenho em 25-100% removendo o tempos de compilação. Pode também <a href="http://www.cpanel.net/support/docs/ea/ea3/ea3php_php_extensionmgr.html" target="_blank">configurar eAccelerator no cPanel utilizando EasyApache3</a>. <a href="http://www.phpfive.net/php-opcode-caching-with-eaccelerator-article45.htm" target="_blank">[Citação]</a></li>
<li>Uma alternativa às técnicas de cache quando se tem páginas que não mudam muito frequentemente é realizar cache do HTML produzido pelas páginas PHP. Tente <a href="http://smarty.php.net/" target="_blank">Smarty</a> ou <a href="http://pear.php.net/Cache_Lite" target="_blank">Cache Lite</a>.  <a href="http://phplens.com/phpeverywhere/tuning-apache-php" target="_blank">[Citação]</a></li>
<li>Utilize a função <a href="http://php.net/manual/en/function.isset.php" target="_blank">isset</a> onde possivel em lugar da função <a href="http://pt.php.net/manual/en/function.strlen.php" target="_blank">strlen</a>. (por exemplo:  if (strlen($foo)  &lt; 5) { echo “Foo is too short”; } VS. if (!isset($foo{5})) { echo  “Foo is too short”; } ). <a href="http://blog.dynom.nl/archives/String-length-vs-isset-to-check-string-lengths_20070807_5.html" target="_blank">[Citação]</a></li>
<li>++$i é mais rápido que $ i++,  logo <a href="http://www.hudzilla.org/phpwiki/index.php?title=Pre-increment_where_possible" target="_blank">utilize  pre-incremento quando possível</a>. <a href="http://talks.php.net/show/php-best-practices/32" target="_blank">[Citação]</a></li>
<li>Faça uso das inúmeras <a href="http://pt.php.net/manual/en/indexes.php" target="_blank">funções predefinidas do PHP</a>, não tente construir as suas próprias pois as nativas irão ser com certeza muito mais rápidas. Se tiver funções dispendiosas a nível temporal e  recursos, considere escreve-las como extensões C ou módulos. <a href="http://talks.php.net/show/php-best-practices/31" target="_blank">[Citação]</a></li>
<li>Crie um perfil (<em>profile</em>) do seu código. Um <em>profiler </em>revelará os consumos das variadas secções do seu código. O <a href="http://xdebug.org/" target="_blank">Xdebug debugger</a> já contem um <em>profiler</em>. <em>Profiling </em>irá mostrar uma síntese dos gargalos existentes. <a href="http://talks.php.net/show/php-best-practices/39" target="_blank">[Citação]</a></li>
<li>Documente o seu código! Adopte o estilo de documentação do <a href="http://www.phpdoc.org/" target="_blank">phpdoc</a> (semelhante a javadoc do Java), para poder utilizar sem problemas a <a href="http://www.phpdoc.org/" target="_blank">ferramenta de geração automática de documentação do php</a>. <a href="http://talks.php.net/show/php-best-practices/16" target="_blank">[Citação]</a></li>
<li>Aprenda a diferença entre bom código e mau código. <a href="http://www.sitepoint.com/blogs/2007/05/25/good-and-bad-php-code/" target="_blank">[Citação]</a></li>
<li>Agarre-se aos padrões de programação, pois estes irão facilitar a compreensão dos códigos criados por outras pessoas e vice-versa. <a href="http://talks.php.net/show/php-best-practices/15" target="_blank">[Citação]</a></li>
<li>Separa o código, conteúdo e apresentação: deixe o seu código PHP separado do seu HTML. <a href="http://www.ibm.com/developerworks/library/wa-phprock1/index.html" target="_blank">[Citação]</a></li>
<li>Não se preocupe em utilizar sistemas complexos de <em>templates </em>como Smarty, se possivel utilize funções incluídas no PHP como <a href="http://www.php.net/ob_get_contents" target="_blank">ob_get_contents</a> e simplesmente puxe os dados da sua base de dados (aconselho vivamente a leitura da citação). <a href="http://www.massassi.com/php/articles/template_engines/" target="_blank">[Citação]</a></li>
<li>*<strong>Nunca</strong>* confie nas variáveis provenientes do lado do utilizador (como o $_POST) utilize <a href="http://www.php.net/mysql_real_escape_string" target="_blank">mysql_real_escape_string</a> quando recorrer ao mysql, e <a href="http://www.php.net/htmlspecialchars" target="_blank">htmlspecialchars</a> quando realizar output dessas mesmas variáveis para HTML. <a href="http://talks.php.net/show/php-best-practices/19">[Citação]</a> Utilize <a href="http://www.php.net/mysql_real_escape_string" target="_blank">mysql_real_escape_string</a> em vez de <a href="http://pt.php.net/manual/en/function.mysql-escape-string.php" target="_blank">mysql_escape_string</a> (<em><strong><tt>DEPRECATED</tt></strong></em>)  ou addslashes.<a href="http://www.jemjabella.co.uk/articles/php-security-tips" target="_blank">[Citação]</a></li>
<li>Por questões de segurança, nunca deixe algo que possa expor informação sobre caminhos, extensões e configurações, como o display_errors ou <a href="http://www.php.net/phpinfo" target="_blank">phpinfo</a>() na sua directoria raiz (aplica-se principalmente em ambientes de produção). <a href="http://talks.php.net/show/php-best-practices/24" target="_blank">[Citação]</a></li>
<li>Desligue as <a href="http://www.php.net/register_globals" target="_blank">register_globals</a> (estão desactivadas por defeito por alguma razão!). Nenhum script em ambiente de produção necessita disto activado, pois representa um enorme risco de segurança. Corrija qualquer script que necessite esta funcionalidade activa e que recorra a <a href="http://uk.php.net/manual/en/security.globals.php#82542" target="_blank">unregister_globals()</a>.  Faça isto o mais rapidamente possivel porque a funcionalidade será removida no PHP6. <a href="http://talks.php.net/show/php-best-practices/27" target="_blank">[Citação]</a></li>
<li>Evite usar texto simples quando armazenar ou avaliar passwords, evitando assim qualquer exposição. Ao invés, utilize uma hash, como a hash <a href="http://www.php.net/md5" target="_blank">md5</a> ou <a href="http://pt.php.net/manual/en/function.sha1.php" target="_blank">sha1</a> ou uma combinação de ambas (e se possivel e necessário, recorrendo a sal (salt)). <a href="http://talks.php.net/show/php-best-practices/28" target="_blank">[Citação]</a></li>
<li>Utilize <a href="http://www.php.net/ip2long" target="_blank">ip2long</a>() e <a href="http://www.php.net/long2ip" target="_blank">long2ip</a>() para armazenar endereços IP como inteiros (long) ao invés de strings. <span style="text-decoration: line-through;">[Citação]</span></li>
<li>Quando utilizar <a href="http://pt.php.net/manual/en/function.header.php" target="_blank">header</a>(‘Location: ‘.$url); lembre-se de colocar à frente um die(); porque o script continua a executar mesmo que a localização mude. <a href="http://richardlynch.blogspot.com/2007/06/php-header-location-redirect-refresh.html" target="_blank">[Citação]</a></li>
<li>Em <a href="http://www.php.net/oop" target="_blank">Programação Orientada a Objectos</a>, se existir um método que possa ser estático (<a href="http://en.wikipedia.org/wiki/Method_%28computer_science%29#Static_methods" target="_blank">static   method</a>), declare-o estático. Velocidade é melhorada por um factor de 4. <a href="http://ilia.ws/files/frankfurt_perf.pdf" target="_blank">[Citação]</a>.</li>
<li>Incrementar uma variável local num método de Programação OO  é o mais rápido, sendo aproximadamente o mesmo que aceder a uma variável local numa função.  Incrementar uma variável global é 2 vezes mais lento que uma variável local. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Incrementar uma propriedade de um objecto (eg. $this-&gt;prop++) é 3 vezes mais lento que incrementar uma variável local. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Incrementar uma variável local não definida é 9 a 10 vezes mais lento que incrementar uma variável pré-inicializada. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Somente declarar uma variável global dentro de uma função sem a utilizar têm efeitos negativos no desempenho (aproximadamente o mesmo que incrementar uma variável local), visto o PHP provavelmente verificar se a mesma já existe. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Invocação de métodos parece  ser independente do número de métodos definidos na classe, porque ao adicionar 10 métodos extras na classe de teste (antes e depois do método de teste), não houve mudanças no desempenho. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Métodos em classes derivadas executam mais depressa que  que os métodos nas classes base. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>A chamada de uma função com um parâmetro e sem corpo (corpo vazio), leva aproximadamente o mesmo tempo que fazer 7-8 operações de incrementação de variáveis locais ($var++). Chamadas de métodos similares levam aproximadamente o tempo de 15 operações de incrementação de variáveis locais. <a href="http://phplens.com/lens/php-book/optimizing-debugging-php.php" target="_blank">[Citação]</a></li>
<li>Nem tudo precisa de ser realizado em Programação Orientada a Objectos, pois normalmente só sobrecarrega o programa, visto as chamadas de métodos e objectos consumirem muita memória. <a href="http://talks.php.net/show/php-best-practices/33" target="_blank">[Citação]</a></li>
<li>Evite o problema de injecção de cabeçalhos na função <a href="http://pt.php.net/manual/en/function.mail.php" target="_blank">mail()</a> do PHP. <a href="http://uk3.php.net/manual/en/function.mail.php#56788">[Citação]</a></li>
<li><a href="http://en.wikipedia.org/wiki/RTFM" target="_blank">RTFM!</a> O PHP oferece um <a href="http://www.php.net/manual/" target="_blank">enorme e fantástico manual</a>, sendo possivelmente um dos melhores na Internet, contendo a documentação de todas as bibliotecas em inglês simples (também <a href="http://www.php.net/manual/pt_BR/" target="_blank">disponível em português do Brasil</a>), um conjunto de exemplos práticos e participação da comunidade com ainda mais exemplos e dicas. Simplesmente UTILIZE-O!!! <a href="http://xkcd.com/293/" target="_blank">[Citação]</a></li>
</ol>
<p>A lista foi retirada, traduzida e adaptada de <a href="http://www.hm2k.com/posts/50-php-optimisation-tips-revisited" target="_blank">hm2k.com</a>.</p>
<p>Existe ainda programadores que realizam programas e scripts que recorrem a funções e funcionalidades de versões antigas do php (PHP 5.2 ou inferior) que se encontram desactualizadas e marcadas para remoção. Neste caso alerto para evitar a utilização de funções da biblioteca  de Regex POSIX (entre elas <a href="http://php.net/manual/en/function.ereg.php" target="_blank"><span style="text-decoration: underline;">ereg()</span></a>, <a href="http://php.net/manual/en/function.eregi.php" target="_blank"><span style="text-decoration: underline;">eregi()</span></a>, <a href="http://php.net/manual/en/function.split.php" target="_blank"><span style="text-decoration: underline;">split()</span></a>) visto estas estarem classificadas como <em><strong><tt>DEPRECATED</tt></strong></em> a partir do PHP 5.3, tendo já a remoção em vista no PHP 6. Como alternativa existem as funções  da biblioteca <a href="http://www.php.net/pcre">PCRE</a> que demonstram um desempenho superior e funcionamento semelhante.</p>
<p>Lista de funções POSIX regex:<br />
 <a rel="nofollow" href="http://www.php.net/manual/en/ref.regex.php">http://www.php.net/manual/en/ref.regex.php</a></p>
<p>Lista de funções PCRE:<br />
 <a rel="nofollow" href="http://www.php.net/manual/en/ref.pcre.php">http://www.php.net/manual/en/ref.pcre.php</a></p>
<p>Evitem também utilizar o operador de referência &amp; em objectos,  pois estes desde do PHP 5 que são sempre passados por referencia.</p>
<p>Para terminar, denoto <a href="http://www.php.lt/benchmark/phpbench.php" target="_blank"><span style="text-decoration: underline;">este  site</span></a> onde poderão verificar alguns testes simples de <a href="http://pt.wikipedia.org/wiki/Benchmarking" target="_blank">benchmarking </a>onde se analisa a velocidade de diferentes funções e estruturas de  decisão. Tenham em mente que os testes podem ser facilmente adulterados  pela carga do servidor onde a página está alojada, sendo necessário  actualizar (recarregando a página) e observar os resultados varias  vezes.</p>
<p><strong>Nota:</strong> Este artigo foi redigido e publicado em primeira mão no <a href="http://pplware.sapo.pt/2010/01/php-e-a-quinta-feira-50-dicas-sobre-desempenho-e-segurana/" target="_blank"><span style="text-decoration: underline;">Peopleware</span></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ptbyte.net/home/archives/132/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP &#8211; Exporte os seus dados</title>
		<link>http://www.ptbyte.net/home/archives/36</link>
		<comments>http://www.ptbyte.net/home/archives/36#comments</comments>
		<pubDate>Wed, 24 Feb 2010 00:00:27 +0000</pubDate>
		<dc:creator>semogj</dc:creator>
				<category><![CDATA[Outros - Geral]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação e Desenvolvimento Web]]></category>
		<category><![CDATA[exportação]]></category>
		<category><![CDATA[programador]]></category>
		<category><![CDATA[PTBYTE]]></category>

		<guid isPermaLink="false">http://www.ptbyte.net/home/?p=36</guid>
		<description><![CDATA[<p>Neste artigo venho falar sobre um conjunto de funções úteis, sobretudo para a exportação de dados, do mais diversos tipos, para um simples formato textual, tipo string.</p>
<p style="text-align: center;"><a href="http://www.ptbyte.net/home/wp-content/uploads/2010/02/phpprogrammersbrain3873.png"><img class="size-full wp-image-175 aligncenter" title="phpprogrammersbrain3873" src="http://www.ptbyte.net/home/wp-content/uploads/2010/02/phpprogrammersbrain3873.png" alt="" width="375" height="300" /></a></p>
<p style="text-align: left;">Imagine que pretende:</p>
<ul>
<li>Guardar um <em>Array </em>na base de dados,</li>
<li>Enviar uma estrutura </li>&#8230; <a href="http://www.ptbyte.net/home/archives/36" class="read_more">Ler o resto.</a></ul>]]></description>
			<content:encoded><![CDATA[<p>Neste artigo venho falar sobre um conjunto de funções úteis, sobretudo para a exportação de dados, do mais diversos tipos, para um simples formato textual, tipo string.</p>
<p style="text-align: center;"><a href="http://www.ptbyte.net/home/wp-content/uploads/2010/02/phpprogrammersbrain3873.png"><img class="size-full wp-image-175 aligncenter" title="phpprogrammersbrain3873" src="http://www.ptbyte.net/home/wp-content/uploads/2010/02/phpprogrammersbrain3873.png" alt="" width="375" height="300" /></a></p>
<p style="text-align: left;">Imagine que pretende:</p>
<ul>
<li>Guardar um <em>Array </em>na base de dados,</li>
<li>Enviar uma estrutura de dados pela rede;</li>
<li>Guardar objectos na base de dados;</li>
<li>Transmitir dados a um outro servidor web ou um <em>Web Service;</em></li>
<li>etc.</li>
</ul>
<p>Como o fazer de forma simples e escalável, de modo a suportar praticamente todo o tipo de dados?</p>
<p><span id="more-36"></span></p>
<p>No PHP existe diversos modos de realizar esta tarefa, muitos deles que provavelmente serão árduos realizar e implementar de raiz no seu sistema.</p>
<p><br class="spacer_" /></p>
<p>Irei falar então de 3 métodos de exportação de dados:</p>
<ul>
</ul>
<ol>
<li><a href="http://php.net/manual/en/function.var-export.php" target="_blank">var_export()</a> / <a href="http://pt2.php.net/manual/en/function.eval.php"><span style="text-decoration: underline;">eval()</span></a></li>
<li><a href="http://pt2.php.net/manual/en/function.serialize.php" target="_blank"><span style="text-decoration: underline;">serialize()</span></a> / <a href="http://pt2.php.net/manual/en/function.unserialize.php" target="_blank">unserialize()</a></li>
<li><a href="http://pt2.php.net/manual/en/function.json-encode.php" target="_blank"><span style="text-decoration: underline;">json_encode()</span></a> / <a href="http://pt2.php.net/manual/en/function.json-decode.php" target="_blank">json_decode</a>()</li>
</ol>
<ul>
</ul>
<p>Todas as funções em cima permitem a exportação  do conteúdo de uma variável, transformando esse mesmo conteúdo numa representação textual que pode ser guardada como uma simples string. Mas no entanto nem todas estas funções operam de mesmo modo.</p>
<p><br class="spacer_" /></p>
<h3><a href="http://php.net/manual/en/function.var-export.php" target="_blank"><span style="text-decoration: underline;">var_export()</span></a> e <a href="http://pt2.php.net/manual/en/function.eval.php"><span style="text-decoration: underline;">eval()</span></a></h3>
<p>O <a href="http://php.net/manual/en/function.var-export.php" target="_blank">var_export </a>permite obter informação estruturada sobre uma variável especifica.  Esta função é semelhante à função <a href="http://www.php.net/manual/en/function.var-dump.php" target="_blank"><span style="text-decoration: underline;">var_dump()</span></a>, mas a diferença está no facto de a representação retornada pela função ser código PHP válido, que pode ser armazenado numa outra variável como string. Como recuperar, perguntam vocês? Para recuperar o conteúdo original e o manipular livremente, basta recorrer à função eval() para interpretar a string obtida anteriormente (lembrem-se que a string era código PHP válido!).</p>
<p>É de notar que esta função <span style="text-decoration: underline;">não</span> consegue exportar correctamente referencias circulares (<em>Arrays</em>, variáveis e objectos organizados em estruturas lógicas circulares). Variáveis do tipo <em>resource </em>também não podem ser exportadas por esta função.</p>
<p>Exemplo básico:</p>
<pre lang="PHP" escape="true">< ?php
$array1 = array('segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sabado', 'domingo');
//exportar
$result = var_export($array1, true);
echo $result;
/* output realizado:
array (   0 => 'segunda',   1 => 'terça',   2 => 'quarta',   3 => 'quinta',
  4 => 'sexta',   5 => 'sabado',   6 => 'domingo', )
*/
//recuperar utilizando eval()
$newArray = '';
eval('$newArray = '.$result . ';');
//a variavel $newArray agora possui o array original.
?></pre>
<p><span style="color: #ff6600;"><strong>Nota importante:</strong></span> Cuidado ao utilizar a função <a href="http://pt2.php.net/manual/en/function.eval.php"><span style="text-decoration: underline;">eval</span></a>, pois esta é capaz de executar qualquer tipo de código PHP, podendo se transformar facilmente num buraco na segurança da sua aplicação ou script, se não verificar o conteúdo da string passada como parâmetro da função e sem possuir absoluta certeza desta provir de locais totalmente confiáveis (exemplo de origens não confiáveis:  as variáveis $_GET, $_POST, $_COOKIE e $_SERVER).</p>
<p><br class="spacer_" /></p>
<h3><a href="http://pt2.php.net/manual/en/function.serialize.php" target="_blank"><span style="text-decoration: underline;">serialize()</span></a> / <a href="http://pt2.php.net/manual/en/function.unserialize.php" target="_blank">unserialize()</a></h3>
<p>O <span style="text-decoration: underline;"><a href="http://pt2.php.net/manual/en/function.serialize.php" target="_blank"><span style="text-decoration: underline;">serialize</span></a></span>, semelhante ao <a href="http://php.net/manual/en/function.var-export.php" target="_blank">var_export</a>, consegue gerar uma representação textual de qualquer variável, seja esta um tipo básico, um array, um objecto ou uma estrutura de dados, inclusive referencias circulares, excepto variáveis do tipo <em>resource </em>e <em>PHP built-in objects.</em></p>
<p>Um exemplo básico utilizando o array $array1 definido no exemplo anterior:</p>
<pre lang="PHP" escape="true">< ?php
//serializar
$result = serialize($array1);
echo $result;
/* output:
a:7:{i:0;s:7:"segunda";i:1;s:5:"terça";i:2;s:6:"quarta";i:3;s:6:"quinta";i:4;s:5:"sexta"
;i:5;s:6:"sabado";i:6;s:7:"domingo";}
*/
//reverter o processo
$arr = unserialize($result);
?></pre>
<p><br class="spacer_" /></p>
<h3><a href="http://pt2.php.net/manual/en/function.json-encode.php" target="_blank"><span style="text-decoration: underline;">json_encode()</span></a> / <a href="http://pt2.php.net/manual/en/function.json-decode.php" target="_blank">json_decode</a>()</h3>
<p>Muito semelhante ao <span style="text-decoration: underline;"><a href="http://pt2.php.net/manual/en/function.serialize.php" target="_blank"><span style="text-decoration: underline;">serialize</span></a></span> (também não consegue exportar variáveis do tipo <em>resource</em>), mas com diferenças menores no modo de conversão dos valores. A função devolve a representação textual do conteúdo de uma variável em formato <a href="http://www.json.org/" target="_blank"><span style="text-decoration: underline;">JSON (JavaScript Object Notation)</span></a>, um formato de intercâmbio popular e independente da linguagem de programação no qual o sistema foi construído, utilizado para a transmissão de dados entre diversas aplicações, serviços e sistemas.</p>
<p>É de notar que existem situações menores que diferenciam esta função do <span style="text-decoration: underline;"><a href="http://pt2.php.net/manual/en/function.serialize.php" target="_blank"><span style="text-decoration: underline;">serialize</span></a></span>, uma delas no facto de arrays com chaves  ( array(&#8216;chave&#8217;=>&#8217;valor&#8217;) ) serem exportados como objectos (e não como arrays), mas facilmente corrigido com um<em> cast</em> para array, ou mesmo com valores incorrectos.</p>
<p>Exemplo básico, utilizando o array $array1 do primeiro exemplo:</p>
<pre lang="PHP" escape="true">< ?php
$result = json_encode($array1);
echo $result;
/* output:
["segunda","terça","quarta","quinta","sexta","sabado","domingo"]
*/
//recuperar
$arr = (array)json_decode($result);
?>
</pre>
<p><br class="spacer_" /></p>
<p>Nota importante sobre <a href="http://pt2.php.net/manual/en/function.json-decode.php" target="_blank">json_decode</a> e<a href="http://pt2.php.net/manual/en/function.json-decode.php" target="_blank"> json_decode</a> de objectos: Ao recuperar um objecto, este é considerado como objecto de StdClass (classe base do php).</p>
<p>Para terminar, uma dica para quem deseja serializar dados para uma base de dados (ou para outro local): transformem a string, recorrendo a função <a href="http://php.net/manual/en/function.base64-encode.php" target="_blank">base64_encode,</a> antes de a concatenar ao comando SQL. De certeza que irá evitar muitas dores de cabeça. Claro que para reverter, bastará utilizar a função <a href="http://php.net/manual/en/function.base64-decode.php" target="_blank">base64_decode</a>;</p>
<p>Deixo um ficheiro com exemplos simples de utilização destas funções e respectivo conteúdo:</p>
<p><strong>Download</strong>: <a href="http://www.ptbyte.net/home/wp-content/uploads/2010/01/exemplo_artigoPHPserializacao1.zip">exemplo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ptbyte.net/home/archives/36/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Artigos de programação, e informática.</title>
		<link>http://www.ptbyte.net/home/archives/156</link>
		<comments>http://www.ptbyte.net/home/archives/156#comments</comments>
		<pubDate>Tue, 23 Feb 2010 20:59:30 +0000</pubDate>
		<dc:creator>semogj</dc:creator>
				<category><![CDATA[Outros - Geral]]></category>

		<guid isPermaLink="false">http://www.ptbyte.net/home/?p=156</guid>
		<description><![CDATA[<p>Iremos começar a disponibilizar alguns artigos relativos aos mais variados temas de informática e especificamente sobre programação. Infelizmente, devido à nossa indisponibilidade (e pelo facto de não sermos grandes &#8220;escritores&#8221;  <img src='http://www.ptbyte.net/home/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ), é natural não conseguir produzir artigos diariamente, mas o &#8230; <a href="http://www.ptbyte.net/home/archives/156" class="read_more">Ler o resto.</a></p>]]></description>
			<content:encoded><![CDATA[<p>Iremos começar a disponibilizar alguns artigos relativos aos mais variados temas de informática e especificamente sobre programação. Infelizmente, devido à nossa indisponibilidade (e pelo facto de não sermos grandes &#8220;escritores&#8221;  <img src='http://www.ptbyte.net/home/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' />  ), é natural não conseguir produzir artigos diariamente, mas o objectivo será a criação de pelo menos um &#8220;bom&#8221; artigo por semana.</p>
<p><br class="spacer_" /></p>
<p><strong>Visite-nos regularmente!</strong></p>
<p>Atenciosamente,</p>
<p><strong>PTBYTE</strong></p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ptbyte.net/home/archives/156/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

