Pages

Thursday, 30 January 2014

将现有PHP程序移植到GoogleAppEngine上的一种思路

试图作过将Wordpress等PHP程序运行在AppEngine上的人应该都清楚,有两大困难(数据库访问和写文件)导致你们最终放弃。
    网路上已经有不少将PHP运行在AppEngine上的方案,但这些方案基本上都有一个通病,需要修改原PHP程序的代码,并且还不是修改一点半点,需要修改的地方多到我们足以放弃。
    我的方案是:
        1)   针对数据库访问,写一个JDBC驱动(底层访问的是AppEngine的数据库),并且把它用来冒充  MySQL 的JDBC驱动。
        2)   针对写文件的问题,  我考虑重写 PHP的文件读写部分,当需要写文件时,就将文件内容转存到数据库中。


   换句话说就是从底层着手,就不需要修改PHP源程序了。
    我已经完成了大部分代码,如果有空闲时间的话,估计还需要两个礼拜就可以完工了。 我将在GoogleAppEngine上移植运行的第一个PHP程序将会是: DedeCMS(一个开源的PHP程序).
    我们都知道,AppEngine在可预想的将来还不会提供PHP支持。所以,在AppEngine上运行PHP程序还离不开 Quercus。 我目前用到的版本是: quercus-4.0.3。  Quercus 是一个开源 PHP 5 引擎,它已经拥有了纯 Java 的完整实现
    所以从底层解决前面提到的两个问题,就是在 Quercus  源码基础上解决。
一)对于数据库访问:(不需要修改Quercus源码)
    如果是在tomcat 或 Resin 上运行 PHP程序,我们只需要 加入 MySql的标准JDBC驱动然后按文档配置好就可以了。但我的目标是运行在AppEngine上,所以我也要实现一个JDBC驱动。 要冒充MySQL的JDBC驱动,我们只需要将这个JDBC驱动的 Driver 命名为: com.mysql.jdbc.Driver 就可以了。(如果有更好的方法不妨告知我,谢谢)
二)对于文件读写:(需要修改Quercus源码)
    找到 Quercus源码中的 com.caucho.quercus.lib.file.FileModule  特别是修改 写文件的部分。
三) 最后将 JDBC编译成一个jar包:sqlgae.jar, 重新编译Quercus源码生成一个jar包:resin.jar
    在对应需要移植的PHP程序项目中,添加AppEngine+Quercus支持。 用 JDO方式完成PHP程序项目涉及的表结构,其实就是 用JDO实现的持久对象。至于PHP程序源码我们只需要复制过来,不做任何修改。
    这样我们就可以在GoogleAppEngine上随时使用最新版本的 PHP杀手级应用程序。  是不是很诱人?
    这里工作量比较大的地方就是 实现这个JDBC驱动, 这里需要对 标准SQL语法进行解析 ,然后调用 JDO API进行数据库访问。
虚拟文件系统: http://code.google.com/p/gaevfs/
数据库驱动JIQL: http://www.jiql.org/