Archive for the ‘ GAE ’ Category

在Google GAE上通过JAVA运行PHP程序

一年前google推出了Google App Engine。提供了足够我们普通用户使用的空间和流量,而且还可以通过付费获得更多的空间和流量。其余的不多说了,现在许多关于GAE的介绍。

现在GAE已经至此java了,但不幸的是PHP任然毫无音讯。但是我们在google官方支持PHP之前我们可以使用基于java的QuercusQuercus基本上可以100%的支持PHP语言(需要JDK1.5)。

现在我们开始用GAE运行PHP:

1) 注册一个免费的GAE帐户 。
2) 下载此文件到您的计算机(如果连接失效大家可以搜索phpwithgae便可以下载到它,如还不行就给我留言吧。)。
3) 修改warWEB-INFappengine-web.xml ,将phpwithgae换成你自己的GAE名字。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>phpwithjava</application>
    <version>1</version>
    <!– Configure java.util.logging –>
    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>
    <!– For PHP-Support –>
    <static-files>
        <exclude path="/*.php" />
    </static-files>
    <resource-files>
        <include path="/**.php" />
    </resource-files>
</appengine-web-app>

4) 最后上传您的程序 。(下载谷歌appengine SDK for Java ,并使用下面的命令 。
appcfg.cmd update C:projectsphpwithjavawar)

To see this in action just visit:看到这一行动只需访问:
http://phpwithjava.appspot.com/webdigi.php and http://phpwithjava.appspot.com/info.php http://phpwithjava.appspot.com/webdigi.phphttp://phpwithjava.appspot.com/info.php

我将继续翻译一些关于GAE和PHP的文章,前面大家已经看到了wordpress在gae上的运行效果了,但是那个mysql问题没有得到很好的解决,下面我们将看看如何在GAE上安装一个类似MYsql的应用,并且可以远程调用数据库

转载请注明 www.fly7.cn

将quercus应用在Google App Engine上(wordpress on GAE)

自从GAE支持java以来,一些其他语言就可以通过java来间接实现了。其中PHP语言就是其中的重中之重,通过quercus,我们可以在GAE上运行100%的php程序。

PHP是网页语言中应用比较广泛的,比如著名的wordpress,而且他们是免费的且随时在更新。现在很多人都在呼吁要GAE支持php。

不幸的是,GAE不支持MYsql,以及其他关系数据库,我们限制于Google Datastore,所以现在大多数PHP程序都不能运行在GAE上面,因为他们大多要基于LAMP框架(注:Liunx+Apache+Mysql+PHP)

但是修改现有的PHP程序让他们能够在GAE上运行有多难呢?我通过让WordPress在GAE上深入研究了这个有趣的问题。目前,wordpress已经可以运行在Quercus上面了,我所需要做的就是用GAE的JPA来转换Mysql查询。最后,花了大概一个星期,终于可以看到现在这个在GAE上运行的Demo了。

quercus-gae-stack

 

转换wordpress的数据库查询

我要做的第一步是转移数据库到JPA。要做到这一点,我为每一个数据表建立了一个JPA类(class),数据表到JPA的关系是非常简单的。JPA的数据类型及名称完全是和Mysql相同的。每个字段也是这样。例如,wo_user表就要转换成下面的JPA类:

package com.caucho.gae.wordpress271;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
/*
CREATE TABLE `wp_users` (
`ID` bigint(20) unsigned NOT NULL auto_increment,
`user_login` varchar(60) NOT NULL default ”,
`user_pass` varchar(64) NOT NULL default ”,
`user_nicename` varchar(50) NOT NULL default ”,
`user_email` varchar(100) NOT NULL default ”,
`user_url` varchar(100) NOT NULL default ”,
`user_registered` datetime NOT NULL default ‘0000-00-00 00:00:00′,
`user_activation_key` varchar(60) NOT NULL default ”,
`user_status` int(11) NOT NULL default ‘0′,
`display_name` varchar(250) NOT NULL default ”,
PRIMARY KEY (`ID`),
KEY `user_login_key` (`user_login`),
KEY `user_nicename` (`user_nicename`)
);
*/

@Entity
public class User
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long _ID;
private String _userLogin;
private String _userPass;
private String _userNicename;
private String _userEmail;
private String _userUrl;
private String _userRegistered;
private String _userActivationKey;
private Long _userStatus;
private String _displayName;
}

Varchar和int类型分别匹配的是JAva的string和long类型。我可以用JAVA的日期和时间数据类型,但是这还没有结束,因为在wordpress的所有日期/时间不是这样的(翻译水平有限,这句话没明白,但该是对于日期时间数据类型的转换不是直接可以完成的,详见原文“I could have used Java Date for datetime but didn’t in the end because WordPress does all the date/time processing on its end on strings anyway”),简单起见,我省略了Java的Getters和setters。

