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

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!

<rule>
<from>^/$</from>
<to>index.php</to>
</rule>

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!).

21 ideias sobre “Entrando na computação nas nuvens, com PHP e o Google App Engine

  1. 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.

  2. 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

  3. Consegui corrigir o problema sem muito esforço. :P

    É só colocar o seguinte no urlrewrite.xml:

    /
    /index.php

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

    Abraços, Igor Cemim

  4. 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

  5. Essa foi tranquila hein?

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

    Qualquer dúvida, é só falar :)

  6. Agora só falta aprender a utilizar o DataStore que
    é o método que o GAE usa pra armazenar dados :P

  7. 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

  8. 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.

  9. 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

  10. 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.

  11. 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

  12. 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-sdk\bin\dev_appserver.cmd blankphp\war

    Acredito que seja só isso.

  13. Estou com um problema durante a execução de projeto PHP em um ambiente JAVA utilizando o QUERCUS esta ocorrendo as seguintes situações:
    1. Tenho um projeto PHP que funciona normalmente no XAMPP, acessando POSTGRES, banco de dados LATIN1, via ODBC.
    2. Utilizando NetBeans 6.9.1 instalei o quercus e o projeto PHP.
    3. O projeto JAVA acessa o mesmo banco de dados do PHP (postgres) e exibe o conteúdo dos campos corretamente.
    4. Quando o JSP chama a pagina PHP, esta é executada normalmente, porem o conteúdo do banco (postgres) não é exibido corretamente (acentuações e caracteres do LATIN1).
    5. É como se no Java o acesso feito via JDBC esteja configurado para acessar e reconheçer o POSTGRES, com banco LATIN1, porem quando executa página PHP acessando o banco via ODBC alguma configuração esteja incompatível.

    Alguem pode ajudar?

Comentários encerrados.