teamol=WebCollab

Team Online 项目管理系统

如果你曾经在国内某个php源码下载网站下载过一个叫teamol的团队任务分配软件,不知你有没有注意到,它和国外开源项目WebCollab之间似乎有着亲密的联系。

本来我也没注意,可这个teamol下载回来以后安装颇不顺利,文档TeamOL setup.doc和安装界面有不一样的地方,虽然国内开源项目用doc写文档不算奇怪,但这个文档内容也太少了。代码注释中有个“官方网站”http://www.inodea.cn是打不开的,代码中很多地方标的版本号是0.1,可下载时我记得说的出3.0或者3.2版本。

开始安装以后有个地方卡壳了,还没安装数据库,就要从数据库里信息来验证用户是否有权限安装。hack安装之后,path配置也有问题,模板中还有一些错误,比如明明这段函数内没有$title这个变量却多次使用,要知道即使是global $title也是没有值的。

反正歪歪扭扭总算把程序配置得能运转了,开始试试,功能倒还有点让我满意的意思,除了日期选择的弹出窗口我极其不喜欢。然后我就发现了一件让我大跌眼镜的事情,这么一个错误百出或者说有点像半成品的“国产开源”作品,居然不仅有英、中文支持,还有一个看似排版比较成熟的英文帮助页面:

webcollab-help

好奇的我挑了帮助页面中的一句话上G一搜,便找到了WebCollab。仔细比较下来,两者的目录结构也几乎一样:

dir structure of teamol and webcollab

结果应该不用我说了,也或许teamol的作者原想只是以webcollab为蓝本边学习边制作一个全新的系统吧,从注释中的版本0.1和修改过使用frame的页面框架中能够看出作者还是付出了些劳动的。

回到主题,用于小组内工作任务分配跟踪,倒是可以试试WebCollab,界面是简陋了点,基本的内容算是都有了。但这类软件,至今没找到一个特别好用的,包括很多在线的GTD或者项目管理系统。

WebCollab login

用php_screw加密PHP代码

开始之前,首先要澄清两个问题:第一,支持开源,不等于反对代码加密;第二,如果把不属于自己的东西(比如公司的)拿去开源,就更加不应该了。

以前知道的,PHP代码的加密都是用Zend的encoder,这东西不但是商业软件,好像还暴出过能够被破解的问题,所以就找到了替代的方案────php_screw,一个日本人开发的东东。

php_screw非常小巧,没有仔细看过它的算法,但从说明文档中看,可以自行更改SEED,然后自行编译so和可执行档。如果够牛的话,甚至可以自己去更改算法。不管怎样,对于我们这些“普通人”来说,这种加密应该就够了吧,如果真想滴水不漏,那还是不要公开的好,虽然作者说的并不是很容易就破解,但指不定哪儿有牛群呢不是么?

安装的环境需要:PHP5.x,zlib开启,autoconf,automake已安装。

测试环境:Ubuntu 8.04 hardy, PHP 5.2.3。

1、 解压,更改my_screw.h,里面的几个数字就是SEED,相当于密码,可以随意更改、增加,并且数字的多少不影响解密的速度。

2、编译so文件:

$ phpize
$ ./configure
$ make

如果出现这样的错误,那是因为autoconf没有安装:

$ make
make: *** No targets specified and no makefile found.  Stop.

3、安装so文件,编译好的文件在modules目录下,将其拷贝到php extension存放的位置,比如/usr/lib/php5/20060613+lfs下,然后在php.ini中增加:

extension = php_screw.so

4、编译用来加密文件的可执行文件:

$ cd tools
$ make

tools目录下新生成的screw就是了,放到$PATH中就可以调用了,比如要加密一个文件:

$ screw a.php
Success Crypting(a.php)

加密后的a.php执行正常,同时screw还会把原来没有加密的文件改名为.screw文件作为备份。

Update @ 2008-09-01

