Conteúdo


Criando um feed Atom em PHP

Fácil Organização com PHP e MySQL

Comments

O que é Atom?

Atom, como é usado aqui, refere-se a uma linguagem XML que permite publicadores da Web organizarem o conteúdo de seus Web sites para vários consumidores. Usando o Atom, os publicadores conseguem criar um Web feed em um formato padronizado. Este feed permite que os usuários leiam o conteúdo do Web site com um software conhecido como um leitor de feed. Ele também permite outros desenvolvedores da Web publicarem o conteúdo do feed em seus próprios Web sites.

Definitivamente, o Atom não é o único padrão de organização em uso hoje. O RSS é um outro formato padronizado (também usando XML) e anterior ao Atom. De fato, o Atom foi criado em resposta a determinadas limitações no RSS.

Como resultado, a especificação do Atom contém numerosas vantagens sobre o RSS. O Atom fornece um meio de definir o formato dos dados sendo fornecidos—por exemplo, HTML, XHTML e assim por diante—enquanto o RSS não. O Atom, diferentemente do RSS, suporta internacionalização com o atributo xml:lang. O Atom também aceita formatação de datas no mais alto nível (e padronizada), com base no Request for Comments (RFC) 3339, em vez do RFC 822 do RSS.

Por que PHP com Atom?

PHP significa PHP: Hypertext Processor. Esse talvez seja o único acrônimo no idioma inglês que, quando expandido, ainda contém o acrônimo original. A significância histórica aqui é que, originalmente, PHP significava Personal Home Page.

PHP é uma linguagem de script que produz conteúdo dinâmico no lado do servidor. Ele trabalha harmoniosamente com o HTML, e o código PHP é frequentemente integrado nas páginas da Web em HTML padrão para facilitar o conteúdo dinâmico.

O PHP também trabalha extremamente bem com o MySQL, um sistema de gerenciamento de banco de dados. Ao longo dos anos de desenvolvimento da Web, essas duas tecnologias surgiram juntas e trabalharam lado a lado em incontáveis ocasiões. Quase certo de que isso se deve a um fundamento inegável: ambos são gratuitos.

Em resposta á questão na parte superior desta seção, o PHP fornece aos desenvolvedores a flexibilidade de produzir conteúdo dinâmico de forma fácil de ler e desenvolver. O conteúdo dinâmico é recuperado de um banco de dados MySQL. A página de saída (o feed) é codificado usando PHP para que ele renderize uma saída XML em conformidade com a especificação Atom.

Observe que as explicações neste artigo foram escritas assumindo que você esteja familiarizado com os conceitos básicos do MySQL e do PHP. Se não estiver, consulte os links para obter tutoriais introdutórios na seção Recursos deste artigo.

Definindo Caso de Uso de Negócios: Relatórios de Pesca

Seu chefe está em seu escritório. Ele realmente gosta da forma como o Web site (fishinhole.com) da empresa está operando. O site comercializa e vende simultaneamente molinetes de todos os tipos para os entusiastas da pesca esportiva. O site também fornece um fórum de relatórios de pesca, no qual os fanáticos por pesca esportiva compartilham suas histórias de pescarias.

Seu chefe senta-se (sem perguntar) em uma cadeira em seu escritório e reclama que o Web site não está conseguindo uma exposição suficientemente ampla. Ele deseja usar a seção de relatório de pesca da página da Web para atrair mais pescadores para o Web site. Ele diz a você que deseja que você torne essa seção do Web site uma seção completa para relatórios de pesca esportiva em todo o mundo. Isso é essencial para o seu sucesso contínuo com a fishinhole.com (ele diz). Seu chefe bebe um gole de café, sorri e deixa seu escritório sem nada mais a dizer.

