svn管理数据丢失问题的解决办法

在SAE上使用SpeedPHP开发时,由于部署本地开发环境时删除重建了SpeedPHP目录,导致在commit时出现了如下错误:

svn: 包含工作副本管理数据的目录“/path/to/SpeedPHP/.svn”丢失了

这个问题在网上搜索一下发现很常见,但是解决方法都不是非常明确。

其实可以很简单地解决这个问题:

$ move SpeedPHP /path/to/temp
$ svn remove SpeedPHP
$ mv /path/to/temp/SpeedPHP .
$ svn add SpeedPHP

也就是先在SVN中删除这个目录,然后重新添加这个目录。这个时候再commit就不会出错了。

SAE的求助支出

今天在浏览“账户 -> 云豆记录 -> 支出”时,偶然发现“求助支出”每次需要30颗云豆。

云豆是要花钱买的!通过这种方式,SAE能够有效控制问题的数量和质量,管理员回答问题所创造的价值也有了一种量化的衡量方式。

SAE的求助支出,很好很强大!

SAE上的SOAP客户端——SaeSoap开发手记

前言
=========

Sina App Engine(SAE)到目前为止还不支持SOAP,但是询问的人不少,我也是一个。对于这些提问,新浪管理员都做了认真回复,给出了解决思路,并且希望有用户能够自己去实现。

SAE文档中心关于SOAP的问题:
http://sae.sina.com.cn/?keyword=SOAP&m=search

为了响应伟大的SAE的号召,为了满足项目的小小需要,SaeSoap诞生了!

基本信息
============

应用名称:
PHP SOAP for ASE

访问方式:
http://saesoap.sinaapp.com/

应用说明:
让SAE原生支持PHP SOAP!

开发环境
============

SAE应用管理 -> 应用管理 -> 代码管理:创建版本1

$ sudo aptitude install php-pear

$ cd /path/to/sae/
$ svn checkout https://svn.sinaapp.com/saesoap/
$ cd saesoap/1

拷贝 pear SOAP, HTTP_Request, Net_Socket, Net_URL,注意目录和文件的权限都必须是755。

$ ln -s /path/to/sae/saesoap/1 /var/www/saesoap

测试代码
============

问题和解决方法
—————–

$ gvim /path/to/sae/saesoap/1/index.php
<?php
require ‘SOAP/Client.php’;
$uri = ‘http://www.5haoxue.net/ws/hello-soap.php’;
$client = new SOAP_Client($uri);
$result = $client->call(‘fetch_news’, array());
echo $result;
?>
$ lynx http://localhost/saesoap/

出现了“No Transport for http”错误。这个错误提示是在Transport.php中定义的SOAP_Transport类的getTransport方法中输出的。出错的原因是没有复制SOAP/Transport/目录,在这个目录下有HTTP.php。补上以后测试成功!

在SAE上测试
—————-

$ svn status
$ svn add HTTP/ SOAP/ Net/
$ svn commit -m ‘Test pear SOAP client’
$ lynx http://saesoap.sinaapp.com/

发现SAE不支持PEAR:

SAE_Warning: require_once(PEAR.php) [function.require-once]: failed to open stream: No such file or directory in SOAP/Base.php on line 30
SAE_Fatal_error: require_once() [function.require]: Failed opening required ‘PEAR.php’ (include_path=’.:/usr/local/sae/php/lib/php/sae_std_lib/’) in SOAP/Base.php on line 30

管理员说是出于安全性考虑:
http://sae.sina.com.cn/?m=feedback&a=view&id=3262
建议手动安装PEAR,并给出了教程的链接:
http://hi.baidu.com/mleoking/blog/item/ebe307ca55146d43f21fe792.html

直接拷贝PER文件:
$ sudo updatedb
$ locate PEAR.php
$ cp /usr/share/php/PEAR.php /path/to/sae/saesoap/1
$ svn add PEAR.php
$ svn commit -m ‘Add PEAR.php’
$ lynx http://saesoap.sinaapp.com/

出现了一些警告信息,但是数据读出来了!警告信息如下:

SAE_Warning: include_once(PEAR5.php) [function.include-once]: failed to open stream: No such file or directory in PEAR.php on line 730
SAE_Warning: include_once() [function.include]: Failed opening ‘PEAR5.php’ for inclusion (include_path=’.:/usr/local/sae/php/lib/php/sae_std_lib/’) in PEAR.php on line 730

继续拷贝PEAR5.php文件:
$ locate PEAR5.php
$ cp /usr/share/php/PEAR5.php /path/to/sae/saesoap/1
$ svn add PEAR5.php
$ svn commit -m ‘Add PEAR5.php’

现在没有错误也没有警告了,只剩下一堆SAE_Deprecated和数据了:

SAE_Deprecated: Assigning the return value of new by reference is deprecated in SOAP/WSDL.php on line 214

SAE_Deprecated: Function split() is deprecated in SOAP/Transport/HTTP.php on line 272

现在可以把代码迁移到好学网手机版中去了!

小结
=========

SaeSoap目前实现了在SAE上使用SOAP Client,实现的方式是使用了PEAR SOAP,并不需要对代码进行修改。

SAE上的SOAP Server,目前项目还没有需求,因此暂时也没有时间去实现,希望能有朋友能够抽时间来完成!

SaeSoap Demo:
http://saesoap.sinaapp.com/

基于SpeedPHP和SaeSoap实现的手机版网站:
http://m.5haoxue.net/

Memcache和SAE云豆的消耗

新浪App Engine(SAE)是目前国内最成熟、使用最广泛的云计算服务之一。云服务的重要特性就是可伸缩的资源分配,以及按实际使用情况收费的模式。SAE的计费单位是云豆,目前1元人民币可以购买100颗云豆。