加密之后,还有个小问题,用require或include引用放在include_path下的加密代码时,会当做明文引过来,解决方法有两种:

  1. 使用绝对路径引用放在include_path下的加密内容,如果是自己的主机,肯定没问题的;
  2. 使用相对路径来引用,比如在本项目的子目录内,这样也是没问题的。

由一个错误学到的一些php安全配置问题

错误

在MediaTemple主机从(dv)3.0升级到3.5之后,我遇到的第一个问题就是一个莫名奇妙的php错误:

[Sat Jul 12 04:51:27 2008] [error] [client 121.42.26.81] PHP Warning:  require_once(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: Operation not permitted in /var/www/vhosts/fwolf.com/httpdocs/info.php on line 4
[Sat Jul 12 04:51:27 2008] [error] [client 121.42.26.81] PHP Fatal error:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php' (include_path='.:/var/www/vhosts/fwolf.com/include') in /var/www/vhosts/fwolf.com/httpdocs/info.php on line 4

因为是migration过来的,所以require的这个文件肯定存在,并且apache用户也的确有权访问,那问题出在哪里呢?

如果换一种方式,require直接使用文件的全路径,错误信息就更清楚了:

<b>Warning</b>:  require_once() [<a href='function.require-once'>function.require-once</a>]: open_basedir restriction in effect. File(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) is not within the allowed path(s): (/var/www/vhosts/fwolf.com/httpdocs:/tmp) in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />
<br />
<b>Warning</b>:  require_once(/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: Operation not permitted in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />

<br />
<b>Fatal error</b>:  require_once() [<a href='function.require'>function.require</a>]: Failed opening required '/var/www/vhosts/fwolf.com/include/fwolflib/func/config.php' (include_path='.:/var/www/vhosts/fwolf.com/include') in <b>/var/www/vhosts/fwolf.com/httpdocs/info.php</b> on line <b>4</b><br />

原来是有个open_basedir限制,找了一下是在$HOME/conf/httpd.include里,这个文件是由plesk自动维护的:

<IfModule sapi_apache2.c>
    php_admin_flag engine on
    php_admin_flag safe_mode off
    php_admin_value open_basedir "/var/www/vhosts/fwolf.com/httpdocs:/tmp"
</IfModule>
<IfModule mod_php5.c>
    php_admin_flag engine on
    php_admin_flag safe_mode off
    php_admin_value open_basedir "/var/www/vhosts/fwolf.com/httpdocs:/tmp"
</IfModule>

看到没,只允许包含httpdocs下的文件。open_basedir影响的范围是fopen, require, include之类的函数,在一定程度上加强了安全防护。

问题

但open_basedir也有局限性,它不会影响那些执行系统命令的函数,比如exec, system,如果我想偷主机上另外一位同学的文件(内容),也不见得非要去用require包含过来或者种个hack过去,直接system('cat /path/to/file')不是更省事么?

system函数有时候还是能派上正当用场的,直接禁用不是什么好办法,现在流行chroot,就是用户的/就是自己的$HOME,压根儿就访问不到别人的文件,什么open_basedir, exec, dl都不用禁用,我觉得这才是安全和方便的最佳接合点。

以前用(dv)3.0的时候,手工配置使用fastcgi的php5就是这样,每个用户的cgi用自己的身份,在自己的chroot环境下运行。

不过plesk现在的版本8、将来的版本9都没有要直接使用fastcgi解析php的打算,在“更远的计划里”,才可怜兮兮的有这么一句:

Use PHP via FastCGI rather than Apache module

参见:Parallels Summit 2008 – Day 1,所以就只能自己动手了。

fastcgi

很走运,找到了一个2天前刚刚出炉的脚本:Script for using php-cgi instead of mod_php,专门针对plesk,禁用掉mod_php,然后用它来配置fcgi解析。

使用环境:Plesk 8.X on Centos 5.X,依赖:

  • 禁用mod_php,开启mod_fcgid
  • python-curl, PyXML
  • php开启–enable-fastcgi, –enable-force-cgi-redirect

文件需要解压到/root/bin/下,自己一个子目录,幸好我也是用这个bin目录的。

然后在Server -> Control Panel -> Event Manager里添加自定义事件,在增加、修改、删除domain的时候,自动调用这个脚本。(subdomain的删除没有包含,手工删除文件就可以了)设置好大概就是这个样子:

using php-cgi instead of mod_php, plesk event manager

还要把/etc/httpd/conf.d/php.conf删得只剩一行:

LoadModule php5_module modules/libphp5.so

并且在/etc/httpd/conf.d/fcgid.conf里加一句:

PHP_Fix_Pathinfo_Enable 1

不过,这种方法作到一半我就没有继续了,因为我想起来前几天一位朋友和我提到过的suPHP。

suPHP

个人感觉suPHP是最“正统”的解决方案,它是以文件属主用户的身份来运行,正好使用各个用户的权限实现访问限制。

没找到centos的mod_suphp包,只好下载suphp 0.6.3源码自己编译,不过之前要先修改src/apache2/mod_suphp.c,在324行替换掉两行内容:

//AP_INIT_ITERATE("suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL, ACCESS_CONF, "Tells mod_suphp to handle these MIME-types"),
AP_INIT_ITERATE("suPHP_AddHandler", suphp_handle_cmd_add_handler, NULL, RSRC_CONF | ACCESS_CONF, "Tells mod_suphp to handle these MIME-types"),
//AP_INIT_ITERATE("suPHP_RemoveHandler", suphp_handle_cmd_remove_handler, NULL, ACCESS_CONF, "Tells mod_suphp not to handle these MIME-types"),
AP_INIT_ITERATE("suPHP_RemoveHandler", suphp_handle_cmd_remove_handler, NULL, RSRC_CONF | ACCESS_CONF, "Tells mod_suphp not to handle these MIME-types"),

然后就是编译安装那三板斧:

# ./configure\
--with-apxs=/usr/sbin/apxs\
--with-php=/usr/bin/php-cgi\
--with-logfile=/var/log/suphp.log\
--with-min-uid=10000\
--with-min-gid=10000\
--with-apache-user=apache\
--with-apr=/usr/bin/apr-1-config\
--with-setid-mode=owner\
--prefix=/usr\
--sysconfdir=/etc
# make
# make install

/etc/httpd/conf/httpd.conf中加入一句(这一句也可以放到后面的suphp.conf中):

LoadModule suphp_module modules/mod_suphp.so

关闭safe_mode,并且注释掉下面两句:

safe_mode = Off
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps

创建suphp的conf文件,使用源码中的conf文件模板:

# cp doc/suphp.conf-example /etc/httpd/conf.d/suphp.conf

修改之:

<Directory /var/www/vhosts>
    RemoveHandler x-httpd-php
#   php_admin_value engine off
    AddHandler x-httpd-php .php .php3 .php4 .php5
    suPHP_AddHandler x-httpd-php
    suPHP_Engine On
    suPHP_ConfigPath /etc/php.ini
</Directory>

禁用mod_php,把php.conf文件换一个扩展名就行了:

# cd /etc/httpd/conf.d
# mv php.conf php.conf.bak

创建suPHP的配置文件/etc/suphp.conf,这个文件和用于apache配置的conf是不一样的,其内容如下,可根据具体环境设定参数:

[global]
;Path to logfile
logfile=/var/log/suphp.log

;Loglevel
;loglevel=info
;info, warn, error
loglevel=warn

;User Apache is running as
;webserver_user=wwwrun
webserver_user=apache

;Path all scripts have to be in
docroot=/var/www/vhosts/

;Path to chroot() to before executing script
;chroot=/mychroot

; Security options
;allow_file_group_writeable=false
allow_file_group_writeable=true
;allow_file_others_writeable=false
allow_file_others_writeable=true
;allow_directory_group_writeable=false
allow_directory_group_writeable=true
;allow_directory_others_writeable=false
allow_directory_others_writeable=true

;Check wheter script is within DOCUMENT_ROOT
check_vhost_docroot=true

;Send minor error messages to browser
;errors_to_browser=false
errors_to_browser=true

;PATH environment variable
env_path=/bin:/usr/bin

;Umask to set, specify in octal notation
;umask=0077
umask=0022

; Minimum UID
;min_uid=100
min_uid=10000

; Minimum GID
;min_gid=100
; Consider of psacln, psaserv
min_gid=200

; Use correct permissions for mod_userdir sites
;handle_userdir=true


[handlers]
;Handler for php-scripts
;x-httpd-php=php:/usr/bin/php
x-httpd-php=php:/usr/bin/php-cgi

;Handler for CGI-scripts
x-suphp-cgi=execute:!self

现在,重启apache,就可以啦!如果发现返回空页面,并且错误log中有如下内容:

Premature end of script headers:

那有可能是因为你把cli模式的php可执行文件拿过来当cgi模式的用了,注意他们的区别:

# php -v
PHP 5.2.6 (cli) (built: May  2 2008 16:06:40) 

# php-cgi -v
PHP 5.2.6 (cgi-fcgi) (built: May  2 2008 16:01:17)

把正确的cgi模式php执行文件设定到/etc/suphp.conf中即可。

chroot的疑惑

由于以前为了安全,ssh权限都是限定在chroot环境下,这样用户无法访问自己$HOME之外的内容。使用了suPHP之后,虽然php文件是以用户身份运行的,但却不是chroot的环境。也就是说,“理论上”在php文件执行的时候,可以访问其他用户的文件,这不也是个安全隐患么?

为了这个问题,我翻阅了好多资料,却发现很少人提起这个东西,suPHP安装不复杂,介绍的也不少,就是没有和chroot搭配的,倒是有人提出和fastcgi搭配使用。后来和michael沟通后才突然醒悟,suPHP的伪装身份和chroot是两种机制,之间没有什么联系,所以也就不存在什么配套使用的问题。至于不想让用户访问别人的文件,完全可以通过设定文件权限来实现嘛,不过还是要在安全方面比以前更加留心:

  • $HOME下系统自动创建的目录,一般属主都是user:psaserv或者root:root,有些对所有人都有rx权限(755),有些则是750权限,私密文件不要往755权限的目录下放。这些目录一般不宜改为750权限,因为有些文件是其他系统服务需要读取的。
  • $HOME下httpdocs, private等目录默认就是禁止所有人访问的,保持这样不要更改,并且httpdocs下的文件你就是搞成777权限,别人也访问不到。
  • 用户自建的文件、目录一般为user:psacln权限,主机上所有host用户所属组都是psacln,所以如果不想让别人访问,又没有上级目录的权限限制的话,一定调整为700权限。
  • 为了使用更方便,可以把$HOME目录的属主设为用户本身,比如chown fwolf:psaserv /var/www/vhosts/fwolf.com,不过这就需要一个个的单独开通了。
  • 如果发现其他系统文件中有泄密的,或者其他用户没有设置好权限,存在安全隐患,请及时告诉我或者相应用户,这样我们才是和谐的一家人嘛 🙂

取消chroot,还有一个好处就是用户几乎能够使用主机上的所有命令了,不像以前那样用哪个就需要把哪个设置到chroot的jail中,方便多了。

chroot的取消不是自动的,我已经给所有用户加上了可指定/bin/bash作为登录shell的权限,用户在plesk的站点设置中,把ssh用户的登录更换为/bin/bash即可,当然如果对安全没有信心,觉得chroot也够用的用户可以保留。

其他

suphp比suexec(就是原来dv3.0升php5的方法)要快一点;比suphp更快的还有suphp_mod_php;再快一些的是mpm-peruser,不过安装配置的麻烦程度也随之递增。

相比而言,suPHP速度还算可以接受(对于负载不是很大的站),配置方便,不用修改每个virtualhost的参数(就是$HOME/conf/vhost.conf),直接改apache的总conf就ok了,当然也比上面fastcgi方式下用event触发脚本来实现更加简洁。

参考

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后重启马上就好了。

升级WP旧模板,让它支持Widgets

正如大家所见,我使用的WordPress模板已经是很旧很旧的了,是以前在WordPress 1.5还是1.0系列的默认模板之上,简单修改而来的。没有选用三栏布局,因为我喜欢用稍微大一点的字体,三栏布局对我来说侧边栏东西太多,加上文章长了以后侧边栏的下面空白很大。不过旧模板自然也就没有Widgets:

No Sidebars Defined

You are seeing this message because the theme you are currently using isn’t widget-aware, meaning that it has no sidebars that you are able to change. For information on making your theme widget-aware, please follow these instructions.

刚开始我还能忍受,Sidebar上没有的东西俺自己手工加上,不过用上Simple Tags插件之后,感叹到了插件和Tags的强大,Relate Post很方便,可Relate Tags就是出不来,探查一番,原因应该就是我的模板不支持Widgets。所以忍不住了,模板可以不变样,但不能不升级,我就动手把它改成支持Widgets的吧。

刚才的提示中已经给出了修改指引的链接,首先把模板中的Sidebar改成ul形式的,Theme Editor -> Sidebar (sidebar.php),第一行的ul换成div即可:

<ul id="sidebar">
......中间的很多内容
</ul>

看了一下,对外观没有太大影响,css应该是用id来引用的,不过还是需要调整一点css:

/* 启用Widgets后Sidebar样式有些变化,在这里修正 */
#sidebar {list-style: none;}
#sidebar li ul li:before {
    content: "\00BB \0020";
}
#sidebar li ul li {
    margin-bottom: 5px;
}