Você se senta em sua cadeira, relaxa e começa a raciocinar: O que poderia proporcionar uma maior exposição para o fórum de relatos de pescarias? Em um momento mais tarde vem à sua cabeça: organização! Em vez de simplesmente tornar a seção de relatos disponível para usuários e compradores na fishinhole.com, você pode organizar o fórum de forma que as pessoas possam ler sinopses dos relatos de pescarias com seus leitores de feed. Outros desenvolvedores da Web também podem incluir o feed de organização em suas próprias páginas da Web. Em qualquer caso, as pessoas clicariam nos títulos dos relatos de interesse e seriam retornadas para a fishinhole.com, onde você poderá apresentar um bombardeio de marketing direto de molinetes de pesca. É uma grande idéia.

O Design do Banco de Dados

Um longo tempo atrás, seu chefe entrou em seu escritório, o banco de dados do fórum de relatos de pescarias já estava projetado. Lembre-se de que a seção de relatos de pescarias da página da Web já existe. Ele apenas não foi organizado ainda.

Assim, quais alterações no banco de dados você precisa realizar para organizar seu conteúdo? Nenhuma! Essa é uma das grandes coisas sobre a organização. Na maioria dos casos, você pode organizar artigos sem alterar seu esquema subjacente ou modelo de dados. Isso porque, na maioria dos casos, você organizará artigos, e artigos quase sempre possuem informações necessárias para a especificação Atom.

A Lista 1 mostra o modelo de banco de dados atualmente usado pela seção de relatos de pescarias da fishinhole.com. Ela também contém alguns INSERTs para que você tenha dados de teste.

