Um Manifesto!

...

  • Increase font size
  • Default font size
  • Decrease font size

Entrando na computação nas nuvens, com PHP e o Google App Engine

E-mail Print PDF

Continuando as aventuras em diferentes plataformas, hoje vamos levar o PHP para as nuvens com o Google App Engine. Se alguem já rodou o PHP no Quercus, fique tranquilo por que este é bem mais fácil.

Você vai precisar criar um conta no GAE na plataforma Java, que é early access ainda. Enquanto espera a liberação da conta, vamos preparar o ambiente de desenvolvimento.

Primeiro baixe o SDK java do google app engine da página do google, é o appengine-java-sdk. Extraia-o em algum lugar onde possa trabalhar com ele.

Agora pegue o projeto em branco do PHP, já pronto para o GAE, e o extraia proximo ao SDK.

Para ver o "hello world", você precisa executar o servidor de desenvolvimento para esta aplicação. O SDK vem com o utilitário para tal, a linha de comando para iniciar o servidor é esta:

$ appengine-java-sdk/bin/dev_appserver.sh blankphp/war

Basta chamar o script do servidor e passar o caminho do war da aplicação, agora esta acessivel em http://localhost:8080

Agora para começar seu próprio projeto crie um cópia do blankphp com o nome do seu app. Nesta nova pasta edit no arquivo  war/WEB-INF/web.xml, próximo do fim, a entrada servlet-mapping que aponta para phpblank para apontar para o novo projeto. Depois edite o appengine-web.xml na mesma pasta para o application corresponda a sua aplicação. Agora basta apontar o servidor para a nova pasta.

O desenvolvimento se dá colocando o conteúdo do "site" na pasta war, a partir da raiz. É legal colocar também um favicon.ico na raiz, senão a app engine reclama disso. No arquivo WEB-INF/urlrewrite.xml é possivel configurar redirecionamentos de URL como o Apache, no formato <rule><from>^$</from><to>index.php?$1</to></rule>.

Conforme a colaboração do Igor Cemim (lá no comentários), veja que por padrão o GAE não assume o index.php como arquivo de entrada padrão, ou seja ao entrar na URL sem /index.php não aparece nada. A solução é incluir a seguinte regra no urlrewrite.xml. Valeu Igor!

Graças ao Quercus, você pode fazer chamadas das classes java direto dentro do PHP, seguindo o exemplo:

<?

import  com.google.appengine.datastorage.Text ;
$text = new Text( "String");
echo $text->getValue();

?>

Veja que rodar uma aplicação no GAE não é a mesma coisa que no LAMP, a maior mudança é , sem dúvidas, no banco de dados. Por que não tem.

Não é que não tenha, mas como o JDBC não esta disponível, também não estão o PDO e *_connect() do PHP/Quercus. A solução de storage do GAE é o datastorage, atráves de JDO, JPA ou JDOQL.

Para usar o JDO você precisa criar as entidades em Java, no blankphp vem um exemplo bem fraco de como faze-lo. Você vai precisar compilar as classes com o ant (o build.xml já esta configurado), usando:

$ ant compile
E "enhance" a classe a ser persisitida (caso não esteja no build):

$ java -cp ../appengine-java-sdk/lib/appengine-tools-api.jar:war/WEB-INF/classes:../appengine-java-sdk/lib/user/appengine-api-1.0-sdk-1.2.1.jar com.google.appengine.tools.enhancer.Enhance war/WEB-INF/classes/app/JsonJDO.class

Lembrando de corrigir os caminhos para os JAR de acordo. Para usar o exemplo no PHP você poderia fazer assim:

<?

import Storage ;
$st = new Storage ;
$obj = $st->get($_GET['id']);
$json = $obj->getJson()->getValue();