SpeedPHP是一个轻量级的PHP开发框架,具有学习快、开发快、速度快的特点。SpeedPHP原生支持SAE。

SpeedPHP内置了对Smarty模板的支持。如果要在SAE上使用Smarty模板,就必须打开Memcache。在SAE上初始化Memcache时必须设置容量,可选择的范围为1~256M。这个选择就是本文讨论的问题。目前1GB Memcache每天要消耗200云豆,如果你把Memcache设置为100M,那么即便你什么也不干,每天也会消耗大约20云豆,如果设置为200M就会消耗大约40云豆。这个是固定成本!

因此,在开发和测试阶段,Memcache的容量不要设置得太大,甚至设置为1M就可以了!

绿色SAE之旅,从合理设置Memcache容量开始:-)

SpeedPHP for SAE本地开发环境配置详细教程

开发环境的搭建
===================

:注: 操作系统为Ubuntu 11.10,已经安装好Apache2、PHP5和MySQL5

输出PHP错误信息
——————–

$ cd /etc/php5/apache2
$ sudo vim php.ini
display_errors = on
$ sudo /etc/init.d/apache2 restart

获取应用代码
—————–

在SAE“应用管理->代码管理”中创建1个版本。

$ cd /path/to/sae
$ svn checkout https://svn.sinaapp.com/5haoxue/
$ cd 5haoxue/1
$ ls
config.yaml index.php

部署SpeedPHP框架源代码
—————————

$ cd /path/to/sae/5haoxue/1
$ cp -r /path/to/speedphp-3.1.89-sae/* .
$ ls
controller index.php model SpeedPHP
$ chmod -R 755 SpeedPHP # 避免出现白屏(500 Internal Server Error)
$ chmod -R 755 controller # 避免出现路由错误(SpeedPHP无法访问controller目录)
$ mkdir tpl # 模板文件目录
$ mkdir tmp # 临时文件目录
$ chmod -R 777 tmp # 避免出现白屏(500 Internal Server Error)
$ ls
config.yaml controller index.php SpeedPHP tmp tpl

建立本地开发环境
———————

$ mkdir /var/www/5haoxue
$ cp -r /path/to/speedphp-3.1.89/* /var/www/5haoxue # 本地不使用SAE版
# 本地和SAE上的代码,只有controller目录和tpl目录的内容是相同的
$ rm -rf /var/www/5haoxue/controller
$ rm -rf /var/www/5haoxue/tpl
$ ln -s /path/to/sae/5haoxue/1/controller /var/www/5haoxue/controller
$ ln -s /path/to/sae/5haoxue/1/tpl /var/www/5haoxue/tpl
$ cd /var/www/5haoxue
$ mkdir tmp
$ ls
controller index.php SpeedPHP tmp tpl
$ lynx http://localhost/5haoxue/
Enjoy, Speed of PHP!

打开SAE上的Memcache支持
—————————-

在SAE“服务管理->Memcache”中初始化MC,容量设置为100M。

这样SAE上的SpeedPHP就已经支持Smarty了。

打开本地的Smarty支持
————————

$ cd /var/www/5haoxue
$ gvim index.php &
在$spConfig中加入:
‘auto_display’ => TRUE,
$ gvim controller/main.php &
在main中加入:
function hello() {
$this->name = ‘chinakr’;
$this->display(‘hello.html’);
}
$ gvim tpl/hello.html &
Welcome to SpeedPHP, {$name}!

测试Smarty是否能够正常使用
——————————-

$ lynx http://localhost/5haoxue/index.php?c=main&a=hello
Welcome to SpeedPHP, chinakr!

$ cd /path/to/sae/5haoxue
$ svn status
$ svn add controller/ model/ SpeedPHP/ tmp/ tpl/
$ svn commit -m ‘SpeedPHP with Smarty’
$ lynx http://5haoxue.sinaapp.com/index.php?c=main&a=hello
Welcome to SpeedPHP, chinakr!

使用Subversion和Mercurial同时管理代码的注意事项

最近在SAE Python上做开发,SAE Python目前还只支持Subversion(svn)版本控制,而我常用的是Mercurial(hg)。两者的最大差别是:svn是集控式的版本控制,hg是分布式的版本控制。hg至少有两个好处,一个是命令更简洁,可以使用hg addremove这样的命令;另一个是速度快,不需要和服务器同步,对于网络较慢的环境尤其重要。

于是,同时用Subversion和Mercurial管理代码就成为了理所当然的选择。

一开始想到使用Mercurial插件来实现Subversion的功能,简单查了一下文档,似乎使用起来不那么方便。

后来在豆瓣发帖询问官方能否增加Mercurial支持,网友benmao给出了提示,也就是使用hg archive:
http://www.douban.com/group/topic/23770733/

具体的操作如下:

$ cd local # local为使用hg管理的目录
$ cp -rf ../1/* . # 1为使用svn管理的目录
$ gvim .hgignore & # 设置忽略.svn目录
$ find . -name “.svn” -exec rm -rf {} \; # 删除各个目录下的.svn目录
$ hg addremove # 更新版本库
$ hg commit -m ‘Revision changelog’
$ hg archive ../1
$ cd ../1
$ svn status
$ svn commit -m ‘Rvision changelog’

在hg版本库中删除并忽略.svn目录是很重要的,否则在进行hg archive时会出现类似下面的提示:
中止: Permission denied: ~/src/sae_python/1/static/img/.svn/.entries-7VTD4F
也就是说.svn目录的权限和其它文件是不同的,不忽略的话会带来权限设置方面的额外工作,并且毫无意义。

我的.hgignore文件的内容如下:
~$
.swp$
.bak$
.pyc$
.svn

谨以此文献给在SAE上奋斗的所有Pythoner!