Intrepid中的php-sybase凑合能用了

以前说过Ubuntu升级到hardy之后,php-sybase没了,现在在intrepid里又有了,不过有些变化。

主要的原因好像是支持方式从以前的ctlib变成了dblib,其实是和mssql的支持作在一起了,所以现在没有了sybase_ct.so,并且如果使用了adodb(我新下载的版本是5.07),要修改drivers/adodb-sybase.inc.php的148行,把

return sybase_unbuffered_query($sql,$this->_connectionID);

替换为

return sybase_query($sql,$this->_connectionID);

因为sybase_unbuffered_query只有在使用CT library时才能用

另外一个小变化就是timestamp读出来以后的值变了,由于sybase内置的timestamp其实是varbinary类型,所以原来使用ctlib的时候读出来就是这样的:000007d001917b36,但现在变成了类似中文字符串的形式,所以也需要转换一下:

if (16 != strlen($ts))
    $ts = bin2hex($ts);

Update @ 2009-03-01

还是日期的问题,现在从数据库日期字段里取出来的数据多了个毫秒部分,比如Mar 01 2009 00:24:00:000AM,致命的是这个字符串交给strtotime()函数居然不返回值,把毫秒部分:000去掉就没事了。

忙碌的5月

2008年的5月是难以忘怀的,有人戏称是上帝的手机不小心开了震动模式了,权当是我们勇敢面对明天的一点自我安慰吧,逝者已矣。这么大的事件,我没帮上什么忙,也没帮上什么倒忙,除了捐了自己微薄的一个月工资以外,几乎什么都没有作,有些惭愧,但我也没闲着,原先考虑的.NET还是PHP?问题基本被消灭掉了,灾要救,其余的工作也要继续,不是么?

这个项目我最终选择了用PHP来作,原因不再说了,正确性让时间去证明吧。工作内容大体分两部分,一个比较简单的子系统和另外一个大一点,逻辑关系和计算规则比较复杂,专业性也较强的子系统。之所以说是子系统,这次开发的内容仍然要和原来.NET的系统一起使用,换个说法就是只升级了一部分,而原来的系统就是.NET和Java混合着用的,现在.NET、Java、PHP全到齐了:-)。

因为只是子系统开发、升级,所以用户管理、验证部分仍然使用原系统中的,省去了这部分的工作量,但需要作一些焊接的工作。

数据库方面,原系统仍然使用Sybase,新系统换到mysql库,为此专门搞了一个单向同步数据的模块,放到cron中每隔5分钟执行一次,效果还可以接受,同步过来的数据也算是对原Sybase的一个备份。不过库结构的命名是全新的,并且除字典表以外,主键全面从identity转向uuid。自定义的uuid按时间排序,还分配了可自定义部分,目前感觉使用效果应该比identity要好,还是需要时间证明了。uuid的调试是麻烦些,需要一点小技巧和烂笔头,还有phpMyAdmin这个好工具。

时间上,大概是从4月初开始的,刚开始连我4个人,其中1个PHP还没学会,另外2个是今年的应届毕业生(项目过程中,5月底左右,才完成论文答辩,领了毕业证)。我除了项目还有其它工作,刚开始帮他们起了个头,中间一直到5月中下旬才全面投入项目。PHP还没学会的这个后来主攻文档和测试、项目协调。

一开始花了大概10天的时间构建系统框架、连入adodb,smarty等类库,以及非常重要的开发规范制定。然后开始作那个比较小的子系统,一来可以不断完善系统框架,二来也算是锻炼队伍。原计划4月底完成,拖到了5月10号左右。

然后开始较复杂的子系统,由于时间太紧迫,又请了两位外援,一位是几乎全能的老手,除了专业业务不熟悉,别的前、后台都没问题,另外一位是一年经验的PHP开发者,速度虽然略慢但代码质量还可接受。

从5月15号开始,几乎是封闭式开发了,每天除了吃饭睡觉和大概一个小时的休息(乒乓球)时间,每天都工作到24点以后。原计划5月底开始测试(并非完成),跳票到了6月10号,还算是在可接受范围之内吧,只是一些非重点非必要的辅助功能都被我们留在以后作了。

