<?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>The Blog of a WebDeveloper &#187; PHP</title>
	<atom:link href="http://joaopedropereira.com/blog/category/webdevelopment/php-webdevelopment/feed/" rel="self" type="application/rss+xml" />
	<link>http://joaopedropereira.com/blog</link>
	<description>Um novo estilo de desenvolvimento</description>
	<lastBuildDate>Sun, 19 Feb 2012 19:30:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Prepared Statements contra SQL Injection</title>
		<link>http://joaopedropereira.com/blog/2011/07/27/prepared-statements-contra-sql-injection/</link>
		<comments>http://joaopedropereira.com/blog/2011/07/27/prepared-statements-contra-sql-injection/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 21:19:06 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[prepared statements]]></category>
		<category><![CDATA[SQL Injection]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=1045</guid>
		<description><![CDATA[É muito comum quando se estuda uma linguagem não se dar principal foco ao desenvolvimento em segurança, mas este, em ambientes de produção é um dos factores decisivos do sucesso de uma aplicação e da confiança por parte dos utilizadores. Neste artigo vai ser abordada uma forma de defesa relativa a possíveis ataques de SQL [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F07%2F27%2Fprepared-statements-contra-sql-injection%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F07%2F27%2Fprepared-statements-contra-sql-injection%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>É muito comum quando se estuda uma linguagem não se dar principal foco ao desenvolvimento em segurança, mas este, em ambientes de produção é um dos factores decisivos do sucesso de uma aplicação e da confiança por parte dos utilizadores.<br />
Neste artigo vai ser abordada uma forma de defesa relativa a possíveis ataques de SQL Injection em PHP utilizando o SGDB MySQL, e com recurso a Prepared Statements.</p>
<p>Existe suporte oficial a várias bases de dados: CUBRID, MS SQL Server, Firebird/Interbase, IBM, Informix, MySQL, MS SQL Server, Oracle, ODBC e DB2, PostgreSQL, SQLite, 4D [print_r(PDO::getAvailableDrivers());]</p>
<h2>Vantagens e Desvantagens</h2>
<p><span style="text-decoration: underline;"><strong>Vantagens:</strong></span><br />
i. Previne SQL Injection<br />
ii. Melhora a performance (pode só ser notado quando usado em grandes plataformas)<br />
iii. Mais simples de escrever e ler</p>
<p><span style="text-decoration: underline;"><strong>Desvantagens e Limitações:</strong></span><br />
i. Limitado a: SELECT, INSERT, UPDATE, REPLACE, DELETE, e CREATE TABLE<br />
ii. Placeholders apenas para valores e nunca para nomes de tabelas ou colunas<br />
iii. Quando precisamos de utilizar o método bind_result no escopo de uma classe e não sabemos à partida quantas variáveis vão ser passadas. Problema analisado por Jeffrey Way @ NetTuts (http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/)</p>
<h2>addslashes vs mysql_real_escape_string vs Prepared Statements</h2>
<p>As funções addslashes e mysql_real_escape_string não serão objecto de estudo neste artigo, será apenas faladas as vulnerabilidades que não acontecem com o uso de Prepared Statements de modo a mostrar que esta última alternativa é de facto a mais segura.</p>
<p>O Chris Shiflett (<a title="addslashes() Versus mysql_real_escape_string()" href="http://shiflett.org/archive/184" target="_blank">http://shiflett.org/archive/184</a>) já analisou as vulnerabilidades das addslashes relativas ao abuso de caracteres multibyte.</p>
<p>A função mysql_real_escape_string não é muito diferente da addslashes ao nível do tipo de vulnerabilidade, na verdade a sua vantagem reside mesmo em ter em conta o character set a ser utilizado conseguindo determinar como analisar a informção passada. Contudo continuam a existir vulnerabilidades, por exemplo com a utilização da codificação GBK e da sequ?ncia 0xbf27 (¿’) que passada nesta função não terá o resultado pretendido de ¿\’ . (POC <a title="mysql_real_escape_string() versus Prepared Statements" href="http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html" target="_blank">http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html</a> )</p>
<h2>Prepared Statements em Uso</h2>
<p>Vejamos então um exemplo bastante simples&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$login</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#93;</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM registos WHERE login = '<span style="color: #006699; font-weight: bold;">$login</span>'&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>em que /?login=&#8217; OR 1&#8242;;</p>
<p>Assim sendo<br />
A query ficará algo do género:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM registos WHERE login = '' OR 1&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O que resultaria num retorno de todas as informações da base de dados.</p>
<p>Se neste caso especifico fosse utilizado o método de destaque deste artigo: Prepared Statements, teriamos de colocar um placeholder (para marcar o local onde serão inseridos os dados a introduzir / consultar na base de dados, isto faz com que nos locais onde estão colocados os placeholders não sejam feitos pedidos à base de dados ou alteração ao pedido em questão. É aqui que reside a força deste método.</p>
<p>Existem duas formas de usar placeholders tal como referido no Manual do PHP.net</p>
<p>Forma #1:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dbh</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO REGISTRY (name, value) VALUES (:name, :value)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':name'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':value'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Forma #2:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dbh</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO REGISTRY (name, value) VALUES (?, ?)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindParam</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Voltando então ao exemplo anterior, a nossa expressão seria então:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM registos WHERE login = ?&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nota: Apesar da extensão MySQLi também suportar prepared statements é aconselhável a utilização da extensão PDO (PHP Data Objects)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$login</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;joaoppereira&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SELECT * FROM registos WHERE login = ?&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pdo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bindValue</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$login</span><span style="color: #339933;">,</span> PDO<span style="color: #339933;">::</span><span style="color: #004000;">PARAM_STR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ok</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$results</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetchAll</span><span style="color: #009900;">&#40;</span>PDO<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_ASSOC</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A função bindValue dos PDOStatement permite simples validações de tipo de dados no terceiro parâmetro da função bindValue(parametro, valor, tipo_dado), com as seguintes opções:</p>
<pre>- PDO::PARAM_STR
- PDO::PARAM_INT
- PDO::PARAM_BOOL
- PDO::PARAM_NULL</pre>
<p>Este foi só um artigo introdutório a este tema, existe agora imenso material no Manual do PHP.net e um pouco por toda a internet relativamente a esta temática para os que quiserem, e bem, aprofundar os conhecimentos relativos a Prepared Statements e PDO.</p>
<h3>Bibliografia:</h3>
<p>- <a title="Prepared statements and stored procedures" href="http://php.net/manual/en/pdo.prepared-statements.php" target="_blank">http://php.net/manual/en/pdo.prepared-statements.php</a><br />
- <a title="The PDOStatement class" href="http://www.php.net/manual/en/class.pdostatement.php" target="_blank">http://www.php.net/manual/en/class.pdostatement.php</a><br />
- <a title="PDOStatement->bindValue&#8221; href=&#8221;http://www.php.net/manual/en/pdostatement.bindvalue.php&#8221; target=&#8221;_blank&#8221;>http://www.php.net/manual/en/pdostatement.bindvalue.php</a><br />
- <a title="Predefined Constants  " href="http://www.php.net/manual/en/pdo.constants.php" target="_blank">http://www.php.net/manual/en/pdo.constants.php</a><br />
- <a title="PDO Drivers" href="http://www.php.net/manual/en/pdo.drivers.php" target="_blank">http://www.php.net/manual/en/pdo.drivers.php</a><br />
- <a title="The Problem with PHP’s Prepared Statements" href="http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/" target="_blank">http://net.tutsplus.com/tutorials/php/the-problem-with-phps-prepared-statements/</a></p>
<div class="shr-publisher-1045"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F07%2F27%2Fprepared-statements-contra-sql-injection%2F' data-shr_title='Prepared+Statements+contra+SQL+Injection'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F07%2F27%2Fprepared-statements-contra-sql-injection%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F07%2F27%2Fprepared-statements-contra-sql-injection%2F' data-shr_title='Prepared+Statements+contra+SQL+Injection'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2011/07/27/prepared-statements-contra-sql-injection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP RSS Feed Generator Class</title>
		<link>http://joaopedropereira.com/blog/2010/07/28/php-rss-feed-generator-class/</link>
		<comments>http://joaopedropereira.com/blog/2010/07/28/php-rss-feed-generator-class/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 23:06:28 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projectos]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=858</guid>
		<description><![CDATA[English Version &#124; Versão Portuguesa It&#8217;s been a while since I&#8217;ve planned on developing a new platform for my work as Web Developer, and next to all Web Developers, and I started to develop some modules and this RSS Generator Class born to fulfill my needs. Supported versions: RSS 2.0 Download: Download it Features: Generates [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F28%2Fphp-rss-feed-generator-class%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F28%2Fphp-rss-feed-generator-class%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<h2 style="text-align: center;"><a title="English Version" href="#english">English Version</a> | <a href="#portugues">Versão Portuguesa</a></h2>
<p style="text-align: center;"><a class="button" href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip"><br />
</a></p>
<hr />
<span id="english"> </span></p>
<p>It&#8217;s been a while since I&#8217;ve planned on developing a new platform for my work as Web Developer, and next to all Web Developers, and I started to develop some modules and this RSS Generator Class born to fulfill my needs.</p>
<p><span style="text-decoration: underline;">Supported versions:</span><br />
RSS 2.0</p>
<p><span style="text-decoration: underline;">Download:</span><br />
<a title="Download RSS Feed Generator Class" href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip">Download it</a></p>
<p><span style="text-decoration: underline;">Features:</span><br />
Generates RSS 2.0 feeds<br />
All feeds are validated by <a title="Feed Validator" href="http://feedvalidator.org/" target="_blank">feed validator</a><br />
Supports all feed elements<br />
Simple &amp; easy to define channel proprieties<br />
Simple &amp; easy to define item elements<br />
Enables usage of sub-tags and attributes</p>
<p><span style="text-decoration: underline;">Example </span></p>
<p>It&#8217;s a minimum &#8220;how to&#8221; example needed to understand how to use this class. It&#8217;s part of the download package.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;feed.php&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create a new Feed</span>
	<span style="color: #000088;">$feed</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Feed<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Setting the channel elements</span>
	<span style="color: #666666; font-style: italic;">//Helper -&gt; http://www.rssboard.org/rss-specification</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedTitle</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Demo - RSS Generator Class'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedLink</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://joaopedropereira.com/blog/rss'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedDesc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'This is demo of generating a RSS feed. ONLY RSS Version 2.0 Supported'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedImage</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Oh, my photo...'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://joaopedropereira.com/projects/rss_gen'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://s3.amazonaws.com/twitter_production/profile_images/63969619/imagemresized.jpg'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Is possible to use setChannelElm() function for setting other optional channel elements</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setChannelElm</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'language'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'en-us'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create a new Item</span>
	<span style="color: #000088;">$item1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Setting the Item elements</span>
	<span style="color: #666666; font-style: italic;">//Helper -&gt; http://www.rssboard.org/rss-specification</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemTitle</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Item nº 1'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemLink</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://joaopedropereira.com'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDate</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDesc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Bla, bla, bla, item nº 1.'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemEnclosure</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://www.beardodisco.com/beatelectric/music/Loverboy12Mix.mp3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'17121349'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'audio/mpeg'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemAuthor</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'contacto@joaopedropereira.com (João Pedro Pereira)'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//As in Channel is possible to use setItemElm() function for setting other optional item elements</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create another Item</span>
	<span style="color: #000088;">$item2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Item nº 2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://twitter.com/joaoppereira'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Bla, bla, bla, twitter of the owner of the blog of a webdeveloper'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$item2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDate</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemAuthor</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'contacto@joaopedropereira.com (João Pedro Pereira)'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Adding both created items</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$item1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$item2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Now we're ready to generate the Feed, Awesome!</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">genFeed</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: center;"><a class="button" href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip">Download</a> | <a class="button" href="http://joaopedropereira.com/projects/rss_gen/">Demo</a></p>
<p><img src="http://joaopedropereira.com/blog/wp-content/uploads/2010/07/Demo-RSS-Generator-Class_1280270120429-w640-h480.png" alt="" title="Demo - RSS Feed Generator Class" width="640" height="311" class="aligncenter size-full wp-image-886" /></p>
<p style="text-align: center;"><a class="button" href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip">Download</a> | <a class="button" href="http://joaopedropereira.com/projects/rss_gen/">Demo</a></p>
<p><strong>EDIT</strong></p>
<p>HOT NEWS, PHP XML-RSS Feed Generator Was Accepted on <a class="button" href="http://www.phpclasses.org/package/6394-PHP-Generate-RSS-2-0-feeds.html">PHPClasses.org</a>!!</p>
<hr />
<p><span id="portugues"> </span></p>
<p>Há já algum tempo que pretendo desenvolver uma nova plataforma para o meu trabalho como Web Developer, e numa fase posterior abrir como serviço para todos os Web Developers, e por isso comecei a desenvolver alguns módulos para essa plataforma, trabalho que deu, entre outros, no módulo de RSS Feed&#8217;s surgindo assim a RSS Generator Class para satisfazer as necessidades.</p>
<p><span style="text-decoration: underline;">Versões Suportadas:</span><br />
RSS 2.0</p>
<p><span style="text-decoration: underline;">Download:</span><br />
<a title="Download RSS Feed Generator Class" href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip">Download it</a></p>
<p><span style="text-decoration: underline;">Funcionalidades:</span><br />
Gera RSS Feeds versão 2.0<br />
As feeds são válidas conforme o <a title="Feed Validator" href="http://feedvalidator.org/" target="_blank">feed validator</a><br />
Suporta todos os elementos quer dos channel&#8217;s quer dos item&#8217;s<br />
É simples definir as propriedades do channel<br />
É simples definir as propriedades dos items</p>
<p>É possível utilizar sub-tags e atributos</p>
<p><span style="text-decoration: underline;">Exemplo</span></p>
<p>Um pequeno exemplo que mostra como se pode fazer uso desta classe. Faz parte do pacote disponível para download.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;feed.php&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create a new Feed</span>
	<span style="color: #000088;">$feed</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Feed<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Setting the channel elements</span>
	<span style="color: #666666; font-style: italic;">//Helper -&gt; http://www.rssboard.org/rss-specification</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedTitle</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Demo - RSS Generator Class'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedLink</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://joaopedropereira.com/blog/rss'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedDesc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'This is demo of generating a RSS feed. ONLY RSS Version 2.0 Supported'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setFeedImage</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Oh, my photo...'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://joaopedropereira.com/projects/rss_gen'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://s3.amazonaws.com/twitter_production/profile_images/63969619/imagemresized.jpg'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Is possible to use setChannelElm() function for setting other optional channel elements</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setChannelElm</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'language'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'en-us'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create a new Item</span>
	<span style="color: #000088;">$item1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Setting the Item elements</span>
	<span style="color: #666666; font-style: italic;">//Helper -&gt; http://www.rssboard.org/rss-specification</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemTitle</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Item nº 1'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemLink</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://joaopedropereira.com'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDate</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDesc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Bla, bla, bla, item nº 1.'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemEnclosure</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'http://www.beardodisco.com/beatelectric/music/Loverboy12Mix.mp3'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'17121349'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'audio/mpeg'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item1</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemAuthor</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'contacto@joaopedropereira.com (João Pedro Pereira)'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//As in Channel is possible to use setItemElm() function for setting other optional item elements</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Create another Item</span>
	<span style="color: #000088;">$item2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Item<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Item nº 2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://twitter.com/joaoppereira'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Bla, bla, bla, twitter of the owner of the blog of a webdeveloper'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$item2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemDate</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$item2</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemAuthor</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'contacto@joaopedropereira.com (João Pedro Pereira)'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Adding both created items</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$item1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addItem</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$item2</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">//Now we're ready to generate the Feed, Awesome!</span>
	<span style="color: #000088;">$feed</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">genFeed</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: center;"><a href="http://joaopedropereira.com/projects/rss_gen/rss_gen.zip">Download</a> | <a href="http://joaopedropereira.com/projects/rss_gen/">Demo</a></p>
<p><strong>EDIT</strong></p>
<p>HOT NEWS, PHP XML-RSS Feed Generator foi aceite no <a class="button" href="http://www.phpclasses.org/package/6394-PHP-Generate-RSS-2-0-feeds.html">PHPClasses.org</a>!!</p>
<div class="shr-publisher-858"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F28%2Fphp-rss-feed-generator-class%2F' data-shr_title='PHP+RSS+Feed+Generator+Class'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F28%2Fphp-rss-feed-generator-class%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F28%2Fphp-rss-feed-generator-class%2F' data-shr_title='PHP+RSS+Feed+Generator+Class'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/07/28/php-rss-feed-generator-class/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
<enclosure url="http://www.beardodisco.com/beatelectric/music/Loverboy12Mix.mp3" length="17121349" type="audio/mpeg" />
		</item>
		<item>
		<title>PHP Simple Events System Overview</title>
		<link>http://joaopedropereira.com/blog/2010/07/21/php-simple-events-system-overview/</link>
		<comments>http://joaopedropereira.com/blog/2010/07/21/php-simple-events-system-overview/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 18:30:41 +0000</pubDate>
		<dc:creator>scorch</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projectos]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[Objectos]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=817</guid>
		<description><![CDATA[O PHP-SimpleEventsSystem é uma simples classe em PHP que permite a qualquer programador criar uma aplicação orientada a eventos em PHP. Sendo assim, esta classe possibilita a criação mais facilmente de aplicações web com possibilidade de adicionar plugins, sem que estes tenham de mexer com o código interno da aplicação, permite que uma framework use [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F21%2Fphp-simple-events-system-overview%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F21%2Fphp-simple-events-system-overview%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>O PHP-SimpleEventsSystem é uma simples classe em PHP que permite a qualquer programador criar uma aplicação orientada a eventos em PHP. Sendo assim, esta classe possibilita a criação mais facilmente de aplicações web com possibilidade de adicionar plugins, sem que estes tenham de mexer com o código interno da aplicação, permite que uma framework use internamente a classe PHP-SES e melhorando consideravelmente a interacção entre a framework e a aplicação. Mas permite muito mais, permite até onde a sua imaginação chegar. <img src='http://joaopedropereira.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<h2>Basic Overview</h2>
<p>Quem quiser ver a documentação completa da framework, pode aceder <a href="http://www.wiki.portugal-a-programar.org/php:tutoriais:php-ses_basicos" target="_blank">aqui</a>. No entanto, aqui vai ficar uma explicação da classe e de como ela funciona, que é bastante simples.</p>
<p>A classe cria um array multi-dimensional onde guarda as funções e o respectivo evento a que elas foram anexadas. Sempre que se anexa uma função, a classe pode ou não verificar se a função existe, conforme os parâmetros que o programador introduzir. Se passar nesse teste, verifica se a função já está anexada a esse mesmo evento,  e só depois anexa a função (as funções caso seja um array).</p>
<p>Ao executar-mos um determinado evento, a classe verifica se este existe, e em caso afirmativo, percorre o array com as funções anexadas a esse evento, e executa-as a todas pela ordem com que forma anexadas. Caso a opção Auto_run esteja activa, a função vai ainda percorrer todas as funções definidas pelo utilizador (programador da aplicação, utilizador da classe entenda-se) e verifica se alguma coincide com a formatação obrigatória e com o nome do evento em questão (<span style="text-decoration: underline">um_nome_qualquer<strong>_handles_</strong>nome_do_evento</span>). Se essa função já estiver anexada ao array, e por consequente já tiver sido executada, a classe não a executa novamente. Se ainda não estiver anexada, a classe executa-a e, caso a opção Auto_index esteja activa, indexa a função ao array do respectivo evento.</p>
<h2>Sugestões de sintaxe dos nomes dos eventos</h2>
<p>Numa aplicação de grandes dimensões torna-se importante a sintaxe que usamos e a forma como organizamos os nomes dos eventos, para que não existam conflitos e seja mais fácil memorizar o grande número de eventos que uma aplicação possa ter. Para isso os nomes dos eventos necessitam de ter lógica, e apesar de serem um pouco compridos, serão óbvios. Primeiro teremos de ter em conta algumas considerações.<br />
Os nomes dos eventos podem conter qualquer carácter, incluindo pontos, que podem servir de separador entre as várias &#8220;secções virtuais&#8221; do nome do evento. No entanto nomes de eventos com pontos não serão possíveis de aceder através da funcionalidade Auto-Index e Auto-Run pois as funções não suportam, obviamente, este tipo de caracteres no seu nome. Assim sendo, sugiro o uso do <em>underscore</em> como separador.<br />
Em todas as aplicações há uma &#8220;secção&#8221; que deve existir em todos os eventos, que indica se o evento retrata alguma acção em PHP ou HTML. Ou seja, e apesar de todas as instruções em código PHP sejam de PHP, poderão existir eventos que retratam a impressão de texto para o browser, e assim sendo, o nome do evento deve começar por <strong>html_</strong>, senão, caso retratem acções PHP, como uma conexão a uma Base de Dados, a leitura de um ficheiro, o fim de um ciclo, a execução de uma qualquer estrutura de controlo, etc., deverão começar por <strong>php_</strong>.<br />
Para a secção de HTML, podemos ainda destinguir se nos estamos a referir a alguma parte genérica do HTML, como por exemplo, um menu, que seja constituído por vários elementos HTML, deve-se adicionar um <strong>generic_</strong> a seguir ao <strong>html_</strong>, ou seja, ficaria <strong>html_generic_menu</strong>, por exemplo.<br />
Caso seja em PHP, deve-se adicionar o nome da &#8220;categoria&#8221; da acção que se está a utilizar. Por exemplo se for uma acção qualquer relacionada com a base de dados MySQL, como inserir um registo, coloca-se o <strong>mysq_</strong> depois do <strong>php_</strong>, ficando, por exemplo, <strong>php_mysql_query_insert_user</strong>.</p>
<p><span style="text-decoration: underline"><strong>Nota:</strong></span> Isto é apenas um exemplo de nomenclatura dos eventos, nada de obrigatório.</p>
<h2>Exemplos e Demos</h2>
<h3>Plugins</h3>
<p>Actualmente, é quase obrigatório qualquer aplicação, seja ela Web ou Desktop, suportar plugins. Só que isto é muitas vezes uma fonte de dor de cabeça para quem programa em PHP, criar um sistema versátil suficiente para suportar plugins. O PHP-SES permite a criação de Aplicações Web que facilmente suportam plugins. Vamos ver o seguinte exemplo.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;..\..\Events.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Inicia a configuração</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">setConf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Auto_run&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">setConf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Auto_index&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Carrega os nomes ficheiros dos plugins.</span>
<span style="color: #000088;">$plugins</span> <span style="color: #339933;">=</span> <span style="color: #990000;">scandir</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plugins&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Percorre o array com todos os ficheiros de plugins</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugins</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$index</span><span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$file_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Verifica se o index actual é um ficheiro e não uma pasta</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_file</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plugins/&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$file_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #666666; font-style: italic;">//Inclui e executa o plugin</span>
                <span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;plugins/&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$file_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #666666; font-style: italic;">//Por uma questão de segurança e para não comprometer o funcionamento da aplicação</span>
                <span style="color: #666666; font-style: italic;">//Depois de se carregar um plugin deve-se sempre habilitar a classe</span>
                <span style="color: #666666; font-style: italic;">//Para não se dar o caso de algum plugin a desabilitar e não a habilitar novamente.</span>
                Events<span style="color: #339933;">::</span><span style="color: #004000;">Enable</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt; !DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=iso-8856-16&quot; /&gt;'</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Declara uma variável que permitirá adicionar conteúdo dentro dos plugins para a página</span>
        <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #666666; font-style: italic;">//Corre todos os eventos anexados para quando os headers HTML são mostrados</span>
        <span style="color: #666666; font-style: italic;">//Esta é apenas um exemplo da sintaxe para o nome dos eventos.</span>
        Events<span style="color: #339933;">::</span><span style="color: #004000;">Run</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;html_headers&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;title&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;PHP-SES Plugins Example&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        Events<span style="color: #339933;">::</span><span style="color: #004000;">Run</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;html_show_title&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$content</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/title&gt;
&lt;/head&gt;&lt;body&gt;'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;h1&gt;Título&lt;/h1&gt;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&lt;a href=<span style="color: #000099; font-weight: bold;">\&quot;</span>#<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;Link1&lt;/a&gt;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">//Aqui corre os eventos que permitem alterar o menu</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">Run</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;html_generic_body_menu&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/body&gt;
&lt;/html&gt;
'</span></pre></div></div>

<h3>JavaScript Events</h3>
<p>Muitas vezes torna-se cansativo estar a chamar vários exemplos por AJAX, ou até fazer a verificação no PHP através de QueryStrings. Assim sendo, e com este exemplo aplicado, basta, no evento JavaScript, chamar uma função, JavaScript também, o nome do evento em PHP, e depois é só ir adicionando funções PHP ao código PHP.</p>
<p><strong>index.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt; ?php </span>
<span style="color: #009900;">require<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;..\..\Events.php&quot;</span><span style="color: #66cc66;">&#41;</span>;</span>
&nbsp;
<span style="color: #009900;">?&gt;</span>
<span style="color: #009900;">&lt; !DOCTYPE html PUBLIC <span style="color: #ff0000;">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span> <span style="color: #ff0000;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=iso-8856-16&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
        function RunEvent(event_name){
&nbsp;
                if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
                        xmlhttp=new XMLHttpRequest();
                } else {// code for IE6, IE5
                        xmlhttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
                }
&nbsp;
                xmlhttp.onreadystatechange=function(){
                        if (xmlhttp.readyState==4 <span style="color: #ddbb00;">&amp;&amp; xmlhttp.status==200){</span>
<span style="color: #ddbb00;">                                document.getElementById(&quot;count_number&quot;).innerHTML=xmlhttp.responseText;</span>
                        }
                }
&nbsp;
                xmlhttp.open(&quot;GET&quot;,&quot;run.php?event=&quot; + event_name + &quot;&quot;,true);
                xmlhttp.send();
        }
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>JavaScript Buttons Example<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;button&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;btn_sample&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;btn_sample&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;RunEvent('html_buttons_click_btn_sample')&quot;</span>  <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Test me. Click me.&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;count_number&quot;</span>&gt;</span>0<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p><strong>run.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #b1b100;">require</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;..\..\Events.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span>IS_AUTH<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Se a variável $_GET[&quot;event&quot;] não estiver declarada, termina a execução da página.</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;event&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Não foi definido nenhum evento.&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Define algumas configurações para não ser necessário anexar a função.</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">setConf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Auto_run&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">setConf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Auto_index&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Declara uma função anexada ao clique do botão</span>
<span style="color: #000000; font-weight: bold;">function</span> update_file_handles_html_buttons_click_btn_sample <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">//Vai buscar o número de clicks que o botão já tem</span>
        <span style="color: #000088;">$number_clicks</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;clicks.txt&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">//Escreve outra vez para o ficheiro adicionando um clique</span>
        <span style="color: #990000;">file_put_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;clicks.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$number_clicks</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$number_clicks</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//Corre todos os eventos associados ao clique do botão.</span>
Events<span style="color: #339933;">::</span><span style="color: #004000;">Run</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;event&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pode ver os exemplos em funcionamento, aceda <a href="http://scorchserver.freehosting.com/php_ses_examples/">aqui</a>.</p>
<div class="shr-publisher-817"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F21%2Fphp-simple-events-system-overview%2F' data-shr_title='PHP+Simple+Events+System+Overview'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F21%2Fphp-simple-events-system-overview%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F07%2F21%2Fphp-simple-events-system-overview%2F' data-shr_title='PHP+Simple+Events+System+Overview'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/07/21/php-simple-events-system-overview/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>New Features WordPress 3 Review</title>
		<link>http://joaopedropereira.com/blog/2010/04/21/wordpress-3-review/</link>
		<comments>http://joaopedropereira.com/blog/2010/04/21/wordpress-3-review/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 20:23:10 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[review]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=752</guid>
		<description><![CDATA[É provavelmente ainda um bocado cedo para falar do WordPress 3.0 pois o lançamento desta só está previsto para finais de Maio, mas tenho vindo a brincar um pouco com ele  e com as suas novas funcionalidades. A versão 3.0 do WordPress promete um visual mais soft da página de administração, vai também introduzir uma [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F21%2Fwordpress-3-review%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F21%2Fwordpress-3-review%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>É provavelmente ainda um bocado cedo para falar do WordPress 3.0 pois o lançamento desta só está previsto para finais de Maio, mas tenho vindo a brincar um pouco com ele  e com as suas novas funcionalidades.</p>
<p>A versão 3.0 do WordPress promete um visual mais soft da página de administração, vai também introduzir uma nova default theme, a <em>&#8220;Twenty Ten&#8221;</em>, que permite personalizar o fundo e as opções do cabeçalho ( header ), possibilidade de criar os menus com categorias, tags, posts, links externos, etc., entre outras modificações que podem ver na <a title="Wordpress -- Version 3.0" href="http://codex.wordpress.org/Version_3.0" target="_blank">página oficial</a>.</p>
<p><a href="http://joaopedropereira.com/blog/wp-content/uploads/2010/04/Twenty-Ten.png"><img class="aligncenter size-medium wp-image-762" title="Twenty Ten" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/04/Twenty-Ten-300x240.png" alt="" width="300" height="240" /></a></p>
<p>Neste post vou dar realce a apenas duas características que surgirão na versão 3.0 do WordPress, ou pelo menos que estão prevista e que estão em desenvolvimento.</p>
<h2>WordPress + WordPress MU == WordPress 3.0</h2>
<p>O WordPress MU ou WordPress Multi-User era uma versão modificada do sistema WordPress para permitir redes de blogs numa só instalação.</p>
<p><strong><span style="text-decoration: underline;">Site:</span></strong> <a title="Wordpress MU" href="http://mu.wordpress.org/" target="_blank">http://mu.wordpress.org</a></p>
<p>Create a Network of Multiple Sites on WordPress 3.0</p>
<p>É tão simples como adicionar no ficheiro wp-config.php a seguinte linha:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'WP_ALLOW_MULTISITE'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Seleccionar o menu<em> Tools -&gt; Network</em> e seguir as instruções.</p>
<p>Este é o menu que vos espera depois de tudo configurado.</p>
<p><img class="aligncenter size-full wp-image-757" title="Wordpress Network Menu" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/04/menu.png" alt="" width="150" height="290" /></p>
<p><strong><span style="text-decoration: underline;">Ver artigo:</span></strong> <a title="Create a Network" href="http://codex.wordpress.org/User:Andrea/Create_A_Network" target="_blank">http://codex.wordpress.org/User:Andrea/Create_A_Network</a></p>
<h2>Custom Post Types on WordPress 3.0</h2>
<p>Quem já teve de desenvolver uma theme para WordPress um pouco mais complexo provavelmente já teve de fazer uns quantos hacks de forma a conseguir ter estilos diferentes para categorias diferentes&#8230; Os developers do WordPress pensaram em nós e decidiram tornar a possibilidade de ter vários estilos para diferentes tipos de posts de uma forma mais simples na versão 3.0 do WordPress.</p>
<p>Para tirar partido desta funcionalidade é necessário adicionar o seguinte código no ficheiro wp-content/themes/yourtheme/functions.php :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">register_post_type<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'testemunials'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'label'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Testemunials'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'singular_label'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Testemunial'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'description'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Here goes my testemunials'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'public'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'show_ui'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'capability_type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'post'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'hierarchical'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'rewrite'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'query_var'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'supports'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'title'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'editor'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'author'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'excerpts'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'comments'</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><img class="aligncenter size-medium wp-image-773" title="Menu Custom Post-Type" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/04/menu2-143x300.png" alt="" width="143" height="300" /></p>
<p>Tal como é possível definir vários tipos de posts também é possível utilizar esta funcionalidade para páginas diferentes alterando o parâmetro &#8216;capability_type&#8217; para &#8216;capability_type&#8217;=&gt;&#8217;page&#8217;.</p>
<p><strong><span style="text-decoration: underline;">Function Reference/register post type:</span></strong> <a title="Function Reference/register post type" href="http://codex.wordpress.org/Function_Reference/register_post_type" target="_blank">http://codex.wordpress.org/Function_Reference/register_post_type</a></p>
<div class="shr-publisher-752"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F21%2Fwordpress-3-review%2F' data-shr_title='New+Features+Wordpress+3+Review'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F21%2Fwordpress-3-review%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F21%2Fwordpress-3-review%2F' data-shr_title='New+Features+Wordpress+3+Review'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/04/21/wordpress-3-review/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP Security Check-List CheatSheet</title>
		<link>http://joaopedropereira.com/blog/2010/04/18/php-security-check-list-cheatsheet/</link>
		<comments>http://joaopedropereira.com/blog/2010/04/18/php-security-check-list-cheatsheet/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 13:41:56 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=743</guid>
		<description><![CDATA[Para cada projecto que tenho desenvolvido ultimamente utilizando a linguagem de programação server-side PHP, tenho-me guiado por uma checklist de forma a não me esquecer  de nada evitando assim falhas graves nas aplicações que desenvolvo. Pois a segurança é uma das preocupações que tenho. Esta checklist aborda diversas situações como, casos gerais, casos de input, [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F18%2Fphp-security-check-list-cheatsheet%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F18%2Fphp-security-check-list-cheatsheet%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Para cada projecto que tenho desenvolvido ultimamente utilizando a linguagem de programação server-side PHP, tenho-me guiado por uma checklist de forma a não me esquecer  de nada evitando assim falhas graves nas aplicações que desenvolvo. Pois a segurança é uma das preocupações que tenho.</p>
<p>Esta checklist aborda diversas situações como, casos gerais, casos de input, file uploads, autenticação, entre outros.</p>
<div id="attachment_744" class="wp-caption aligncenter" style="width: 234px"><a href="http://joaopedropereira.com/files/phpsec_cheatsheet.pdf"><img class="size-medium wp-image-744" title="PHP Security CheckList" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/04/phpsec_cheatsheet-224x300.png" alt="" width="224" height="300" /></a><p class="wp-caption-text">Click on image to download</p></div>
<p>Recomendo vivamente a sua utilização e até sugestões de melhorias, apesar de ela não ser da minha autoria.</p>
<p>O que acham desta checklist? Conhecem alguma melhor? Como se guiam no desenvolvimento de aplicações web de forma  a manter a segurança da mesma?</p>
<div class="shr-publisher-743"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F18%2Fphp-security-check-list-cheatsheet%2F' data-shr_title='PHP+Security+Check-List+CheatSheet'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F18%2Fphp-security-check-list-cheatsheet%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F04%2F18%2Fphp-security-check-list-cheatsheet%2F' data-shr_title='PHP+Security+Check-List+CheatSheet'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/04/18/php-security-check-list-cheatsheet/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Parsing de IP utilizando PHP+REGEX</title>
		<link>http://joaopedropereira.com/blog/2010/01/20/parsing-ip-utilizando-php-regex/</link>
		<comments>http://joaopedropereira.com/blog/2010/01/20/parsing-ip-utilizando-php-regex/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:09:39 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[proxychains]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=671</guid>
		<description><![CDATA[No meio de época exames/frequências e muito trabalho arranjei um bocado de tempo para colocar aqui o último snippet que escrevi para fazer parsing de um ficheiro que contém uma lista de IP&#8217;s e portas onde correm serviços de proxy. Isto porque ando a experimentar configurações mais avançadas em ferramentas como o proxychains que nas [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F20%2Fparsing-ip-utilizando-php-regex%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F20%2Fparsing-ip-utilizando-php-regex%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>No meio de época exames/frequências e muito trabalho arranjei um bocado de tempo para colocar aqui o último snippet que escrevi para fazer parsing de um ficheiro que contém uma lista de IP&#8217;s e portas onde correm serviços de proxy.<br />
Isto porque ando a experimentar configurações mais avançadas em ferramentas como o <a href="http://proxychains.sourceforge.net/">proxychains</a> que nas suas configurações exigem um esquema especifico para proxys.</p>
<p><strong>Syntax necessária:</strong> http ip porta<br />
<strong>Syntax do ficheiro:</strong> ip:porta</p>
<h2>Snippet</h2>
<pre class="brush: php">$url = &#039;http://blackhatbootcamp.net/proxies/data/ultimate_proxies.txt&#039;;

	preg_match_all(&#039;/[0-9]{1,3}+\.[0-9]{1,3}+\.[0-9]{1,3}+\.[0-9]{1,3}+\:[0-9]{2}/&#039;, file_get_contents($url), $matches); 

	$size=sizeof($matches[0]);
	foreach($matches as $var) {
		for($i=0; $i&lt; $size; $i++)
			echo preg_replace(&#039;/(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3}):(\d{2})/&#039;, &quot;http $1.$2.$3.$4 $5&lt;br/&gt;&quot;, $var[$i]);
	}</pre>
<p>Sei que python e PERL têm uma grande capacidade de utilização de REGEX, se andarem por aí conhecedores do assunto podem partilhar os snippets aqui <img src='http://joaopedropereira.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="shr-publisher-671"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F20%2Fparsing-ip-utilizando-php-regex%2F' data-shr_title='Parsing+de+IP+utilizando+PHP%2BREGEX'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F20%2Fparsing-ip-utilizando-php-regex%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F20%2Fparsing-ip-utilizando-php-regex%2F' data-shr_title='Parsing+de+IP+utilizando+PHP%2BREGEX'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/01/20/parsing-ip-utilizando-php-regex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Twitter Bot :: Crawling Emails</title>
		<link>http://joaopedropereira.com/blog/2009/09/22/php-twitter-bot-crawling-emails/</link>
		<comments>http://joaopedropereira.com/blog/2009/09/22/php-twitter-bot-crawling-emails/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 18:13:23 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projectos]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[bot]]></category>
		<category><![CDATA[crawling]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=493</guid>
		<description><![CDATA[Um dos projectos que estou a começar a desenvolver é um Twitter Bot que seja capaz de simular o comportamento de um utilizador durante um curto período de tempo, dependendo da configuração que o utilizador lhe quiser dar. Deve também ter todas as funcionalidades que possam ser úteis ou pensáveis para um programa deste género [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F09%2F22%2Fphp-twitter-bot-crawling-emails%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F09%2F22%2Fphp-twitter-bot-crawling-emails%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Um dos projectos que estou a começar a desenvolver é um Twitter Bot que seja capaz de simular o comportamento de um utilizador durante um curto período de tempo, dependendo da configuração que o utilizador lhe quiser dar. Deve também ter todas as funcionalidades que possam ser úteis ou pensáveis para um programa deste género e por isso muito é necessário pesquisar e estudar.</p>
<p>Hoje surgiu-me a ideia de utilizar a pesquisa do Twitter para encontrar e-mails. Claro que não fui o primeiro a pensar nisto, então em vez de reinventar a roda fui alterá-la apenas para andar melhor.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> writemail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$emails</span><span style="color: #009900;">&#41;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$emails</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$email</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$email</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'
'</span><span style="color: #339933;">;</span>
			<span style="color: #990000;">ob_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">&lt;</span> <span style="color: #339933;">=</span><span style="color: #cc66cc;">20</span><span style="color: #339933;">;</span> <span style="color: #000088;">$id</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> proxify_my_connection<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;http://search.twitter.com/search?page=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&amp;q=gmail.com+OR+msn.com+OR+hotmail.com+OR+<span style="color: #009933; font-weight: bold;">%22e</span>mail+me%22&amp;rpp=100&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">&quot;([a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&amp;'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b)siU&quot;</span><span style="color: #339933;">,</span>
		<span style="color: #000088;">$file</span><span style="color: #339933;">,</span>
		<span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	writemail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">ob_end_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>O que este código faz, basicamente, é ler a página de pesquisa do Twitter e utilizando <a title="Regular Expression - Wikipedia" href="http://en.wikipedia.org/wiki/Regular_expression" target="_blank">Regular Expressions</a> encontrar os e-mails existentes na página, e depois continua pelas páginas seguintes.</p>
<p>/search?page=&#8221;.$id.&#8221;&amp;q=gmail.com+OR+msn.com+OR+hotmail.com+OR+%22email+me%22&amp;rpp=100</p>
<p><strong>page</strong> numero da página<br />
<strong>q</strong> representa a query, a chave a pesquisar<br />
<strong>rpp</strong> results per page sendo que o máximo permitido pelo twitter é 100</p>
<p>Como podem reparar no meu código existe uma função que não está presente nem faz parte do PHP, a proxify_my_connection, é uma ferramenta que eu próprio desenvolvi há algum tempo e que não a quero tornar pública. Mas é fácil de a substituir, mesmo utilizando funções que já vêm de raíz no PHP. Podem também ver <a title="Scraping websites with PHP cURL under proxy" href="http://www.fromzerotoseo.com/scraping-websites-php-curl-proxy/" target="_blank">aqui</a> uma função com efeito semelhante à que eu desenvolvi, no entanto não tem nada a ver uma com a outra.</p>
<p>Em vez da função writemail() é mais produtivo ter uma base de dados onde quardar os e-mails e verificar se estes são repetidos ou não&#8230;</p>
<p>Podem dar uso à vossa imaginação, aumentar e desenvolver a query, aumentar a performance do script, etc. isto foi só um pequeno exemplo do que se pode fazer com a search do twitter.</p>
<h3>Bibliografia</h3>
<p style="text-align: left;">Regex utilizado no meu código: <a title="Twitter email grabber" href="http://www.fromzerotoseo.com/twitter-email-grabber/" target="_blank">http://www.fromzerotoseo.com/twitter-email-grabber/</a></p>
<h2 style="text-align: center;">Contribua para este blog deixando</h2>
<h2 style="text-align: center;">a sua opinião e um pouco do seu conhecimento</h2>
</pre>
<div class="shr-publisher-493"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F09%2F22%2Fphp-twitter-bot-crawling-emails%2F' data-shr_title='PHP+Twitter+Bot+%3A%3A+Crawling+Emails'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F09%2F22%2Fphp-twitter-bot-crawling-emails%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F09%2F22%2Fphp-twitter-bot-crawling-emails%2F' data-shr_title='PHP+Twitter+Bot+%3A%3A+Crawling+Emails'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/09/22/php-twitter-bot-crawling-emails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>O WebDeveloper que Utiliza PHP :: Caminho</title>
		<link>http://joaopedropereira.com/blog/2009/08/15/php-developer-caminho/</link>
		<comments>http://joaopedropereira.com/blog/2009/08/15/php-developer-caminho/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 15:38:50 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[Optimização]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[code igniter]]></category>
		<category><![CDATA[frameworks]]></category>
		<category><![CDATA[kohana]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[SQL Injection]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=456</guid>
		<description><![CDATA[PHP é a linguagem de programação web server-side mais utilizada a nível Mundial e neste artigo vão ser retratados os aspectos que devem fazer parte do estudo, do caminho de um WebDeveloper que quer desenvolver em PHP. Entre eles Boas práticas, Frameworks, Segurança, Caching, Buffering e Environments. O Melhor Amigo &#8211; PHP Manual Antes de [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F08%2F15%2Fphp-developer-caminho%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F08%2F15%2Fphp-developer-caminho%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://pt.php.net/" target="_blank"><img class="alignright" title="PHP" src="http://pt.php.net/images/php.gif" alt="" width="120" height="67" /></a>PHP é a linguagem de programação web server-side mais utilizada a nível Mundial e neste artigo vão ser retratados os aspectos que devem fazer parte do estudo, do caminho de um WebDeveloper que quer desenvolver em PHP. Entre eles Boas práticas, Frameworks, Segurança, Caching, Buffering e Environments.</p>
<h2>O Melhor Amigo &#8211; PHP Manual</h2>
<p>Antes de mais é necessário aprender a linguagem em si, e o PHP é uma linguagem com uma enorme comunidade por trás que desenvolveu o PHP Manual, neste manual encontra-se todo o conhecimento necessário para se dominar a linguagem PHP. E como se não chegasse a sua enorme qualidade este é, também, gratuito e pode ser acedido quer online quer offline.</p>
<p>De leitura fácil encontramos no PHP Manual a documentação de como proceder à sua instalação e configuração, a documentação da estrutura lógica da linguagem bem como de todas as funções que a compõe sem nunca faltarem imensos exemplos! A secção das notas dos utilizadores é riquissima em estudos e desenvolvimentos de cada função, não dispensem a sua leitura!</p>
<p><a title="PHP Manual" href="http://www.php.net/manual/pt_BR/index.php" target="_blank">Aceder ao PHP Manual em Português</a></p>
<h2>Montar um Ambiente de Teste</h2>
<p>Para testar o PHP não é necessário apenas ter um editor de texto e um browser, é necessário um servidor que corra o interpretador de PHP.</p>
<p>Então para começarmos a desenvolver em PHP é necessário configurar um pequeno servidor ou então utilizar um host existente&#8230;</p>
<p>Existem soluções que não envolvem muito trabalho nas configurações, como o <a title="MAMP" href="http://www.mamp.info/en/index.html" target="_blank">MAMP</a> (Mac), <a title="WAMP" href="http://www.wampserver.com/en/" target="_blank">WAMP</a> (Windows), <a title="LAMP" href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" target="_blank">LAMP</a> (Linux), estas ferramentas já trazem também incluido a SGBD (Sistema de Gestão de Base de Dados) <a title="MySQL :: The world's most popular open source database" href="http://www.mysql.com/" target="_blank">MySQL</a>.</p>
<p>Depois para desenvolver o código pode utilizar ferramentas de auxilio, os IDE&#8217;s. A SmashingMagazine realizou um estudo comparativo sobre IDE&#8217;s para PHP. <a title="The Big PHP IDE Test" href="http://www.smashingmagazine.com/2009/02/11/the-big-php-ides-test-why-use-oneand-which-to-choose/" target="_blank">Ver Estudo Comparativo de IDE&#8217;s para PHP Aqui</a></p>
<p>Para quem não quer editores tão pesados aconselho o <a title="Geany" href="http://www.geany.org/" target="_blank">Geany</a> (Linux) ou <a title="Notepad++" href="http://notepad-plus.sourceforge.net/br/site.htm" target="_blank">Notepad++</a> (Windows).</p>
<h2>Desenvolver Bom Código</h2>
<p>Isto não é algo restrito ao PHP mas a todas as linguagens de programação.</p>
<p>Quando programamos algo deve ter, além de uma estrutura lógica e funcional correcta, uma boa identação, documentação e deve também ser auto-explicativa (variáveis, classes e funções com nomes que descrevam facilmente o que contêm / o que fazem).</p>
<p>Deve ser fácil de ler e entender quer pelo próprio programador daqui a uns anos ou por outro programador que tenha de modificar algo no código desenvolvido.</p>
<h3>Manter Funções Fora de Ciclos</h3>
<p>Manter sempre a declaração de funções fora de ciclos é um aspecto muito importante quando visamos a performance de uma aplicação desenvolvida em PHP pois num ciclo que se repete (imaginemos) 500 vezes, a função será declarada 500 vezes, uma perda de tempo.</p>
<h3>Organização do Código por Ficheiros</h3>
<p>Além da organização ao nível das linhas código em si temos a organização de código relativa à separação por ficheiros e categorias. Para facilitar o entendimento e a detecção e correcção de erros o código deve ser separado lógicamente.</p>
<p>Imaginemos que estamos a desenvolver um CMS (Content Management System). E então devido à grande quantidade de código que tem de ser desenvolvido vamos separar o código em vários ficheiros.</p>
<p>Má Prática</p>
<p><img class="aligncenter size-full wp-image-462" title="Má Prática - Organização Ficheiros" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/08/CapturaEcra.png" alt="Má Prática - Organização Ficheiros" width="633" height="97" /></p>
<p>Boa Prática</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-463" title="Boa Prática - Organização Código" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/08/CapturaEcra-1.png" alt="Boa Prática Organização Código" width="766" height="87" /></p>
<h2>Aprender Object Oriented Programming</h2>
<p>Object-oriented programming (OOP) ou Programação Orientada a Objectos (POO) em Português utiliza objectos para representar partes da aplicação permitindo separar em secções lógicas o código, facilitando a sua modificação e organização.</p>
<h2>Aprender a Utilizar uma Framework</h2>
<p>Muitos defendem que se deve aprender a utilizar frameworks na iniciação ao PHP porque com elas se aprende a desenvolver código mais avançado, a organizar melhor o código, a torná-lo lógico, a fazer debbug de erros, etc.</p>
<p>Outros defendem que não se deve aprender a utilizar frameworks na iniciação ao PHP porque no inicio o que os utilizadores necessitam é fazer os seus erros, aprender a desenvolver o seu código de raíz, sem funções e classes prontas a utilizar (exceptuando aquelas que vêm de raíz no PHP claro).</p>
<p>Eu considero que o utilizador deve dar uma olhadela a algumas frameworks e decidir se as deve ou não utilizar, porque cada pessoa é unica e pode aprender de diversas formas. Frameworks que considero muito bem estruturadas: <a title="Kohana: Swift, Secure, and Small PHP 5 Framework" href="http://www.kohanaphp.com/" target="_blank">Kohana</a>, <a title="CodeIgniter - Open source PHP web application framework" href="http://codeigniter.com/" target="_blank">CodeIgniter</a> e <a title="CakePHP: the rapid development php framework" href="http://cakephp.org/" target="_blank">CakePHP</a> .</p>
<h2>Nunca Confie nos Utilizadores</h2>
<p>Um dos aspectos mais importantes ao nível da segurança de aplicações informáticas é nunca confiar nos utilizadores da aplicação que estamos a desenvolver.</p>
<p>E que implica isso? Validar tudo o que entra! URL&#8217;s, formulários, cookies, sessões e até headers dos browsers.</p>
<p>Vamos então ver alguns exemplos de validações pois seria impossível cobrir todas as validações possíveis.</p>
<h2>Validar Dados</h2>
<p>É muito importante validar e corrigir todos os dados que possam ser introduzidos pelo utilizador! Infelizmente tenho visto imensas aplicações web sem qualquer protecção contra ataques tornando-as completamente vulneráveis a ataques.</p>
<p>Imaginemos o seguinte URL: joaopedropereira.com/xpto.php?id=1245</p>
<p>Que falha pode ser explorada aqui? O parâmetro dado ao id que pode ser utilizado para um SQL Injection por exemplo. Como fazer esta validação? Através de Regex:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> is_natural<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>bool<span style="color: #009900;">&#41;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/^[0-9]+$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>is_natural<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/* código */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Erro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Outro exemplo também com URL: joaopedropereira.com/xpto.php?email=email@domain.tld</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> is_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>is_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/* código */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Erro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Também com formulários se deve proceder de uma forma semelhante a esta.</p>
<p>ID Cliente<br />
<input name="id" type="text" />
<p>Email<br />
<input name="email" type="text" /></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> is_natural<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>bool<span style="color: #009900;">&#41;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'/^[0-9]+$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">function</span> is_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">TRUE</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>is_email<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> AND is_natural<span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">/* código */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Erro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Vimos então que se podem validar os dados através de Regex mas existem outras formas de o fazer.</p>
<p>Imaginemos que temos um formulário que envia um campo de texto. Não podemos criar uma função em Regex para o efeito, assim temos de utilizar outras funções mais ou menos complexas para fazer a limpeza destes dados (recomendo o estudo das funções de validação da Kohana ou CodeIgniter).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Com esta função adicionamos alguma segurança ao nosso código limpando tags como as utilizadas em ataques XSS e limpamos os dados contra SQL Injection. (Atenção: esta função não inibe todos os ataques apenas os dificulta um pouco).</p>
<p>Existe também uma forma de melhorar a segurança que dá menos trabalho pois apenas com algumas linhas de código podemos limpar todos os dados passados por $_POST, $_GET, $_REQUEST, $_COOKIE, $_SESSION, etc.</p>
<p>Eu normalmente crio um ficheiro que incluo no inicio de cada página parecido com o seguinte:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> proteger<span style="color: #009900;">&#40;</span><span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2>Ambiente de Teste vs. Ambiente Real</h2>
<p>Um dos problemas com que me deparava quando me iniciei no desenvolvimento de aplicações web em PHP (como o tempo passa&#8230;) era a mudança de variáveis entre o ambiente de teste e o real, como por exemplo as configurações da base de dados&#8230;</p>
<p>Até ter adoptado uma metodologia que me permitia ao alterar apenas uma linha alternar entre os ambientes.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'LIVE'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>LIVE<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_HOST'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'localhost'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_USER'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_PASSWORD'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_DATABASE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'basededadosxpto'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #990000;">error_reporting</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">E_ALL</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_HOST'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'joaopedropereira.com'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_USER'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'joao'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_PASSWORD'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'pedro'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB_DATABASE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'joao_basededados'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Com esta metodologia só preciso de modificar a linha que define a constante LIVE como true ou false conforme esteja a trabalhar num ou noutro ambiente, podem também verificar ali a alteração do <a title="error_reporting" href="http://www.php.net/manual/pt_BR/function.error-reporting.php" target="_blank">error_reporting</a>, enquanto no caso do Ambiente Real não quero que sejam mostrados nenhuns erros aos visitantes por questões quer de segurança quer de aspecto, no caso do Ambiente de Teste quero saber todos os pormenores.</p>
<h2>Utilizar Output Buffering</h2>
<p>Utilizar Output Buffering é uma excelente maneira de optimizar a performance de uma aplicação em PHP. Sem Output Buffering a sua aplicação só vai mostrar o HTML no fim de toda a página estar carregada, com o Output Buffering a sua aplicação mostra o HTML já carregado quando o programador ordena!</p>
<p>O Developer Brian Cray criou um artigo muito interessante sobre este assunto para a DevTips. <a title="Output Buffering for Web Developers, a Beginner’s Guide" href="http://dev-tips.com/featured/output-buffering-for-web-developers-a-beginners-guide" target="_blank">Veja-o aqui</a>.</p>
<h2>Utilizar Sistemas de Caching</h2>
<p>Os Sistemas de Caching são interessantes para aumentar a performance de uma aplicação em PHP. No entanto há que ter em atenção alguns aspectos como por exemplo numa amostragem de resultados em tempo real não se podem utilizar sistemas de caching ou então teremos dados desactualizados&#8230;</p>
<p>Existem sistemas prontos a usar mas também podemos desenvolver o nosso sistema de caching como por exemplo algo do género:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cache_file</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'cache_files/'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'SCRIPT_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$cache_time</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1200</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//60min*6 * 60 segundos (6HORAS)</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache_file</span><span style="color: #009900;">&#41;</span> AND <span style="color: #990000;">is_readable</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache_file</span><span style="color: #009900;">&#41;</span> AND <span style="color: #009900;">&#40;</span><span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$cachetime</span> <span style="color: #339933;">&lt;</span> <span style="color: #990000;">filemtime</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache_file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cache_file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* o código do ficheiro */</span>
&nbsp;
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$cachefile</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'w'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #990000;">ob_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">ob_end_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sistemas de Caching:</p>
<ul>
<li><a title="Memcached" href="http://www.danga.com/memcached/" target="_blank">Memcached</a></li>
<li><a title="APC" href="http://us.php.net/manual/pt_BR/intro.apc.php" target="_blank">APC</a></li>
<li><a title="XCache" href="http://xcache.lighttpd.net/" target="_blank">XCache</a></li>
</ul>
<h2>Eu não mordo&#8230;</h2>
<p>Não tenha medo de comentar, não tenha medo de perguntar, de criticar ou elogiar! Qualquer dúvida pergunte, qualquer reparo faça-o, todas as opiniões e comentários são bem vindos aqui no blog.</p>
<p>Pode também divulgar o artigo, eu não acuso ninguém que divulgue o meu artigo nas diversas redes sociais ou nos próprios blogs (mencionando a fonte ou autor) de plágio <img src='http://joaopedropereira.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<ul></ul>
</pre>
<div class="shr-publisher-456"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F08%2F15%2Fphp-developer-caminho%2F' data-shr_title='O+WebDeveloper+que+Utiliza+PHP+%3A%3A+Caminho'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F08%2F15%2Fphp-developer-caminho%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F08%2F15%2Fphp-developer-caminho%2F' data-shr_title='O+WebDeveloper+que+Utiliza+PHP+%3A%3A+Caminho'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/08/15/php-developer-caminho/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Diminuir Load Times no Carregamento de Páginas Web</title>
		<link>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/</link>
		<comments>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 22:23:47 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Optimização]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[parallel load]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=178</guid>
		<description><![CDATA[Um aspecto muito importante que é necessário ter em conta aquando do desenvolvimento de páginas web é a acessibilidade de uma página e do tempo que a página demora a estar pronta para ser utilizada, pois caso o tempo de carregamento (load time) seja elevado, os visitantes não vão gostar podendo até retroceder e não [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Um aspecto muito importante que é necessário ter em conta aquando do desenvolvimento de páginas web é a acessibilidade de uma página e do tempo que a página demora a estar pronta para ser utilizada, pois caso o tempo de carregamento (load time) seja elevado, os visitantes não vão gostar podendo até retroceder e não voltar a essa página, logo load times elevados correspondem quase que directamente a visitantes / utilizadores / membros / clientes perdidos.</p>
<p style="text-align: center;"><strong>Tempo de carregamento baixo = &#8211; tempo perdido = utilizador contente</strong></p>
<p>Então podemos concluir que é necessário diminuir os tempos de carregamento das páginas e neste artigo vão ser abordadas várias formas de como reduzir os tempos de carregamento tendo em conta a optimização do JavaScript, do CSS, das imagens bem como optimização do lado do servidor nomeadamente com a utilização de PHP. <span id="more-178"></span></p>
<h2>JavaScript</h2>
<p>O JavaScript é uma linguagem que tem vindo, sucessivamente, a tornar-se cada vez mais popular entre os programadores de webservices pois tem aplicações desde a passagem de argumentos para o servidor sem ser necessário recarregar a página até aos efeitos que o JavaScript permite adicionar às páginas e seus elementos.  Mas, infelizmente, todas estas funcionalidades e coisas boas que o JavaScript traz tem um preço&#8230; Muitas vezes os ficheiros JavaScript tornam-se muito pesados, quer por serem bibliotecas como a jQuery, MooTools, dojo, ExtJS, etc. ou mesmo porque desenvolvemos grande parte da interface recorrendo a esta linguagem, o que vai adicionar centenas de kilobytes de informação às páginas. E o utilizador é exigente, quer páginas com tempos de carregamento baixos, mas também gosta de todas as facilidades e das interfaces que o JavaScript lhe proporciona. Assim, torna-se necessário, para não causar descontentamento no utilizador, correlacionar estes dois aspectos, é importante encontrar um ponto de equilibro.  Como encontrar um ponto de equilibro entre a utilização &#8220;massiva&#8221; de JavaScript e a exigência dos utilizadores?</p>
<h3>Conteúdo duplicado para quê?</h3>
<p>Sim, pode parecer óbvio que não se deve ter o mesmo script repetido na mesma página mas é algo que é muito comum e vai gerar dois pedidos HTTP por cada componente a descarregar e utilizar mais capacidade de processamento por parte do browser do utilizador, factores que levam a que a página demore mais tempo a ser carregada inutilmente. Verifique sempre se não tem conteúdo duplicado por acaso!  Uma outra solução é utilizar PHP, ou outra linguagem server-side, para adicionar os ficheiros JavaScript ao HTML e verificar se já foi adicionado ou não, tornando assim o código mais profissional e menos susceptivel a falhas e/ou faltas de atenção / verificação.</p>
<h3>Colocar os scripts no fundo da página</h3>
<p>O grande problema com os scripts é que os browsers não permitem descarregar mais nenhum componente externo enquanto está a descarregar um script.  Para optimizar o carregamento da página é então aconselhável que se movam os scripts para o fundo do body, no entanto, existem scripts que não podem ser movidos para o fundo pois passam conteúdo valioso para a página (por exemplo).  Uma solução alternativa é utilizar o atributo defer.</p>
<blockquote><p>&#8220;When set, this boolean attribute provides a hint to the user agent that the script is not going to generate any document content (e.g., no &#8220;document.write&#8221; in javascript) and thus, the user agent can continue parsing and rendering.&#8221; (<a title="Designing documents for user agents that support scripting" href="http://www.w3.org/TR/html4/interact/scripts.html#h-18.2" target="_blank">ver aqui</a>)</p></blockquote>
<p>Assim ao utilizar o atributo defer estamos a dizer ao browser que pode continuar a carregar a página e carregar o script apenas no fim. O que vai reduzir substancialmente o tempo de carregamento, tal como é pretendido.</p>
<h3>Descarregar ficheiros em paralelo</h3>
<p>Caso façamos uma introdução &#8220;normal&#8221; na nossa página de ficheiros JavaScript isso vai fazer com que os ficheiros sejam descarregados um de cada vez, diminuindo assim o tempo de carregamento da página.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">(...)
&lt;script src=&quot;script1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:0--&gt;&lt;/script&gt;
&lt;script src=&quot;script2.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:1--&gt;&lt;/script&gt;
(...)</pre></div></div>

<p><img class="aligncenter size-medium wp-image-281" title="Not Parallel Download" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/not_parallel-300x30.png" alt="Not Parallel Download" width="300" height="30" /></p>
<p>Utilizando a forma normal de inserir os scripts na página vai acontecer que o script2.js só começa a ser descarregado depois do script1.js estar completamente descarregado. Mas para quê esta espera se os acessos de hoje são de banda larga e suportam altas velocidades? Podemos descarregar ambos paralelamente, ao mesmo tempo.</p>
<p>Caso os ficheiros sejam descarregados de forma paralela o tempo de carregamento da página vai diminuir, e como podemos fazer isso? É tão simples como saber utilizar o document.write</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">(...)
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;!--</span>mce<span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">--&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>&lt;script src=&quot;script1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:3--&gt;&lt;/script&gt;&lt;script src=&quot;script2.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:4--&gt;&lt;/script&gt;
(...)</pre></div></div>

<p><img class="aligncenter size-medium wp-image-282" title="Parallel Download" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/parallel-300x31.png" alt="Parallel Download" width="300" height="31" /></p>
<p>Como podemos observar, o segundo exemplo permite que os ficheiros sejam descarregados mais rápidamente pois o download é efectuado ao mesmo tempo. Para mais informações sobre downloads em paralelo continue a ler o artigo e na secção Server-Side este tema será novamente abordado.</p>
<h3>Ferramentas para a optimização de código JavaScript</h3>
<ul>
<li><a title="Javascript Compressor - compress code online for free" href="http://javascriptcompressor.com/" target="_blank">Javascript Compressor &#8211; compress code online for free</a></li>
<li><a title="YUI Compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUI Compressor</a></li>
</ul>
<h2>CSS</h2>
<p>Todas as páginas web utilizam folhas de estilo (<a title="Mais Informações sobre CSS" href="http://pt.wikipedia.org/wiki/Cascading_Style_Sheets" target="_blank">CSS -Cascading Style Sheets</a>) e dependendo do design e da estrutura da folha de estilo esta pode ser maior ou menor mas em ambos os casos leva tempo a carregar e esse tempo deve, tal como nos outros pontos abordados neste artigo, de ser diminuido ao máximo! Além da validação sempre necessária vão ser apresentadas algumas formas de optimizar o código CSS. (<a title="CSS Validator" href="http://jigsaw.w3.org/css-validator/" target="_blank">validar CSS aqui</a>).</p>
<h3>Folhas de estilo no topo</h3>
<p>Colocar as folhas de estilo no topo da página faz com que as páginas possam carregar progressivamente e que o utilizador vá vendo o design a surgir. É muito importante dar aos utilizadores um feedback visual mal seja possível (<a title="Response Times: The Three Important Limits" href="http://www.useit.com/papers/responsetime.html" target="_blank">ver estudo aqui</a>), no caso de uma página web a estrutura da página é o nosso indicador de progressão no carregamento da página. Ao carregar a estrutura progressivamente da página (exemplo: header -&gt; menu -&gt; left sidebar -&gt; contéudo) tudo isto vai servir como feedback visual para o visitante que está à espera da página.  Caso as folhas de estilo aparecessem mais para o fim, o utilizador enquanto a página fosse carregando iria ter um visual sem estilo algum, sem uma ordem, e por isso pode facilmente desinteressar-se pela página.  É também uma especificação HTML dada pelo World Wide Web Consortium (<a title="Document relationships: the LINK element" href="http://www.w3.org/TR/html4/struct/links.html#h-12.3" target="_blank">ver aqui</a></p>
<p>).</p>
<h3>Optimizar o Código CSS</h3>
<p>Existem várias formas de se optimizar o código CSS sem reduzir de forma alguma as suas capacidades tornando apenas o código mais pequeno e mais conciso.  Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span><span style="color: #933;">15px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-bottom</span><span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span><span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Neste exemplo podem ser feitas duas alterações de forma a optimizar o código.  Unir as componentes da propriedade padding na própria propriedade. A ordem é sempre  top, right, bottom, left (Menomónica possível: TR BL ou sentido dos ponteiros do relógio( Dica de: http://bit.ly/cY3W9G).</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #933;">0px</span> <span style="color: #933;">10px</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Em vez de utilizarmos 6 linhas utilizamos 1 linha, obtendo o mesmo efeito. Neste exemplo existe ainda outra modificação que podemos fazer que é a de retirar caracteres desnecessários.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Como é possível verificar foi retirado depois do 0 os caracteres px porque 0 é uma medida igual quer em pt, px, em, etc. logo é tempo de carregamento (devido a ser um ficheiro menor) que ganhamos.  Caso as medidas padding-top e padding-bottom sejam iguais é possível utilizarmos algo assim: (consideremos as medidas top e bottom de 15px)</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Ou seja combinar a componente top e a componente bottom na mesma.  Também a nível do background (quase todos os websites utilizam esta propriedade) devem ser feitas optimizações:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">background-image</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#ffffff</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-repeat</span><span style="color: #00AA00;">:</span><span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">top</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Passa a:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #cc00cc;">#fff</span> <span style="color: #000000; font-weight: bold;">top</span> <span style="color: #993333;">center</span> <span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Neste exemplo fizeram-se duas alterações, passaram-se as várias componentes do background tudo para a propriedade sem particionamento e a cor passou de #ffffff a #fff. Esta útlima alteração das cores também pode ser utilizada de forma a optimizar o código.  Se se definam cores utilizando o standard de 6 digitos este pode ser definido apenas por 3 digitos em certos casos. Como por exemplo:  Preto #000000 passa para #000 Branco #ffffff passa para #fff Verde #99ff33 passa para #9f3 Orange #ffcc00 passa para #fc0 Vermelho #ff3300 passa para #f30  Mas por exemplo #930f14 já não pode ser simplificada.  Esta técnica funciona para todas as cores seguras (<a title="Web Safe Colors Palette" href="http://www.lynda.com/resources/webpalette.aspx" target="_blank">ver aqui tabela</a>).  É também muito comum uma outra optmização a nível do código CSS que é combinar elementos. Se tivermos dois elementos que tenham certas caracteristicas iguais, então em vez de se definir duas vezes a mesma caracteristica define-se apenas uma vez englobando ambos os elementos o que torna o código mais limpo e mais leve. Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">p <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#000</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.texto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#360</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Como podemos reparar as caracteristicas border, padding margin e font-size são idênticas quer na tag p quer na class .texto. Assim em vez de se definirem essas propriedades duas vezes podem ser definidas apenas uma:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">p<span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.texto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<h3>Ferramentas para Optimização de CSS</h3>
<ul>
<li><a title="CSS Drive - CSS Compressor" href="http://www.cssdrive.com/index.php/main/csscompressor" target="_blank">CSS Drive &#8211;  CSS Compressor</a></li>
<li><a title="Cascading Style Sheets Optimization" href="http://www.cssoptimiser.com/" target="_blank">Cascading Style Sheets Optimization</a></li>
<li><a title="Clean CSS" href="http://www.cleancss.com/" target="_blank">Clean CSS</a></li>
</ul>
<h3>Leitura complementar:</h3>
<ul>
<li><a title="CSS Sprites" href="http://www.alistapart.com/articles/sprites/" target="_blank">CSS Sprites</a></li>
</ul>
<h2>JavaScript / CSS</h2>
<h3>JavaScript e CSS em ficheiros externos</h3>
<p>Uma pergunta que se faz muitas vezes é se os ficheiros JavaScript e os ficheiros CSS devem estar em ficheiros à parte ou na própria página.  Utilizar ficheiros externos torna as páginas mais rápidas porque os ficheiros ficam na cache do browser equanto que se estiverem na página são descarregados sempre que é feito um pedido do documento, assim, ao utilizar ficheiros externos, reduz-se o tamanho da página mas aumenta-se o número de pedidos HTTP, contudo, os ficheiros externos ficam na cache do browser, logo diminui-se os pedidos HTTP e o tamanho da página utilizando ficheiros externos.  Além da optimização da página, utilizar ficheiros externos torna o código mais estruturado, mais fácilmente editável e mais limpo sendo então uma boa prática para manutenção da página.</p>
<h2>Imagens</h2>
<p>Os designs mais eye-candy com a utilização de vários icons para descrever serviços, os efeitos dos fundos, dos headers, dos footers, etc. utilizam bastantes imagens, maiores ou menores mas que, de qualquer modo, levam a que o tempo de carregamento da página seja maior.  E o que há fazer? São só imagens&#8230; Há alguns truques que podem ser utilizados para aumentar a velocidade de carregamento de imagens.</p>
<h3>Não redimensione imagens em HTML!</h3>
<p>Este ponto é de facto importante, muitas vezes carregam-se imagens, imaginemos, de 500x500px e depois em HTML definem-se medidas menores, isto é desnecessário e vai obrigar a que uma imagem maior seja carregada em vez de uma menor. Ou seja, em vez de se fazer algo assim</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; width=&quot;50px&quot; height=&quot;50px&quot; /&gt;</pre></div></div>

<p>com a imagem image.png a ter um tamanho de 500x500px deve-se ter</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; /&gt;</pre></div></div>

<p>tendo a imagem image.png o tamanho de 50x50px.</p>
<p>É também importante manter sempre as dimensões da imagem mesmo quando ela é exacta, isto é, no caso anterior mesmo já tendo a imagem 50x50px como queremos devemos indicar width=&#8221;50px&#8221; height=&#8221;50px&#8221; porque deste modo o browser não tem de &#8220;medir&#8221; a imagem antes de a colocar na página ficando então da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; width=&quot;50px&quot; height=&quot;50px&quot; /&gt;</pre></div></div>

<p>Obrigado ao <a href="http://sergiolopes.name/" target="_blank">Sérgio Dinis Lopes</a> pela dica.</p>
<h3>favicon.ico pequeno e armazenável em cache</h3>
<p>O favicon.ico é uma pequena imagem que se encontra na raíz do servidor (normalmente).  É muitas vezes um problema porque mesmo não existindo o browser vai fazer um request à sua procura por isso é sempre bom ter uma para não se responder com um erro <a title="Descrição do Erro 404 Not Found" href="http://en.wikipedia.org/wiki/404_error" target="_blank">404 Not Found</a>.  Esta pequena imagem interfere também com a sequência de carregamento da página por exemplo no browser Internet Explorer enquanto que os scripts, css, imagens, etc são pedidos no onload event o favicon é pedido antes. <span style="text-decoration: underline;">Sugestões:</span></p>
<ul>
<li>Pequeno, de preferência com um máximo de ~1K (exemplos: wikipedia 318 bytes; google 1150 bytes; twitter 1406 bytes; wordpress 1150 bytes);</li>
<li>Defina o parâmetro Expires com um valor que ache mais correcto (4 meses é um valor aceitável tendo em conta que não se muda de favicon ferquentemente);</li>
</ul>
<h3>Escolher o Formato Correcto para as Imagens</h3>
<p>Existem vários formatos de imagens utilizados na construção de páginas web, entre elas destacam-se os formatos <a title="Mais Informações sobre o formato GIF" href="http://pt.wikipedia.org/wiki/Graphics_Interchange_Format" target="_blank">gif</a>, <a title="Mais Informações sobre o formato JPEG" href="http://www.w3.org/Graphics/JPEG/" target="_blank">jpeg</a>, <a title="Mais Informações sobre o formato PNG" href="http://www.w3.org/Graphics/PNG/" target="_blank">png</a> e é importante escolher para cada imagem qual o formato que melhor se lhe adequa fazendo com que imagens com menos pormenores, menos cores, etc. utilizem formatos mais leves (<a title="Página para ajudar na escolha dos Formatos de Imagem" href="http://www.yourhtmlsource.com/images/fileformats.html" target="_blank">ver mais informações aqui</a>).</p>
<h3>Leitura complementar:</h3>
<ul>
<li><a title="Image Optimization: Four Steps to File Size Reduction" href="http://yuiblog.com/blog/2008/11/14/imageopt-3/" target="_blank">Four Steps to File Size Reduction</a> por Stoyan Stefanov</li>
<li><a title="Image Optimization: Progressive JPEG…Hot or Not?" href="http://yuiblog.com/blog/2008/12/05/imageopt-4/" target="_blank">Progressive JPEG…Hot or Not?</a> por Stoyan Stefanov</li>
<li><a title="Host Images Files on Amazon S3 Storage" href="http://www.labnol.org/internet/host-images-files-on-amazon-s3-storage/" target="_blank">Alojar Imagens na Amazon</a> por Amit Agarwal</li>
</ul>
<h2>Server-Side</h2>
<p>Nos tempos de carregamento também interferem as acções do lado do servidor e por isso é necessário optimizar essas acções o máximo possível.</p>
<h3>Descarregar o buffer de saída mais cedo</h3>
<p>Quando uma página é pedida existe um intervalo de tempo em que o browser espera que o servidor junte o HTML e o envie para o browser. Durante este tempo o browser está inactivo à espera da resposta. A linguagem de programação <a title="PHP" href="http://www.php.net" target="_blank">PHP</a> tem uma função chamada <a title="PHP Função: Flush" href="http://pt2.php.net/manual/pt_BR/function.flush.php">flush</a> que permite que sejam enviadas respostas para o browser particionadas permitindo ao browser começar logo a carregar as informações recebidas enquanto o servidor continua a gerar o resto do HTML.</p>
<h3>Downloads em Paralelo</h3>
<p><span style="font-size: xx-small;">(imagens utilizadas neste subcapitulo retiradas <a title="Maximizing Parallel Downloads in the Carpool Lane" href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/" target="_blank">daqui</a>)</span></p>
<p style="text-align: left;">A especificação <a title="HTTP1/1" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4" target="_blank">HTTP/1.1</a> sugere que os browsers façam apenas dois downloads em paralelo de cada dominio assim caso todos os componentes estejam no mesmo dominio só poderão ser feitos dois downloads de cada vez aumentando muito o tempo que uma página demora a carregar.</p>
<blockquote>
<p style="text-align: left;">Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy.</p>
</blockquote>
<p style="text-align: center;"><img class="size-medium wp-image-253 aligncenter" title="Dois Downloads em Paralelo" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/two_parallel-300x192.gif" alt="Dois Downloads em Paralelo" width="300" height="192" /></p>
<p>Neste exemplo, estão representados 10 componentes extra na nossa página que precisam de ser descarregados, então se criarmos subdominios conseguimos optimizar o download dos componentes colocando-os a ser descarregados em paralelo.  Apesar de se poderem adicionar quantos sub-dominios quiserem às páginas não se devem utilizar mais do que 2-4 dominios devido ao tempo que demora a fazer a correspondência nos DNS (hostname &lt;-&gt; IP) e esta demora, normalmente, entre 20 e 120 millisegundos, enquanto isto acontece o browser não descarrega nada do dominio em questão.  E então como resolver a situação? O HTML fica no main-domain http://joaopedropereira.com/ e podem ser criados entre dois e quatro sub-dominios para as imagens content1.joaopedropereira.com e content2.joaopedropereira.com e (sub-dominios apenas com fins ilustrativos). <img class="aligncenter size-medium wp-image-258" title="Four Parallel Downloads" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/four_parallel-300x192.gif" alt="Four Parallel Downloads" width="300" height="192" /> Assim conseguimos optimizar o tempo de carregamento das imagens e scripts da página. Neste exemplo foi possível poupar algum tempo, quanto mais scripts e imagens existirem mais diferença se fará notar no tempo de carregamento da página.</p>
<h4>Leitura Complementar</h4>
<ul>
<li><a title="Maximizing Parallel Downloads" href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/" target="_blank">Maximizing Parallel Downloads</a></li>
<li><a title="Host Images Files on Amazon S3 Storage" href="http://www.labnol.org/internet/host-images-files-on-amazon-s3-storage/" target="_blank">Alojar Imagens na Amazon</a> por Amit Agarwal</li>
<li><a title="Optimize Parallel Downloads to Minimize Object Overhead" href="http://www.websiteoptimization.com/speed/tweak/parallel/" target="_blank">Optimize Parallel Downloads to Minimize Object Overhead</a></li>
</ul>
<h3>Utilizar o método GET ou POST em AJAX?</h3>
<p>Ao utilizar XMLHttpRequest, o método POST consiste em dois processos separados de envio de informações, primeiro envia os cabeçalhos e só depois envia a informação enquanto que o método GET envia a informação de uma só vez (excepto se existirem muitos cookies).  Existe também limite no envio de informações utilizando o método GET pois este não foi feito para enviar grandes quantidades de informações.  Tal como os nomes indicam o método GET foi desenhado para pedir informações ao servidor enquanto que o método POST foi desenhado para enviar informações para o servidor.  Então qual deles escolher?  Na verdade não existe um melhor, existem dois métodos diferentes para situações diferentes e o que é melhor em determinada situação pode não o ser numa outra situação diferente. Então é necessário avaliar cada caso e escolher qual o método mais apropriado.</p>
<h4>Leitura Complementar</h4>
<ul>
<li><a title="Ajax: Get or Post" href="http://javascript.about.com/od/ajax/a/ajaxgp.htm" target="_blank">Ajax: Get or Post</a> por Stephen Chapman</li>
</ul>
<h2>Quer saber mais?</h2>
<p>Existem mais maneiras de optimizar um website mas que podem ser mais complexas ou mais dispendiosas, mas vou aqui deixar links para quem quiser estudar mais sobre este tema.</p>
<ul>
<li><a title="High Performance Web Sites" href="http://oreilly.com/catalog/9780596529307/preview.html" target="_blank">High Performance Web Sites</a> por Steve Souders</li>
<li><a title="How To Optimize Your Site With GZIP Compression" href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/" target="_blank">How To Optimize Your Site With GZIP Compression</a></li>
</ul>
<div class="shr-publisher-178"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F' data-shr_title='Diminuir+Load+Times+no+Carregamento+de+P%C3%A1ginas+Web'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F' data-shr_title='Diminuir+Load+Times+no+Carregamento+de+P%C3%A1ginas+Web'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