$jsonNovo = '{"nome":"Diogo"}';
$st->put($_GET["id'],$jsonNovo);

?>

Agora, depois de escrever suas classes Java, seus arquivos PHP, frameworks etc, e tiver testado bastante (localhost:8080), é hora de enviar para o GAE, com a seguinte linha:

$ appengine-java-sdk/bin/appcfg.sh update blankphp/war

Trocando, claro, o blankphp pelo nome do projeto, depois vai pedir login e senha, e pronto, basta acessar seu app no GAE e ver tudo funcionar(ou não!).

  • Igor Cemim  - Muito bacana!
    Muito bacana o post! Estava procurando por isso :D

    Esse vai pros favoritos!
  • Diogo Souza
    Bom que ajudou. O App Engine é muito bacana, vale a pena usa-lo.
  • Igor Cemim  - Link quebrado...
    Você andou atualizando o blog aqui???
    O link do projeto em branco ta quebrado.

    Abraços
  • Diogo SOuza  - Corrigido
    Pois é Igor, na verdade atualizei o arquivo com o update do SDK, para incluir algumas bibliotecas que mudaram. Esta correto o link agora.

    Abraço.
  • Igor Cemim
    Opa, blz?!

    Depois de apanhar um pouco consegui me cadastrar e
    enviar a aplicação pro servidor, mas, quando
    acesso minha-aplicação.appspot.com (sem o index.php)
    ele não redireciona para a index.php, simplesmente não exibe nada.

    Tem algum jeito de consertar isso? Talvez com o urlrewrite.xml?
    As regras de URL Rewrite são iguais as do Apache ou tem um formato
    especial do GAE?

    Abraços, Igor Cemim
  • Igor Cemim
    Consegui corrigir o problema sem muito esforço. :P

    É só colocar o seguinte no urlrewrite.xml:
    http://pastebin.com/m6d68635b

    Obs.: Recomendo adicionar essa informação ao post.

    Obs. 2: Por favor apague o comentário anterior pois o
    wordpress filtrou o código XML.

    Abraços, Igor Cemim
  • Diogo Souza
    Essa foi tranquila hein?

    Atualizei o post, valeu pela contribuição. Está indo bem a app agora?

    Qualquer dúvida, é só falar :)
  • Igor Cemim
    Agora só falta aprender a utilizar o DataStore que
    é o método que o GAE usa pra armazenar dados :P
  • Igor Cemim  - Tutorial DataStore
    A única coisa que tá fóda a aprender é
    fazer a integração do PHP com as classes de banco de dados
    do Google DataStore.

    Bem que você podia fazer um tutorial... :)

    Não achei nada decente sobre o assunto na web. :p

    Abraços
  • Diogo Souza
    Essa parte é complicada mesmo, vou preparar um material para esses dias.

    Enquanto isso você pode dar uma olhada no código de um serviço que tenho lá, no github.

    http://github.com/diogok/ideaswallorg/tree/master

    Classes importantes em java estão em src/ideas/New*.java, principalmente NewStorage.java .

    A parte importante em PHP war/StorageWrapper.new.php .

    Mas vou preparar um artigo sobre. Eu também perdi um tempão mesmo no o blankphp.
  • Igor Cemim  - Uhull
    Vou dar uma olhada no seu código.

    Aguardo anciosamente o tutorial :D

    Abraços
  • Igor Cemim
    Enquanto não sai o tutorial gostaria de saber...

    Se eu tiver o StorageWrapper.new.php, NewIdea.java, NewStorage.javae e NewUser.java consigo trabalhar
    com base de dados?

    Pelo que eu entendi lendo a documentação do GAE
    e vendo seus códigos o NewIdea.java é a estrutura
    da base de dados;

    O NewUser é outra estrutura de base da dados, só que
    para guardar logins e senhas e o NewStore são
    a classe com os métodos que você usa para manipular
    os dados, ae depois você só chama esses métodos no
    PHP.

    Nussa... nunca programei em Java (nem HelloWorld)
    não dava para fazer uma versão simplificada
    da classe só com métodos simples, inclusão,
    alteração, exclusão? :)

    E também dar uma ajudinha de como
    definir a estrutura da base de dados. :P

    Abraços
  • Diogo Souza
    Nos arquivos que vem no blankphp tem o exemplo mais simples.

    Se você ver no index.php do blankphp, faço o import do Storage, instancio e o uso.

    Assim eu busco um registro usando o $storage->get($id) e o salvo usando $storage->put($id,$json).

    Nesse caso eu converto os objetos que quero persistir para JSON, e salvo no campo de texto da minha entidade JsonJDO.

    É como se cada entidade (cada classe java) fosse uma tabela.

    No projeto no github se você olhar as classes src/ideas/Idea.java Use.java e Storage.java , seguem um meio mais simples.

    Veja então o war/StorageWrapper.php que acessa essa forma mais simples.

    A primeira parte do Tutorial já vai sair.
  • Diogo Souza
    Igor, a primeira parte do tutorial esta pronta.

    http://manifesto.blog.br/1.5/Blog/PHP/google-app-engine-datastore-com-jdo-e-php.html

    Acho que ainda preciso melhorar algumas coisa, mas é um começo.
  • Diogo Souza
    Se chegou até aqui você vai querer conferir também como adaptaram o wordpress ao GAE:

    http://wordpress-on-quercus.appspot.com/wordpress-2.7.1/
  • Anonymous  - Windows Vista
    Caro,
    Ao tentar chamar o servidor para blankphp/war o windows vista abre uma tela querendo abrir o arquivo .sh com algum programa do windows. Nao funcionou o "hello world" apresentado.
    Poderia me ajudar?
    Grato
  • Anonymous
    Olá,

    Esqueci de avisar mas as instruções são para Linux, para o windows ao invés de ".sh" use o ".cmd", e nos caminhos troque "/" por "", ou seja ao invés de:

    appengine-java-sdk/bin/dev_appserver.sh blankphp/war

    use

    appengine-java-sdkbindev_appserver.cmd blankphpwar

    Acredito que seja só isso.
Write comment
Your Contact Details:
 
Comment:
Security Please input the anti-spam code that you can read in the image.

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."

Last Updated on Tuesday, 11 August 2009 00:38