以data:开头,后面加入MIME类型和内容,即可将一个文件包含在一个URL内。包含二进制文件的格式为
data:image/gif;base64,BASE64编码
Tags - , , ,
Posted in PHPers' Action at 11月 18th, 2008. Comments Off.
记录以备忘
语法其实是一致的:

ALTER TABLE 表1
ADD CONSTRAINT 外键名
FOREIGN KEY (表1的列名)
REFERENCES 表2(表2的列名)
ON UPDATE CASCADE
ON DELETE CASCADE;

其中,表1与表2之间是多对一或一对一的关系。
Tags - , , , , ,
Posted in PHPers' Action at 09月 9th, 2008. Comments Off.
今天突然想起来Aptana Studio很久没升级了,于是乎心血来潮Update。。。 我一直是用这个东东调试JavaScript,今天升级完毕后也顺带安装了PHP和AIR、RoR的plugin,装完后新建了几个project,感觉挺不错,而且在网上还发现aptana.tv有不少官方和其他用户提供的教学视频,很适合才使用Aptana Studio的朋友。但是(我为什么要说但是?),木有发现关于PHP的…… 安装完plugin后,我便开始从设置中寻找其能够直接Run和Debug PHP程序的方式。经过摸索,发现Aptana支持Server View,里边默认已经有了两个: Internal Web Server,端口8000 Jaxer Server,端口5375 然后在这个View的工具按钮上发现了:

呵呵,点击“Connect to Generic Web Server”,在对话框中仿照下图设置:

设置完毕后点击OK即可添加一个本地的WebServer作为Run和Debug的后台Web环境。 接下来,在Run菜单中点击“Run……”,在左侧“WebBrowser”那里点邮件,“New……”,参考下图内容设置:

设置完毕后点击OK即可。然后打开要Run的PHP程序,在Run按钮下选择你刚刚建立的这个Run方式,即可在对应的浏览器中执行这个PHP程序了,^_^~~ Tags - , , , ,
Posted in PHPers' Action at 08月 28th, 2008. Comments Off.

PHP在互联网中的情况

这张图显示了PHP在全球互联网范围内的发展情况。现在有33.17%的网站正在使用它。ASP与PHP的情况长期以来一直很稳定。 Read More…

Posted in 业界动态 at 08月 27th, 2008. No Comments.
1. 下载语言包,61M   http://downloads.zend.com/studio-eclipse/6.0.1/ZendStudio6.0-Language-Pack-it.zip
2.解压到一个目录,如I:\Downloads\ZendStudio6.0-Language-Pack-it
3.打开eclipse,Help->Software Updates->Find and Install
4.在弹出的子窗体中选择Search for new features to install,Next
点击在新窗口中浏览此图片
5.在Update sites to visit子窗体中,请勿勾选Sites to include in search中的默认项
点击New Location Site,选择I:\Downloads\ZendStudio6.0-Language-Pack-it,确定后会出现在Sites to include in search中,并且默认勾选,然后Finish
点击在新窗口中浏览此图片
这时候更新管理器会自动查找。
点击在新窗口中浏览此图片
6.查找完毕后,在Search Results窗体的结果:
点击在新窗口中浏览此图片
展开后我们发现许多中文简体的语言包哈!
勾选全部后发现一个问题
WYSIWYG PHP/HTML Editing NL Feature (1.0.0.200805051510) requires feature “com.xored.composer”.
所见即所得编辑器缺少一个关键部件,那么我们暂时先不安装它,取消勾选,Next
点击在新窗口中浏览此图片
7. 同意条款,然后依次Next,Finish,Install All,重启eclipse后即可。
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
PS:这个语言包并不是完全汉化,不过常用功能基本涵盖了。
Tags - , , , , ,
Posted in PHPers' Action at 08月 23rd, 2008. Comments Off.
其实Zend官方已经给出了升级方法,按照附件PDF文档中的指示一步一步操作即可。
点击这里下载文件
Tags - , , ,
Posted in PHPers' Action at 08月 23rd, 2008. Comments Off.

在前面两篇中,分别提到了如何用DBGXdebug扩展模块,在IDE中进行PHP Remote Debugging。

谈到IDE,PHPeclipse也是一个目前比较流行的PHP开发环境。其正式的版本中,使用DBG作为调试器。目前在其开发版本中,包含了对Xdebug的支持。PHPeclipse在使用DBG的时候,不需要DBG Listener,其内置了监听器,缺省所使用得端口也有所改变。

对php.ini进行设置,以实现同时对DBG和Xdebug模块,以及多个PHP IDE的支持。具体的设置如下:

...
extension=php_dbg.dll