然后还是修改Sidebar模板文件,加入是否有动态Sidebar的检查、如果有就调入的PHP代码:

<ul id="sidebar">
<?php if ( !function_exists('dynamic_sidebar')
    || !dynamic_sidebar() ) : ?>
......中间的很多内容
<?php endif; ?>
</ul>

代码一共就3行,前面加2行,后面加一行,就是个简单的判断而已。别着急,现在还没有完成,还有最后一步。

在模板目录下,比如我的就是wp-content/themes/fwolfs-blog这个目录,创建一个新文件functions.php,内容就4行:

<?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?>

好了,现在再刷新Design -> Widgets页面,就有内容了,我的旧模板现在也支持Widgets了。

同样的,Design -> Theme Editor页面中也会多一项可编辑内容:

Theme Functions (functions.php)

PS1: 如果要添加多个Sidebar,需要模板的支持,也就是模板中制定需要几个Sidebar,在Design中就能管理几个(register_sidebars(n),n就是Sidebar数量)。

PS2: 如果想在Widgets的Text里面内嵌php代码,比如设定只有首页才显示BlogRoll,那么需要安装PHP Code Widget插件,并使用PHP Code代码块。直接在原来的Text中写php代码的话,会原封不动的被当成php代码输出,昏死。

PS3: 一切都折腾好了,Relate Tags功能还是得手工添加php代码块到Widgets中:

<?php
if (is_tag()) {
    st_related_tags();
    st_remove_related_tags();
}
?>

选择Eclipse PHP Development Tools(PDT)作为PHP开发工具

vi虽然轻巧,但一来在图形界面下没有必要一定用纯cli的东东,二来在项目开发的环境中vi有些吃力。Zend Studio呢一直用着他的keygen也挺不好意思的,功能上我只能说是一般,再一般不过了,就是个图形化的编辑器,带代码提示什么的辅助功能,最有用印象最深的居然是选择多行然后用TAB整体缩进。

所以,尝试着把开发工具更换为PHP Development Tools(PDT),eclipse的大名早有耳闻,只是从来不用java,也就没有摸过。早在2004年底作项目的时候见同事用过,慢就一个字,强也是一个字。至于为何不选PHPEclipse,倒也不是听到网上一边倒的声音,而是我实在是有点不习惯它的复杂,相比之下刚出炉不久功能不全的PHP Development Tools(PDT)正和我意。

我是从官网下载的pdt-all-in-one-R20080103-linux-gtk.tar.gz,有点像懒人包,直接解压就能用了,功能基本上都配置好了。额外装了几个插件,都是用系统自带功能Help -> Software Updates -> Find and Instal安装的:

基本上就够我用了。这种安装方式实在是很方便,能够后台运行更方便。

