搭建GAE PHP Runtime环境的经验 与 问题解决(PIL, HTTP500, GAE_INCLUDE_REQUIRE_GS_STREAMS)

迫于GFW的淫威,很久没有跟进GAE的更新了,最近偶然发现GAE开始支持PHP,之前的愿望终于被Google实现,知识库又需要尽快更新了。当然,旧有的愿望被实现了,还要有新的追求,那就是Node.js,Google,哥等你。
虽然Java相较于PHP可以实现出很强大的功能,但毕竟作为脚本语言的PHP,其灵活性、便捷性仍然在散发着耀眼的光芒,所以GAE.PHP也必须拿下。
阅读全文 “搭建GAE PHP Runtime环境的经验 与 问题解决(PIL, HTTP500, GAE_INCLUDE_REQUIRE_GS_STREAMS)”

介绍几个你一定要知道的GAE基本服务

FetchUrl
由于Google重写了 java.net.URLConnection,所以对于Fetch Url操作不用显式的调用GAE的URLFetchService。需要说明的是,在使用GAE的fetch url时,发起请求的IP是不固定的,即你连续访问一个url时,这个url的host会拿到不同的client IP,当然有时也能碰到一样的,在某些场景下这非常有用。此外,当GAE发出HTTP请求时,会在Header的Agent字串里添加GAE的特征串,似乎这是不能避免的,有些另类网站会用Agent串与密码一同加密作为自动登录信息,此时就要小心了。 阅读全文 “介绍几个你一定要知道的GAE基本服务”

GAE中的主要概念

请求时长(Request Timer)
Request请求需要限制在30秒内完成,否则将会触发com.google.apphosting.api.DeadlineExceededException异常,如果servlet没有处理该异常,浏览器将会看见HTTP 500错误。当该异常被触发时,运行环境会留出小于1秒的时间让你自行处理。

沙箱的限制(Sandbox)
不允许向文件系统写入;只能通过http/https与远程服务器建立网络连接;不允许创建线程;不允许进行进行其他类型的系统调用;只能使用白名单中的Java库。

定期维护(Scheduled Maintenance)
在定期维护时,数据库文件处于只读状态,此时任何写入操作将会引发com.google.apphosting.api.ApiProxy.CapabilityDisabledException异常,此时Session操作也自然会被牵连。同时缓存(Memcache)也无法正常使用,所以在操作Memcache时需要捕获com.google.appengine.api.memcache.MemcacheServiceException异常。

实验
修改代码编译后,可能无法体现新的修改,尽管war目录的内容都是新的,此时可以通过修改appengine-web.xml中的version来解决问题,不过从1.3.6以后就没有遇到过这样的问题了。
WEB-INF目录中的appengine-web.xml和web.xml均是部署必需的,其中appengine-web.xml配置了你的AppSpot站点信息,非常重要。
编译环境中不要引用Tomcat的lib,因为GAE复写了一些javax的API,可能会因冲突造成未知的结果。