项目基本上就是这些情况吧,谈几点感受:

  • 石家庄这种鬼地方,一半用户是微软的盲目崇拜者,一半用户是Java的盲目信仰者,PHP及其它开源技术的土壤简直就是盐碱地。
  • 在较成熟的PHP应用环境下,或者开发团队中有PHP熟练者的情况下,即使是.NET和Java的高手也是可以快速熟悉起来产生生产力的。
  • 不要信仰工具,不管是用什么开发工具,没有我们后来请的两位外援,再有2月也拿不出东西来。
  • 工作经验的确很重要,不仅仅是工作质量的差别,毕业生和有工作经验的人相比,工作精神、压力承受程度、解决问题的思维方式都有很大差别的。好在我们的团队成员在工作态度上还都是一流的,这一点我得感谢他们。
  • 欠缺的知识:在开发工作量测量、开发时间测量上还没有太好的方式,代码质量也没有很好的检查方法。需求表达、结构设计基本上靠文字描述和口头讲解(当然也有时间的原因),没有趁手的case工具。数据库结构设计和维护从原来的PowerDesigner又回归到了原始的sql文件+维护版sql文件,感觉用起来虽然不太方便,效率也不低,多服务器的环境下尤其好用。
  • 花一些时间搭建高仿真的测试环境很重要,我们的测试环境已经运行了3年多,系统和数据都是和生产环境一样的,对开发起到了很好的作用。
  • 拍脑门定工期的方式真的是后患无穷,但也没有更有说服力和科学依据的更好方式,头疼,系统分析这块当年没学好,就是学好了这么多年的发展也用不得了。

小结:很辛苦,但有所得,也很快乐,按照葛优的话说就是即完成了任务,又锻炼了队伍,呵呵。

与所有默默开垦盐碱地的同志们同勉,并对给予我默默支持的家人和同事致以无限感激。

Ubuntu从Gutsy升级到Hardy,php5-sybase又掉链子

升级非常简单,/etc/apt/source.list中的gutsy替换为hardy,然后aptitude updateaptitude safe-upgradeaptitude dist-upgrade,下载一大堆包安装半天就完事了,不过和以前几次升级一样,hardy中自带的php5-sybase 5.2.4-2ubuntu5.1还是不支持sybase:

[12-Jun-2008 09:13:13] PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20060613+lfs/sybase_ct.so' - /usr/lib/php5/20060613+lfs/sybase_ct.so: cannot open shared object file: No such file or directory in Unknown on line 0

没办法,再修改源,降级回Gutsy中的5.2.3:

$ sudo aptitude install php5-sybase=5.2.3-1ubuntu6.2 php5-gd=5.2.3-1ubuntu6.2 php5-mysql=5.2.3-1ubuntu6.2 php5-tidy=5.2.3-1ubuntu6.2 php5-sqlite=5.2.3-1ubuntu6.2

我试过,装上这个5.2.3的sybase,也就是sybase_ct.so,是不能配合php 5.2.4使用的,只能保持php暂时不升级。

另外,这样弄了以后,php的tidy扩展不可用了,好在tidy不是必须的。

烦人的sybase。

Update @ 2008-06-13

LG未来窗775FT显示器被正确识别成了LG 775FT,不过fluxbox中默认的高分辨率可受不了,在gdm的init中用srandr设一下分辨率,修改/etc/gdm/Init/Default,在末尾的exit 0前面加上:

xrandr -s 1024x768

Gnome、GDM的分辨率一般可以在/etc/X11/xorg.conf中调整,不过fluxbox不认,只能用xrandr。

这次换了块GeForce4 MX 440 with AGP8X显卡,安装省事多了:

sudo aptitude install nvidia-glx
sudo nvidia-xconfig

驱动启用之后的logo也有变化,原来是白底色的,现在是灰色底色,反而不如以前的好看。

由于换了内核,virtualbox也要升级,并且前提是内核的header包要安装,不然vbox模块编译失败,软件能启动虚拟机却是无法启动的:

sudo apt-get install build-essential linux-headers-`uname -r`

另外由于pulseaudio的原因,目前还是个聋子。。。不过家里电脑升级后alsa一点也不受影响,原因复杂而又未知 🙁

Update @ 2008-06-14

changelog里查到关于sybase_ct的两处变更:

-- dAniel hAhler <ubuntu@thequod.de>  Wed, 19 Dec 2007 10:48:04 +0100
php5 (5.2.4-2ubuntu1) hardy
* Fixes sybase_ct for MS SQL (LP: #21995)

Bug #21995 in php5 (Ubuntu)

-- sean finney <seanius@debian.org>  Sun, 16 Sep 2007 14:46:06 +0200
php5 (5.2.4-1) unstable
* Switch php5-sybase to use the mssql extension instead of the sybase_ct
    extension.  Closes: #418734, #329065.

(后两个bug id是debian的:#418734, #329065,参见Debian Changelog php5

为什么总要把sybase和mssql往一起扯呢,分明是不一样的东东,再往下翻,和sybase有关的改动最早也是2004、2003年的了,要不说sybase可怜呢,不冤枉。经常看看这里,看什么时候才能把sybase_ct.so加上吧。

现在弄得php怪怪的,gregarius总是没法update: Segmentation fault,可能也是和版本混合有关系;升级到最新的5.2.4-2ubuntu5.1就好了,可这时sybase_ct.so又没了。

Update @ 2008-06-15

没有声音的问题终于解决了,绕了一大圈,先调了半天pulseaudio,后来没弄好,干脆卸载了,然后发现真正的问题是没有找到声卡硬件,即使这样,pulseaudio也不再装了,看网上兼容问题挺多了,还是先用alsa,等成熟了再用pa。

没有声卡硬件的问题,我的机器是Dell GX620:

00:1e.2 Multimedia audio controller: Intel Corporation 82801G (ICH7 Family) AC'97 Audio Controller (rev 01)

先怀疑是alsa的问题,按照HdaIntelSoundHowto重新编译了alsa,未果,后来从怀疑alsa转为怀疑声卡硬件,因为lsmod里面没有任何关于snd相关的内容,进而再转为怀疑内核,终于翻到了Ubuntu 8.04下AC97声卡驱动问题的解决,安装linux-ubuntu-modules-2.6.24-19-generic,重启,然后就好啦。804看来升级跨度有点大,用的新东西有点多,以前都不用安装ubuntu-modules包的。

php5-sybase的问题提交了个bug report,看有没有人搭理。

Update @ 2008-07-28

如上,如果声音有问题出不来的话,海内扎绵羊游戏会有问题,只见羊跑见不到扎中没扎中,也不出成绩板。装好ubuntu-modules后重启马上就好了。

adodb5连接sybase的一个错误

这个错误比较蹊跷,所以拿出来说一说。环境:php 5.2.3, adodb 5.04, ubuntu 7.10 Gutsy.

前两天为了使用adodb和sqlite3,就把adodb升级成了只支持php5的adodb5(5.0.4),过两天发现另外一个使用sybase的程序不正常了,运行时不工作直接退出,没有任何错误信息,通过添加die('hi');的方式定位到错误发生在$db = &ADONewConnection('sybase');这一行。

adodb对sybase的支持一直不强,不过还没有到不工作的地步,但这个错误没有任何提示,实在是不好找,无奈之下用ZendStudio来跟踪一下,弄了一个最简单的小程序,当然,它是不工作没错误直接结束:

#! /usr/bin/php
<?php
require_once('adodb/adodb.inc.php');
$db = &ADONewConnection('sybase');
print_r($db);
$db->Connect('server3', 'sa', '', 'dbname');
$rs = $db->Execute('select 1');
print_r($rs);
?>

ZendStudio下Debug就报错了:

Compile Error: /home/fwolf/dev/include/adodb5/drivers/adodb-sybase.inc.php line 271 - Cannot make static method ADOConnection::UnixDate() non static in class ADODB_sybase

拿着错误信息上网一查,原来是在adodb-sybase.inc.php文件中,180行开始的地方定义了两个函数UnixDate()和UnixTimeStamp()(提示错误在271行,271行是类ADODB_sybase的定义结束位置,所以这个错误是在代码编译是产生的,而不是运行时),而这两个函数在adodb.inc.php中是作为static函数定义的(2481、2505行),php5不允许覆盖static函数(这个在oop中好像是叫重载,太长时间没摸书本,记不清了),所以产生编译错误,程序中止。在adodb.inc.php的4089行,包含adodb-sybase.inc.php的时候又加上了@符号:

@include_once($file);

所以错误信息被屏蔽,不显示了。ZendStudio由于Debug的原因,可能所有的错误都捕捉到了,忽略@。去掉@之后,直接运行就也可以报错了。

问题弄清楚了,如何改呢,我想大概有两种方式:

  1. 修改adodb.inc.php,不将UnixDate()函数定义为static。
  2. 修改adodb-sybase.inc.php,取消两个函数的重复定义。

相比之下,觉得第一种方法更好一些,第二种方法可能会引发其它的错误。所以改下来一共是去掉四个static:

Line 2481: ADOConnection::UnixDate()
Line 2505: ADOConnection::UnixTimeStamp()
Line 3204: ADORecordSet::UnixDate()
Line 3215: ADORecordSet::UnixTimeStamp()

简单测试了一下,基本工作正常。

参考

PS: ZendStudio使用单独的一套php.ini,放在/path/to/ZendStudio-5.5.0/bin/php5目录下,我总是忘记,每次include path不对劲的时候都要找半天。