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!).
- Comments
-
|2009-06-13 11:18:54 Diogo SouzaBom que ajudou. O App Engine é muito bacana, vale a pena usa-lo.
-
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.
-
|2009-08-10 19:25:30 Igor CemimOpa, 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
-
|2009-08-10 19:50:28 Igor CemimConsegui 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
-
|2009-08-10 21:41:47 Diogo SouzaEssa foi tranquila hein?
Atualizei o post, valeu pela contribuição. Está indo bem a app agora?
Qualquer dúvida, é só falar :)
-
|2009-08-10 23:13:48 Igor CemimAgora só falta aprender a utilizar o DataStore que
é o método que o GAE usa pra armazenar dados :P
-
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
-
|2009-08-12 11:52:31 Diogo SouzaEssa 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.
-
|2009-08-13 15:36:29 Igor CemimEnquanto 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
-
|2009-08-13 23:02:56 Diogo SouzaNos 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.
-
|2009-08-14 03:18:36 Diogo SouzaIgor, 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.
-
|2009-08-18 09:40:32 Diogo SouzaSe 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/
-
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
-
|2009-10-30 02:08:56 AnonymousOlá,
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.