[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869, 10000/16
...
zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on
xdebug.idekey=<idekey>

在使用调试器的时候,不要启用Zend Optimizer。Xdebug必须占用zend_extension_ts,才能进行Remote Debugging。

这里,Xdebug的loading,使用了相对路径,也可以使用绝对路径,以适应PHP扩展模块目录的位置变化。
PHP Remote Debugging,相应的配置要涉及到Web Server端和IDE端,以及实际页面的访问。一开始的时候,有些摸不着头脑,理清楚了,就比较简单。

了解PHP的调试,一定会走到PHP在线帮助的“Appendix E. Debugging PHP”。在这一页的最后,又见到了熟悉的老朋友,一段Python代码,一个简单的在线调试监听器。运行这段Python code之后,在浏览器上输入在线调试指令,真的就连接过来了,从而知道PHP Remote Debugging是如何开始的。

无论DBG还是Xdebug,都在调试开始指令中,包含了所调试PHP脚本的完整的路径名和文件名。这样,IDE就可以直接打开相应的文件进行调试,在本机直接跳过HTTP URL到FS File这样的映射(Mapping)。

所使用的PHP解释器,是Web Server上的那个Parser,而不是IDE附带或连接的PHP。在Remote Debugging的过程中,IDE使用的PHP根本就没有用上。所以,IDE的PHP不必和Web Server的保持一致,甚至可以不设置。

DBG模块,可以对多个Port提供调试支持。PHPeclipse中的调试端口不固定,要写成debugger.JIT_port=7869, 10000/16这个样子。

Remote Debugging的过程,从Client/Server的角度来看,IDE充当了Server,在指定端口上监听调试连接。PHP的DBG和Xdebug扩展模块,则是Client。调试从浏览器的开始指令发起,PHP的调试器从Web Server那里得到调试指令,就去和对应端口的Server,即IDE联系,从而开始一个Remote Debugging的对话。

前面的Post中,提到Xdebug所使用的DBGp,是一个基于XML的多语言调试协议。在DBGp的开始指令中,还包含了脚本语言项。因此,Xdebug is not for PHP only, but also Python, Ruby...。如果在项目中,要在PHP、Python和Ruby之间跨越,使用Xdebug作为Remote Debugging的手段,无疑是非常合适的。这应该就是为什么Komodo选择Xdebug的原因吧。


Tags - , , , , , ,
Posted in PHPers' Action at 08月 21st, 2008. Comments Off.

PHP Remote Debugging,另一个比较流行的调试模块是Xdebug。Xdebug,使用上非常方便,在遇到exception的时候,能够将Application当前的状况,变量、call trace等信息,友好地直接输出到web页面上。

Xdebug上下载Xdebug for PHP的扩展模块,将其置于PHP的ext目录中。在php.ini中增加,

extension=php_xdebug.dll

xdebug.show_exception_trace=on
xdebug.show_local_vars=on

这样就可以在Web Application遇到语法或值溢出等exception的时候,显示相关变量和调用堆栈。

对于PHP Remote Debugging,需要在php.ini中对Xdebug进行更多的设置。

zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=<idekey>
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on

并将和Zend Optimizer有关的选项全部关闭。在phpinfo()中,检查是否成功启动Xdebug。

Xdebug支持多个调试协议,GDBDBGp和PHP3。这里使用的是DBGp,一个基于XML的多语言调试协议。

目前,Xdebug的最新版本是2.0.0 Beta。和DBG Debugger相比,支持Xdebug的IDE还不太多。这里以Komodo为例,说明基于Xdebug扩展,如何进行Remote Debugging。

安装好Komodo 3.5.3之后,设置Preferences - Debugger - Proxy中的,

Listen for debug connections on port: 9000

再选择Debug - Listen for Remote Debugger。如果出现勾号,没有出错信息的话,Komodo is ready for remote debugging。

输入Xdebug调试开始指令,

http://localhost/myscript.php?XDEBUG_SESSION_START=1

切换到Komodo,对PHP程序进行在线调试。

上述指令,会启动一个持续的Xdebug调试session,后续PHP脚本会自动进入在线调试状态。也可以只对单个PHP脚本进行单次Remote Debugging。

http://localhost/myscript.php?XDEBUG_SESSION_START

这样就不需要再输入调试中止指令,直接退出Remote Debugging。调试中止指令,格式如下,

http://localhost/myscript.php?XDEBUG_SESSION_STOP

需要指出的是,XDEBUG_SESSION_STOP不会立即停止对当前PHP的在线调试,而是停止对此以后的PHP的Remote Debugging。

Xdebug提供了一个xdebug_break()函数,直接在程序中设置断点,而不是在Komodo中设置。


Tags - , , ,
Posted in PHPers' Action at 08月 21st, 2008. Comments Off.

PHP Remote Debugging,是对PHP Web应用程序进行调试的最直接、最有力的手段。尤其是现在,框架横行的时代,光靠阅读源码和简单的echo,显然进展不快。

Remote Debugging,直译过来是“远程调试”,个人更愿意翻译成“在线调试”,即在实际使用Web Server的情况下,对Web Application进行调试。

诸多PHP IDE,都集成了广泛使用的DBG调试模块。这里以PHPEdit为例,介绍如何使用DBG进行PHP程序的在线调试。PHPEdit包含了DBG Listener和DBG Debugger,能够进行单步跟踪、全局和局部变量检查等功能,用它进行Remote Debugging,非常方便、实用。

在启动PHPEdit的时候,DBG Listener也会一同启动。在系统托盘区,可以找到一个类似雷达天线的图标,那个就是PHP DBG Listener。DBG Listener的基本设置,

Bind address:  0.0.0.0
Port:          7869
IDE COM class: PHPEdit IDE
X Breakpoint on script start
X Breakpoint on script finish

最后这两行设置,会在PHP脚本的开始和结束的地方,自动设置断点。这样就不必手工去设置断点了。当你不清楚程序的整体结构和入口点的时候,这就显得很方便。DBG Listener通常是处于等待(Waiting)的状态。

设置PHPEdit,以便进行在线调试。在PHPEdit Perferences中,选择Debugger。

X HTTP (SAPI or remote CGI)
X Use backslashed in filenames on remote filesystem (win32)
X Make file name low case before mapping

后续的Mapping部分,是将实际要访问的HTTP URL和本机的文件目录对应起来。如果Web Server和PHPEdit在同一台机器上,就没有必要在本机再建立一个工作备份,Mapping可不设。

设置完成之后,点击Debug - Start Listener,以准备接受Remote Debugging指令。一旦PHPEdit和DBG Listener配置好之后,就不需要每次都去Start Listener,PHPEdit会自动开始对Remote Debugging的监听。

Web Server这一端,需要修改php.ini以提供对DBG的支持。在php.ini的Dynamic Extensions段,增加

extension=php_dbg.dll

[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869


DBG的扩展模块,可以从这里下载。选择合适的版本,放到php的扩展目录下,并改名为php_dbg.dll。对于版本号高于5.1.2的PHP,用for 5.1.2的那个dll即可。

通过查看phpinfo()的输出信息,确认PHP DBG模块被正确安装。

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
    with DBG v2.15.1, (C) 2000,2006, by Dmitri Dmitrienko
...
dbg
DBG php debugger, version 2.15.1, Copyright 2001, 2006, Dmitri
Dmitrienko, www.nusphere.com

Version    2.15.1  
Linked     as a shared library.  
Profiler   compiled, enabled  

Directive                      Local Value  Master Value
debugger.enable_session_cookie On           On
debugger.enabled               On           On
debugger.fail_silently         On           On
debugger.ignore_nops           Off          Off
debugger.JIT_enabled           On           On
debugger.JIT_host              clienthost   clienthost
debugger.JIT_level             3            3
debugger.JIT_port              7869         7869
debugger.profiler_enabled      On           On
debugger.session_nocache       On           On
debugger.timeout_seconds       300          300

现在一切准备就绪,可以开始PHP Remote Debugging了。DBG Remote Debugging不会自动开启,需要激活一下。在浏览器中,输入

http://localhost/myscript.php?DBGSESSID=1@localhost:7869

就会切换到PHPEdit,打开myscript.php,光标会自动停在myscript.php中PHP程序部分的开始。接下来,就是标准的debug操作,跟踪、步进、变量察看等等。随着PHP代码的运行结束,最后输出的Web Page就会出现在浏览器中。这样就完成了一个DBG的调试周期。

一旦开启DBG在线调试,之后就不再需要附加Active Command了。以后对每个PHP页的访问,都会自动进入调试状态。

使用下面的命令,中止DBG Remote Debugging,取消调试。

http://localhost/myscript.php?DBGSESSID=0

DBG Listener可以支持多个IDE,如果安装有多个支持DBG的IDE,需要注意实际使用哪个IDE进行调试。

如果在未开启DBG Listener或相应的IDE的情况下,使用Active Command,或者在Remote Debugging过程中,IDE退出,浏览器上都会得到出错信息。此时,需要附加取消调试的指令,才能恢复对PHP页面的正常访问。


Tags - , , , ,
Posted in PHPers' Action at 08月 21st, 2008. Comments Off.
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。  
NULL列索引。  
对变长行比ISAM表有更少的碎片。  
支持大文件。  
更好的索引压缩。  
更好的键码统计分布。  
更好和更快的auto_increment处理。  
以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。
Tags - , , ,
Posted in PHPers' Action at 08月 14th, 2008. Comments Off.