配置Debug的时候麻烦一些,其实到后来我也没弄太明白,本来想用XDebug的,不过上官网一看基本上只有for windows的二进制包,linux下的多半还得自己编译(网上的例子也多半是基于windows的环境,很无奈),就转向Zend了。谁知Zend官网上这个Debugger的链接也不好找,产品列表里根本就没有,现在这个更新/安装地址已经忘记是从哪里搞来的了,不过能用。

Debug能用了,不过只限于PHP Script运行方式,如果要完整的web测试的话,还得去修改php.ini加Zend Debugger的扩展,懒得弄了,处理得当的话需要debug的时候不多,一般print_r/var_dump也基本够用了。

PHP Development Tools(PDT)的编辑区比Zend Studio要“小”一些,因为界面的边框太“厚”了,Tab也有点大,可以在界面设置中取消圆角,能省点地方。编辑区小的问题不要紧,Ctrl-M能放到最大,加上其它窗口可以缩起来,用的时候调出来,用完自己还会缩回去,所以总体界面上还是要比Zend Studio要好用。

功能上,最喜欢的就是Eclipse无时无刻不在的语法检查,可以迫使我们摒弃掉一些坏毛病。不过这个功能和Smarty模板合不来,像我原来smarty模板文件都是.html扩展名的,这下可遭殃了,一大堆无法处理的错误信息。中间试过PHPEclipse,它支持Smarty模板,不过是另外分配了一个编辑器,同样也只能认.tpl扩展名,模板编辑功能几乎没有,就剩下一个模板语法高亮显示,居然还不像其它编辑窗口一样能够调整背景(我习惯把编辑区背景设置为#CCE8CF,节省眼力),索性不用了。费点功夫把所有模板都改成.tpl扩展名的,然后当一般纯文本处理,也没有什么不爽的,js和css基本上都是在单独的文件中,有相应的编辑器,手工写点html code也无妨。

不过还是推荐一个PHP Development Tools(PDT)中的for Smarty的插件smartypdt,主意虽好,但程序非常不成熟,在PHP Development Tools(PDT)的eclipse 3.3上基本上没法用,先关注一下,期待以后能成熟起来吧。

最后,总体感觉Eclipse虽然速度依然不快,尤其是启动速度,尤其是我调用远程主机上的项目文件,但其强大的功能足以掩盖这些缺点,还是那句话,谁用谁知道~~这几乎是我用过的可操作性最强的Java软件了。

参考

Update @ 2008-05-03

eclipse的配置都保存在workspace目录下,比如设置了php的文件模板,就保存在$workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/目录下的org.eclipse.php.ui.prefs文件中。

快捷键的设置保存在org.eclipse.ui.workbench.prefs中。

隐藏得好深,找了半天。

Update @ 2008-05-04

字体方面,建议选择英文等宽字体Bitstream Vera Sans Mono或者DejaVu Sans Mono,这样英文配合中文的显示效果比较好,粗体效果也不错,不影响代码的对齐,看着更舒服。

Update @ 2008-05-24

PDT拷贝到另外一台旧机器上,能运行,但PHP相关的内容死活就是不出来,鼓捣了将近4个小时,终于发现,这玩意儿需要jre 1.5以上,安装java 1.6以后,一切正常。唉,望各位引以为戒哪。

就是这篇文章提醒了我:eclipse 最新安装 配置