然后我创建了一个script来创建JPA重的每一个表。

下一步,也是最后一步是转换MYsql的查询为JPA查询。这是最好时间的一步了,因为wordpress没有把数据库操作的代码封装在一个文件(意译哈,不要骂我哦,呵呵),换句话说就是程序直接是用的MYsql语言查询(所有代码都有select之类的语句,没有写一个数据库操作的类,不知道是不是这样哈,错了请指正,谢谢)。我的工作是容易一些的是JPA的查询使用几乎相同的语法SQL查询。看看下面检索的评论一个特定帖子的代码:

function get_comments($post_id)
{
//SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = ‘1′ ORDER BY comment_date
$query = $this->pm->createQuery(”SELECT FROM ” . GAE_COMMENT_CLASS . ‘ WHERE _commentPostID = :id AND _commentApproved = “1″ ORDER BY _commentDate’);
$query->setParameter(”id”, $post_id);

$results = $query->getResultList();
$array = array();

foreach ($results as $comment) {
$obj = new stdClass();

$obj->comment_ID = $comment->getCommentID();
$obj->comment_post_ID = $comment->getCommentPostID();
$obj->comment_author = $comment->getCommentAuthor();
$obj->comment_author_email = $comment->getCommentAuthorEmail();
$obj->comment_author_url = $comment->getCommentAuthorUrl();
$obj->comment_author_IP = $comment->getCommentAuthorIP();
$obj->comment_date = $comment->getCommentDate();
$obj->comment_date_gmt = $comment->getCommentDateGmt();
$obj->comment_content = $comment->getCommentContent();
$obj->comment_karma = $comment->getCommentKarma();
$obj->comment_approved = $comment->getCommentApproved();
$obj->comment_agent = $comment->getCommentAgent();
$obj->comment_type = $comment->getCommentType();
$obj->comment_parent = $comment->getCommentParent();
$obj->user_id = $comment->getUserId();

$array[] = $obj;
}

return $array;
}

正如你所看到的,这是一个一对一转换为特定的查询。最关键的部分是确保返回wordpress期望的正确返回类型。在这个情况下我需要返回一个数组对象。

wordpress大量使用了更复杂的查询,比如joins,这些GAE现在都还没有支持(目前为止)但是对于我来说,很容易通过嵌套或者多次JPA查询仿制一个类似的功能。Joins are evil according to Google so I do not want to bore you with the details.(不明白这一句,但是好象是说这个功能是被google限制的,所以最好不要在Google上使用~?)

大概重写了大概50个查询,现在的Wordpress运行令人满意,我可以创建修改评论和文章(虽然我不能保证出现意外)。现在这个demo运行在GAE上面:http://wordpress-on-quercus.appspot.com/wordpress-2.7.1/以及http://java.fly7.cn源代码here!!

总之这是一个有趣的学习GAE的经验。我不敢说这是非常适合Google数据库JPA的,但作为一个演示目的,展示无缝集成PHP和JAVA。

未来,我们可以让现在的PHP程序完美的运行在GAE上面,我们已经有了文件为基础的关系数据库用于我们的缓存和记录。我们可以用JNDI数据库代替MYSQL数据库查询。虽然GAE不允许文件写入,但我们可以在数据库中存放文件,这样,我们就可以在安装有Quercus的GAE中运行任何基于LAMP的应用程序了。那一切将非常cool~~

翻译原文:http://blog.caucho.com/?p=196

这里个上几个链接:

http://blog.herbert.groot.jebbink.nl/2009/05/rom-relational-object-mapping.html

http://www.caucho.com/resin/doc/quercus.xtp#datasource

 

这个的安装方法我就不多说了,大家先安装JavawithPhp这个东西在你的GAE账户上,然后把上面说的那个war包替换到到javawithphp的那个war文件夹,顺便说一下作者给的那个war目录下需要改两个地方insert.php打开,大家可以适当改一下,然后就是warWEB-INFappengine-web.xml这个文件把你的Gae名字替换掉


http://appengine.google.com/ns/1.0″>
   shenmao1989
   3
  
    
  
  
    
  

转载请注明来源:www.fly7.cn

WordPress 2.7.1 on Quercus

在GAE的code上看到了一个用GAEjava做的WP,好激动,正在研究,稍后翻译给大家看看

Quercus是Caucho公司采用纯Java开发的一个PHP5引擎。基于开源授权协议GPL发布。Quercus自带很多个PHP模块和扩展如PDF,PDO,MySQL和JSON。可以利用这个引擎在一些JavaEE应用容器(Resin,GlassFish等)中运行PHP程序,也可以在PHP脚本中调用一些Java服务如JMS。Quercus会预先把PHP文件编译成.java文件,然后再执行。

image

http://appgallery.appspot.com/about_app?app_id=agphcHBnYWxsZXJ5chQLEgxBcHBsaWNhdGlvbnMYzegKDA