Como fazer um feed RSS dinâmico em PHP
Introduzimos o formato RSS e mostramos como construir um feed RSS dinâmico em PHP.
O que é um feed RSS?
Na página da Wikipedia sobre RSS podemos ler:
RSS (Really Simple Syndication) é uma família de formatos de feeds web usados para publicar conteúdo actualizado regularmente incluindo, mas não limitado a, entradas de blogs, notícias e podcasts.
É então um formato de ficheiro para publicar conteúdos. É útil porque as pessoas podem facilmente subscrever a esses feeds e receber conteúdo actualizado da sua preferência, quando e como querem, de várias fontes e de forma organizada. Como exemplo de um feed RSS podem ver o feed deste site: feed RSS do Broculos.net.
O software usado para ler feeds RSS é chamado de leitor RSS e pode correr no browser ou no desktop. XML é usado para especificar o formato RSS.
Um link para um feed RSS é normalmente acompanhado com um ícone RSS. Falaremos disto mais à frente.
Exemplo de um ficheiro RSS
O formato RSS é bastante simples. Neste tutorial vamos usar a versão 2.0 da especificação RSS. Vamos apenas usar algumas das suas etiquetas. Devem ver a especificação para saber se precisam ou querem utilizar mais.
Um feed RSS é composto por um canal e por uma colecção de itens. Tomem conhecimento de que existe um número máximo de itens que podem ter num feed RSS. Por exemplo, na versão 0.91 da especificação RSS, o número máximo de itens é 15. Os leitores podem impor os seus próprios limites.
Aqui fica um exemplo simples de um feed RSS.
<?xml version="1.0" encoding="ISO-8859-1"?> <rss version="2.0"> <channel> <title>Example RSS feed</title> <description>Example of a RSS feed, part of a programming tutorial on making a feed in PHP.</description> <link>http://www.broculos.net</link> <copyright>Copyright (C) 2008 Broculos.net</copyright> <item> <title>Example 1</title> <description>This is the description of the first example.</description> <link>http://www.example.com/example1.html</link> <pubDate>Mon, 29 Dec 2008 22:10:00 -0600</pubDate> </item> <item> <title>Example 2</title> <description>This is the description of the second example.</description> <link>http://www.example.com/example2.html</link> <pubDate>Thu, 03 Jan 2008 14:27:15 -0600</pubDate> </item> </channel> </rss>
Como criar um feed RSS dinâmico em PHP
Como podem ver no exemplo, é um formato bastante simples. No entanto, vocês não vão querer fazer um novo ficheiro RSS manualmente sempre que algo muda no vosso site.
Temos, portanto, 2 opções: fazer um script para produzir o ficheiro RSS ou fazer um script que é o ficheiro RSS. Prefiro a última hipótese, porque é mais simples e a primeira solução requer que chamemos o script sempre que quisermos actualizar o feed RSS.
Vamos então fazer o nosso feed RSS sempre actualizado. Só precisamos de produzir as etiquetas apropriadas com o conteúdo. Como isto é apenas uma demonstração, os dados encontram-se definidos no próprio ficheiro. Numa situação realística o conteúdo seria carregado de uma base de dados.
<?php /**
* For demonstration purposes, the data is defined here.
* In a real scenario it should be loaded from a database.
*/ $channel = array("title" => "Example RSS feed", "description" => "Example of a RSS feed, part of a programming tutorial on making a feed in PHP.", "link" => "http://www.broculos.net", "copyright" => "Copyright (C) 2008 Broculos.net"); $items = array( array("title" => "Example 1", "description" => "This is the description of the first example.", "link" => "http://www.example.com/example1.html", "pubDate" => date("D, d M Y H:i:s O", mktime(22, 10, 0, 12, 29, 2008))) , array("title" => "Example 2", "description" => "This is the description of the second example.", "link" => "http://www.example.com/example2.html", "pubDate" => date("D, d M Y H:i:s O", mktime(14, 27, 15, 1, 3, 2008))) ); $output = '<?xml version="1.0" encoding="ISO-8859-1"?>'; $output .= '<rss version="2.0">'; $output .= "<channel>"; $output .= "<title>" . $channel["title"] . "</title>"; $output .= "<description>" . $channel["description"] . "</description>"; $output .= "<link>" . $channel["link"] . "</link>"; $output .= "<copyright>" . $channel["copyright"] . "</copyright>"; foreach ($items as $item) { $output .= "<item>"; $output .= "<title>" . $item["title"] . "</title>"; $output .= "<description>" . $item["description"] . "</description>"; $output .= "<link>" . $item["link"] . "</link>"; $output .= "<pubDate>" . $item["pubDate"] . "</pubDate>"; $output .= "</item>"; } $output .= "</channel>"; $output .= "</rss>"; header("Content-Type: application/rss+xml; charset=ISO-8859-1"); echo $output; ?>
A segunda parte do script constitui a construção do feed RSS. Requer que estejam definidas a variáveis $channel e $items com os valores respectivos a corresponder às chaves necessárias.
Depois de construirmos o XML e guardá-lo na variável $outputprecisamos de o mostrar. Antes de o fazermos enviamos um cabeçalho indicando o tipo de conteúdo do ficheiro. Neste caso dizemos que é um ficheiro XML RSS. Finalmente, mostramos o resultado final. Podem ver este exemplo de feed RSS.
Como fazer com que os browsers reconhecam o feed RSS
Agora devem preocurpar-se em tornar o feed RSS disponível para toda a gente que está interessada em subscrever-se a ele. Além de colocarem uma ligação no vosso site para o feed RSS, também devem fazer mais um passo adicional.
Existe uma etiqueta HTML que serve para indicar que a página tem um feed RSS. Devem colocá-la entre a etiqueta head.
<link rel="alternate" type="application/rss+xml" title="Title of the feed (RSS 2.0)" href="rss.php" />
Devem especificar o título do vosso feed RSS assim como a sua localização.
Para browsers que reconheçam RSS, isto garante uma forma simples de fazer com que o feed RSS seja detectado. Os browsers normalmente indicam que um feed RSS foi detectado ao mostrarem um ícone RSS na barra de localização.
Conclusão
Não se esqueçam - apenas falamos das etiquetas mais básicas. Devem ver a especificação completa para melhor perceberem o que devem incluir e o que devem deixar de fora.
O código que produzimos não é muito reutilizável. Podem optar por construir um escritor de RSS com algumas classes ou então definir uma função.
O que é que há mais ainda a fazer? Devem usar o ícone standard RSS, certificarem-se que o vosso RSS é válido através da validação do vosso feed RSS e para funcionalidades mais avançadas para o vosso feed RSS, como estatísticas de visitantes, podem usar o FeedBurner.
Recursos
- Informação sobre o formato RSS na Wikipedia
- Especificação 2.0 do formato RSS
- Validador de feeds RSS
- Feed Icons
- FeedBurner
Comentários
10:06 11-04-2008nunof
Thanks for the heads up. It was actually a problem in copy-pasting the code.I changed the outer quotes to single quotes.
17:28 23-04-2008josemota
Nice tutorial indeed. I just want to emphasize the big point of the tutorial: you are actually generating XML the same way you generate HTML. You can also set the URL to a php file instead of a regular XML as long as you say the MIME type is application/rss+xml. Dynamic generated content at its maximum power!23:21 08-05-2008Fabio
animaisos.org/rss23:23 08-05-2008Fabio
Nao estou conseguindo fazer funcionar no animaisos.org/rss. O codigo esta correto mas nao aparece nada de rss. Aguardo resposta. obrigado00:13 09-05-2008Fabio
Consegui, obrigado!09:55 09-05-2008nunof
Fico contente que tenhas conseguido!06:27 21-09-2008Keith
Very nice article, Appreciate it! Thumps up for you08:04 04-02-2009tedivm
I would highly suggest using something like SimpleXML over manually generating your XML. In the long run you are very likely to run into parsing errors or other issues otherwise.06:29 05-03-2009gaurav
Hello,im found following error when i check this from FEED Validator site.
XML parsing error: :1:0: no element found
Feeds should not be served with the "text/html" media type
my url is : http://chitkara.edu.in/dnn/rss_site.php
00:18 09-04-2009Charles
obrigado! funcionou perfeito no site q estou fazendo!23:48 24-10-2009matsolof
I did'nt realise I had to convert special characters to HTML entities. In other words, disregard the code right above (hopefully, it will be removed).This revised version of the code will automagically exclude older items. It uses a data base of php files. Make the necessary changes (the name of the site etc.) and save this as "rss.php":
<?php
$output = '<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://www.mySite.com/myRss.xml" rel="self" type="application/rss+xml" />
<title>My RSS Channel</title>
<link>http://www.mySite.com/index.php</link>
<description>My description</description>
<language>en</language>'."\r\n\r\n";
foreach(glob('rss/*') as $value){
require $value;
$today = date('Y-m-d');
$diff = (strtotime($today) - strtotime($pub_date)) / 86400; //86400 sek == 24 hours
if($diff > 100){$output .= '';} //remove items older than 100 days
else {$output .= '<item>
<title>'.$title.'</title>
<pubDate>'.$pubDate.' 00:00:00 GMT</pubDate>
<category>'.$category.'</category>
<link>http://www.mySite.com/'.$link.'</link>
<guid isPermaLink="true">http://www.mySite.com/'.$link.'</guid>
<description><![CDATA['.$description.']]></description>
</item>'."\r\n\r\n";}}
$output .= '</channel>
</rss>';
header("Content-Type: application/rss+xml; charset=utf-8");
echo $output;
?>
In the same directory as "rss.php", a) make a directory named "rss" and b) save this as "1000.php" in the directory named "rss":
<?php
$pub_date = '2009-10-24';
$title = 'My title';
$pubDate = '24 Oct 2009';
$category = 'My category';
$link = 'my_link.php';
$description = '<p>My description.</p>';
?>
Add more files in the directory "rss". Name them "0999.php", "0998.php", etc. (to get the earliest items at the top of the rss file). If you write a lot of rss, you may want to start with "10000.php" or perhaps even "100000.php".
Good luck!
23:53 24-10-2009matsolof
PS: If you need to convert special characters to HTML entities and other similar tasks, you may find my Automagic code generator helpful.23:59 24-10-2009matsolof
The code generator can be found at:http://www.mkforlag.com/english/tools/code_generator/
13:42 25-10-2009nunof
Thank you, that's very useful.03:53 29-12-2009alexandre
mto obrigado!!funcionou perfeitamente no meu site,
agradeço oo post!




19:27 09-04-2008sfradette
Dont forget to escape guillemets on the line 23 and 24 otherwise it wont work