Lista 1. Componente REPORTS estrutura de tabela comINSERTs
CREATE TABLE IF NOT EXISTS `reports` (
  `ID` bigint(20) NOT NULL auto_increment,
  `AUTHOR` varchar(32) NOT NULL,
  `TITLE` varchar(64) NOT NULL,
  `SUBTITLE` varchar(128) NOT NULL,
  `CONTENT` varchar(2000) NOT NULL,
  `POSTED` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


INSERT INTO `reports` (`id`, `author`, `title`, `subtitle`, `content`, `posted`) VALUES
(1, 'BigRed', 'Spanish Bite Looking Good!', 'Near the Cape!',
'Trolled for 3 hours and limited out on Spanish Macks!  Watch out for the shallows
near green can #4.', '2009-05-03 04:54:33'),
(2, 'JonBoy', 'Big Rock Report', 'Spring has sprung',
'Caught several blackfins and mahi just outside of the Big Rock on Saturday.
We were using flourescent squid teasers with ballyhoo for hookups.
One Mahi weighed over 50#!', '2009-05-03 04:56:06'),
(3, 'Erasmus', 'Drum in the backwaters', 'The bite was hot!',
'Loaded up against the marsh grass, boys.  Go get em.  I was using gulp
with 1/4 ounce jigheads.', '2009-05-03 04:57:19'),
(4, 'ReelHooked', 'Speckled Trout In Old River', 'Limited out by noon',
'They were schooling heavy in Old River.  They would eat anything we would
throw at them.  Most were undersized, but we managed to keep some
and had our fill by midday.', '2009-05-03 04:59:00');

Se você for realmente testar o código apresentado neste artigo, você poderá fazê-lo criando um banco de dados MySQL chamado fishinhole e executando o código da A Lista 1 nesse banco de dados.

A primeira coluna (ID) é a chave primária da tabela. Observe que ela usa a especificação auto_increment para que sempre que uma nova linha for inserida na tabela, a coluna ID seja preenchida com um incremento da coluna ID da linha anterior. Isso é semelhante a uma sequência em uma tabela Oracle.

A visualização AUTHOR simplesmente especifica o nome do usuário da pessoa que postou o relato de pescaria. Este é o nome de tela do usuário, ao contrário do primeiro nome e último nome do usuário (a menos que o nome real do usuário seja, de fato, o nome de tela).

A visualização TITLE é simplesmente o título do artigo. Da mesma forma, o SUBTITLE é o subtítulo do artigo e é usado no feed Atom para a sinopse do artigo.

A visualização CONTENT é o próprio relato de pescaria. Como o feed Atom produzido aqui apenas inclui uma sinopse do artigo geral (dessa forma, incentivando os usuários a clicarem no link para acessarem o Web site), o conteúdo em si não é exibido no feed Atom.

Por fim, POSTED é uma coluna DATETIME que armazena a data em que o artigo foi postado no Web site.

Para manter as coisas simples, forneço apenas alguns artigos (4). Em uma situação do mundo real, haveria milhares desses artigos de centenas de diferentes autores.

O Trabalho Começa

Agora que você possui o projeto do banco de dados pronto, é hora de codificar a página PHP para que ela produza um feed Atom. Este artigo apresentará os conceitos básicos de criação de um feed Atom simples, o qual você pode testar usando o PHP.

Observe que, se você deseja testar o código, será necessário o acesso a um processador PHP. A maioria das soluções de hosting fornecem tal acesso. Você também pode ter acesso a processador PHP localmente. Consulte os administradores do sistema necessários ou a equipe de suporte técnico para descobrir como você pode executar documentos PHP em seu ambiente da Web.

Acessando o Banco de Dados no PHP

Crie um novo arquivo PHP chamado syndication.php. Esse é o arquivo onde você colocará seu código.

Conforme mencionado anteriormente, o PHP e o MySQL possuem um longo histórico de trabalharem extremamente bem juntos. Alguns ousam dizer que eles são casados. Mas tais julgamentos não estão no escopo deste artigo.

A Lista 2 fornece um trecho de código básico que permite o acesso ao banco de dados MySQL criado com o código da A Lista 1.

Lista 2. Acessando o banco de dados MySQL no PHP
$link = mysql_connect('localhost', 'admin', 'password')
    or die('Could not connect: ' . mysql_error());

mysql_select_db('fishinhole') or die('Could not select database');

$query = 'SELECT id,title,subtitle,author,posted
     FROM reports order by posted desc limit 25';
;
$result = mysql_query($query)
     or die('Query failed: ' . mysql_error());

Na realidade, o código abrange basta coisa, portanto é importante analisá-lo passo a passo.

Primeiro vem a função mysql_connect() integrada. É necessário alterar os parâmetros de acordo com as especificações de seu próprio ambiente. O primeiro parâmetro é o host do banco de dados. Em alguns casos, ele será apenas como a A Lista 2 (ou seja, localhost). Em outros casos ele será um host remoto (por exemplo, o endereço IP 10.92.2.1). Ele também pode ser um nome de host verdadeiro, assumindo que você tenha uma revolução Domain Name System (DNS) (por exemplo, mysql.myhost.com).

O segundo parâmetro é o nome do usuário MySQL que acessará o banco de dados. Você pode usar admin, conforme mostrado, apenas se essa for uma conta válida dentro do seu próprio ambiente MySQL. Consulte a documentação do MySQL para aprender como criar contas para um banco de dados MySQL. Tenha em mente que a conta usada aqui deve ter direitos de leitura para o banco de dados REPORTS .

O terceiro parâmetro é a senha do usuário. Essa senha precisa corresponder com a senha usada para o usuário identificado no segundo parâmetro.

A visualização or die é incluída para fornecer ao desenvolvedor informações de diagnóstico no evento de uma falha. Se uma conexão não puder ser realizada com o sistema de gerenciamento de banco de dados, você receberá uma mensagem indicando que a conexão falhou e a razão pela qual ela falhou quando o script PHP foi executado.

Em seguida vem a função mysql_select_db() integrada. É onde você realmente seleciona qual banco de dados você planeja usar. Sua própria cópia do MySQL pode conter (e provavelmente contém) muitos bancos de dados, portanto, é importante especificar qual deles você deseja usar.

Lembre-se que recomendei a criação de um banco de dados MySQL chamado fishinhole se você deseja testar a funcionalidade do código fornecido neste artigo. A visualização mysql_select_db() especifica se usará esse banco de dados.

Em seguida vem a consulta. Neste caso, você apenas define a consulta em uma cadeia. Aqui você obtém as colunas ID, TITLE, SUBTITLE, AUTHORe POSTED da tabela REPORTS . A visualização order by posted desc força a consulta a retornar linhas em ordem descendente pela data na coluna POSTED (que é a data na qual o artigo foi postado no Web site). Assim, você recupera primeiro os artigos mais recentes. Esta é uma prática padrão para feeds.

A visualização limit 25 no final é importante. É onde você especifica se deseja um máximo de 25 artigos retornados para este feed. Lembre-se que mencionei anteriormente que fóruns como este podem ter milhares de artigos. Francamente, não é nada prático retornar milhares de artigos em um feed. A largura de banda usada é significativa, e a maioria dos consumidores acabam aguardando por algum tempo.

Essa consulta é uma cadeia. Ela é designada a uma variável intuitivamente chamada $query.

No mysql_query() , na realidade você executa a consulta definida na linha anterior. Os resultados dessa consulta são armazenados na variável $result . Mais uma vez, a cláusula or die está pronta para propósitos de diagnósticos.

O Loop e a Especificação Atom

Agora que você possui os dados do banco de dados, é hora de começar a exibi-los em um formato que está em conformidade com a especificação Atom. Como o Atom é uma linguagem XML, a saída do arquivo PHP está no formato XML, em vez do formato HTML. Se você pretende usar um navegador da Web para exibir a saída, apenas tenha em mente que ela será exibida de forma diferente, dependendo do seu navegador e versão. Para visualizar a saída XML, geralmente é melhor clicar com o botão direito do mouse na saída em um navegador e selecionar Visualizar Origem. Em seguida, você verá a saída XML bruta.

Antes de exibir informações sobre cada artigo, é importante incluir o prefácio para o feed Atom. Essa é a seção que identifica a saída como feed Atom e fornece informações pertinentes sobre o feed, conforme mostrado na Lista 3.

Lista 3. O prefácio Atom
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
     <title>Fishing Reports</title>
     <subtitle>The latest reports from fishinhole.com</subtitle>
     <link href="http://www.fishinhole.com/reports/syndication.php" rel="self"/>
     <updated><?php echo date3339(); ?></updated>
     <author>
          <name>NameOfYourBoss</name>
          <email>nameofyourboss@fishinhole.com</email>
     </author>
     <id>
     tag:fishinhole.com,2008:http://www.fishinhole.com/reports/syndication.php
     </id>

Você talvez observe imediatamente que o código na Lista 3 não se parece com PHP. Isso porque a maior parte dele não é. É uma saída padronizada que precisa de pouco para se tornar um conteúdo dinâmico.

A visualização <feed> identifica este documento XML como um feed Atom. O espaço de nomes usado para definir os elementos é fornecido como um atributo do elemento <feed> . Também é usado o atributo mecionado acima xml:lang para especificar que este é um documento escrito em inglês.

A visualização <title> especifica um título para o feed geral. Da mesma forma, o <subtitle> especifica um subtítulo para o feed geral.

A visualização <link> especifica a URL deste documento syndication.php. O endereço no exemplo funciona no mundo fictício descrito neste artigo, mas não no mundo real. Na realidade, é possível incluir um link que produz a saída deste feed.

A visualização <updated> produz um registro de data e hora (compatível com o padrão RFC 3339) que informa o consumidor deste feed, quando foi atualizado pela última vez. Neste caso, como o feed sempre estará atualizado por recuperar os dados mais recentes do banco de dados, você usa o registro de data e hora atual. E talvez observe que há um pequeno trecho de código PHP neste elemento. Isso é uma função PHP customizada que produz um registro de data e hora no formato RFC 3339.

A visualização <author> define o autor do feed geral. Você usará o nome do seu chefe como o autor porque foi idéia dele.

Por fim, <id> identifica exclusivamente o feed em um formato Internationalized Resource Identifier (IRI).

Lista 4 é o loop principal que produz cada entrada no feed Atom. A grande maioria do trabalho para produção do feed é realizado aqui.

Lista 4. O loop
<?php
     $i = 0;
     while($row = mysql_fetch_array($result))
       {
          if ($i > 0) {
               echo "</entry>";
           }

           $articleDate = $row['posted'];
           $articleDateRfc3339 = date3339(strtotime($articleDate));
           echo "<entry>";
           echo "<title>";
           echo $row['title'];
           echo "</title>";
           echo "<link type='text/html'
                    href='http://www.fishinhole.com/reports/report.php?
                    id=".$row['id']."'/>";
           echo "<id>";
           echo "tag:fishinhole.com,2008:http:
                    //www.fishinhole.com/reports/report.php?id=".$row['id'];
           echo "</id>";
           echo "<updated>";
           echo $articleDateRfc3339;
           echo "</updated>";
           echo "<author>";
           echo "<name>";
           echo $row['author'];
           echo "</name>";
           echo "</author>";
           echo "<summary>";
           echo $row['subtitle'];
           echo "</summary>";

           $i++;
     }			
?>

Mais uma vez, a Lista 4 abrange a maior parte do assunto. Primeiro, é o loop while . Basicamente, esta parte do código diz, em inglês, "enquanto houver linhas na tabela que ainda não foram incluídas na saída, continue". A linha atual em cada iteração é armazenada em uma variável PHP, intuitivamente chamada $row.

Em seguida, o contador ($i) é verificado. Se o contador for maior que 0, então significa que esta é pelo menos a segunda iteração. Nesse caso, é necessário fechar o elemento <entry> da iteração anterior.

As próximas duas linhas recuperam a data do artigo (da coluna POSTED ) e a converte para o formato RFC 3339 usando a função mencionada acima.

Em seguida, o elemento <entry> é iniciado. Após isso, é a vez do elemento <title> , que é preenchido a partir da coluna TITLE na linha atual.

A visualização <link> é incomum, pois ele não contém nenhum texto-filho. Em vez disso, o link real é referido como um atributo. Isso é parte do padrão Atom. O link simplesmente aponta o usuário para a URL onde o usuário pode ler o artigo inteiro. Lembre-se de que este feed fornece apenas uma sinopse para o usuário.

A visualização <id> é semelhante àquele que foi descrito anteriormente. Ele identifica exclusivamente este elemento no formato IRI. E, como anteriormente, é construído a partir da URL relevante.

A visualização <updated> contém o valor DATETIME (no formato RFC 3339) a partir da coluna POSTED . Lembre-se de que a variável $articleDateRfc3339 para este documento foi preenchida anteriormente nesta iteração.

Em seguida vem o elemento <author> . Este elemento, diferentemente dos outros (mas como o elemento <author> no prefácio) possui elementos-filho. Para este artigo, apenas um desses filhos é usado: o nome do autor. O nome do autor é preenchido a partir da coluna AUTHOR da linha atual.

A visualização <summary> contém as informações coletadas da coluna SUBTITLE da linha atual.

Finalmente, o contador de loop ($i) é incrementado, e o loop continua.

Isso, em poucas palavras, é o corpo inteiro do código associado à produção de um documento Atom a partir da tabela REPORTS . Como é possível perceber, não é tão complicado quanto parece ser em um primeiro momento.

Além disso, tenha em mente que muitos elementos na especificação Atom não são cobertos aqui. Você pode simplesmente incluir esses elementos seguindo os mesmos padrões descritos nesta seção do código. Para obter informações adicionais, consulte Recursos.

Teste-o!

Agora vem a parte divertida: o teste!

Em vez de redigitar (ou copiar e colar) tudo que está nas listagens de códigos acima, você pode simplesmente usar o arquivo PHP incluído na seção Download . Copie esse arquivo para um diretório local e faça as alterações de banco de dados necessárias descritas anteriormente (nome de usuário, senha e host). Em seguida, copie o arquivo para uma estrutura de arquivos PHP que possui acesso ao banco de dados.

Quando você tiver o arquivo PHP no local correto, ative seu navegador e acesse seu arquivo da seguinte forma: http://your host/context/syndication.php.

Como com qualquer solução customizada, é necessário alterar os valores em itálico para correspondência com seu ambiente específico.

Conforme informado anteriormente, seus resultados poderão variar, dependendo de qual navegador e versão você usar. Alguns dos navegadores mais modernos detectam se este é um feed Atom e exibem os resultados de forma apropriada. Outros exibem o resultado em um formato XML bruto. Além disso, outros talvez não produzam nada, pois o documento não é um documento HTML padrão.

Se o navegador não exibe o XML bruto, você poderá simplesmente clicar com o botão direito do mouse no documento e selecionar Visualizar Origem. Após fazer isso, deverá ver algo semelhante à Lista 5.

Lista 5. A saída (abreviada)
<?xml version='1.0' encoding='iso-8859-1' ?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Fishing Reports</title>
  <subtitle>The latest reports from fishinhole.com</subtitle>
  <link href="http://www.fishinhole.com/reports" rel="self"/>
  <updated>2009-05-03T16:19:54-05:00</updated>
  <author>
   <name>NameOfYourBoss</name>
   <email>nameofyourboss@fishinhole.com</email>
  </author>
  <id>tag:fishinhole.com,2008:http://www.fishinhole.com/reports</id>
  <entry>
   <title>Speckled Trout In Old River</title>
   <link type='text/html' href='http://www.fishinhole.com/reports/report.php?id=4'/>
   <id>tag:fishinhole.com,2008:http://www.fishinhole.com/reports/report.php?id=4</id>
   <updated>2009-05-03T04:59:00-05:00</updated>
   <author>
    <name>ReelHooked</name>
   </author>
   <summary>Limited out by noon</summary>
  </entry>
...
</feed>

Uma outra forma de testar é verificar se o feed é válido. Você pode fazer isso usando um dos muitos validadores de feed Atom que você pode encontrar na Internet. Um bom a ser usado é http://www.feedvalidator.org. Esse Web site valida feeds nos formatos Atom, RSS e Keyhole Markup Language (KML).

Resultados dos Negócios

Como você implementa seu feed Atom, milhares de novos aficionados por pesca esportiva em todo o mundo agora possuem uma exposição para os relatos de pescaria em seu Web site. Você está recebendo centenas de links de entrada de sites de pesca esportiva que estão incorporando seu feed Atom. Alguns apreciadores da pesca esportiva estão até mesmo usando leitores de feed para visualizar os relatos diariamente.

Seu chefe volta ao seu escritório após acompanhar o tráfego de relatos mais recente. Ele está satisfeito com as visitas adicionais e relata que o número de novos visitantes aumentou 10%. Ele faz um sinal de positivo para você, bebe um gole de café, e deixa a sala.

Conclusão

A especificação Atom é um meio ideal de organizar seu conteúdo da Web. Usando o PHP com MySQL, você pode produzir facilmente um Web feed em conformidade com o padrão Atom e estar sempre atualizado, pois ele lê diretamente a partir do banco de dados. O feed pode, então, ser lido por um leitor feed ou integrado em outros Web sites. O resultado final é uma maior exposição de seu conteúdo da Web, e isso significa mais visitantes e, mais provavelmente, um aumento em seus lucros.


Recursos para download


Temas relacionados


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=422931
ArticleTitle=Criando um feed Atom em PHP
publish-date=07282009