msgbartop
msgbarbottom

28 八 08 为Aptana Studio 1.1增加PHP的Run和Debug

今天突然想起来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 - , , , ,

27 八 08 2008年7月PHP发展状况统计报告

PHP在互联网中的情况

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

23 八 08 Zend Studio 6.0.1安装中文语言包的方法

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 - , , , , ,

23 八 08 Zend Studio 6.0升级到6.01的方法

其实Zend官方已经给出了升级方法,按照附件PDF文档中的指示一步一步操作即可。
点击这里下载文件
Tags - , , ,

21 八 08 PHP Remote Debugging – DBG + Xdebug

在前面两篇中,分别提到了如何用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 - , , , , , ,

21 八 08 PHP Remote Debugging – Xdebug

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 - , , ,

21 八 08 PHP Remote Debugging – DBG

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 - , , , ,

14 八 08 InnoDB和MyISAM的差别

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 - , , ,

14 八 08 MySQL性能优化TIPS

总结了一些MySQL优化方面的技巧

一. 启动参数优化
修改 my.cnf (或者my.ini),加入/修改以下几行

#设定缓存的连接数,节省连接时的开销
back_log = 64

#禁用文件系统外部锁
external-locking = 0

#禁用BDB,如果你确实不需要的话,innodb也是如此
skip-bdb

#索引缓冲,如果是专用的数据库服务器,可以设置高达服务器内存的一半,如果不是专用的,
#还是设置得低一点
key_buffer = 512M

#缓存数据表数量,如果内存较大,可以设置稍微高一点,否则还是设置低一点
#设置这个参数可以参见系统状态中的 open_tables(表示当前打开的数据表总数)
#和 opened_tables(表示所有打开的数据表总数)
table_cache = 128

#禁用dns解析,如果你的授权信息中采用dns授权方式了,就不能启用该选项
skip-name-resolve

#记录慢查询和没有使用索引的查询,便于帮助分析问题所在
long_query_time = 1
log-slow-queries = /usr/local/mysql/data/slow.log
log-queries-not-using-indexes

其他参数诸如 sort_buffer_size,net_buffer_length,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size,
thread_cache_size,query_cache_size,max_binlog_cache_size 等请查询MySQL手册,然后做出合适的调整.

二. 其他小TIPS

* 针对Innodb表,尽量不执行 SELECT COUNT(*) 语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢.
* 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁.
* 善用 EXPLAIN来帮助你分析查询优化情况
* 如果需要对一个较大的且并发读写较多的数据表做 GROUP BY 等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善.
* 查询时如果有 ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度
* 如果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到.例如:
索引 `idx_`(col1, col2, col3),那么查询 SELECT .... FROM ... WHERE col1=1 AND col2=2; 使用索引,而查询 ... WHERE col2=2 AND col3=3; 或 ... WHERE col1=1 AND col3=3; 则不使用索引.
* WHERE 中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤.
* 2 个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了.
* 大部分情况下,字符类型的字段索引值需要一部分,例如 CREATE INDEX char_idx ON tbl1 ( name(10) );
* 尽量使用最合适的数据类型,能使用 ENUM 就不使用 TINYINT ,能使用 SMALLINT 就不使用 MEDIUMINT.这样能节省存储空间,增加数据存储量,提高搜索速度.不要担心这样会对省级产生很大的影响,因为加入从 TINYINT 类型改变为 INT 的话,并不会改变原来的数据.
* 如果知道某个表总是频繁使用的话,可以把它放到 hot_cache 中,用以下方法:

SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX `xxx` IN hot_cache;

* 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能.
* 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率.如: ... WHERE `create_time` > UNIX_TIMESTAMP(NOW()); 这样的查询.可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句.
* 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引.如 ... `name` LIKE 'yejr%';.
* 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高.
* 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗.
* 定期的在MyISAM表上执行 OPTIMIZE TABLE,这能整理随便,提高索引效率.
* 如果你主要按 col1,col2,...顺序检索记录,请在对表大量更改后执行 ALTER TABLE ... ORDER BY col1, col2, ... 语句,这可以获得更好的性能.
* 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT).
* 对于记录总数超过500万的单表,就应该赶紧考虑分表了.分表策略有多种,比如按ID号段,或者按时间切分,等等.
* 创建数据表时尽量指定字段不能为NULL,并且有默认值.
* 使用 LOAD DATA,而不是使用大批量的 INSERT 语句来导入数据.
* 使数据表名和字段名尽可能的短,例如在 user 表中使用字段名 name,而不是 user_name.
* 用 DELAY_KEY_WRITE = 1 选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行 myisamchk 修复索引才行.
* 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载.

数据库性能优化涉及到系统硬件和软件的方方面面,本文讨论的主要是编译和配置优化、服务器参数调整、如何选用合适的表类型,以及如何用数据库内建的命令辅助 分析和优化性能,特别是如何用EXPLAIN辅助优化查询的性能。原文出处:http://www.devshed.com/Server_Side/MySQL/Optimize/

在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接 影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验 进行判断,然后设置合理的参数。

下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化;二是MySQL自身(my.cnf)的优化。

(1) 服务器硬件对MySQL性能的影响
a) 磁盘寻道能力(磁盘I/O),以目前高转速SCSI硬盘(7200转/秒)为例,这种硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访问量 在100万PV以上的Discuz!论坛,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案:
使用 RAID-0+1磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快;抛弃传统的硬盘,使用速度更 快的闪存式存储设备。经过Discuz!公司技术工程的测试,使用闪存式存储设备可比传统硬盘速度高出6-10倍左右。
b) CPU 对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:可以使用两颗Intel Xeon 3.6GHz的CPU。
c) 物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。

(2) MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。
由于my.cnf文件的优化设置是与服务器硬件配置息息相关的,因而我们指定一个假想的服务器硬件环境:
CPU: 2颗Intel Xeon 2.4GHz
内存: 4GB DDR
硬盘: SCSI 73GB

许多新手往往把重新编译源代码看成是一种无可避免的灾祸,其实编译源代码还能对程序的最终性能起到显著的影响。编译过程可以用不同流水线上装配同样型号 的汽车比拟:第一条流水线由素质较低的工人操作,装配程序未能尽善尽美,零件装配误差较大;第二条流水线由高素质的技术工人操作,汽车装配程序合理,且利 用最好的工具保证产品的高质量。虽然两条流水线上装配出来的汽车外观一模一样,但两种汽车的性能表现却可能大不相同。对于编译器来说情况也完全相似,有些 编译器装配出来的程序要比其他编译器的更好。

编译时考虑所有可用的选项也是极其重要的。很可能某些编译器的默认选项值不能符合要求, 或者,为了满足应用的特定需求,我们需要指定一些特殊的编译选项。正如MySQL文档所指出的,只要采用了更好的编译器或者使用更合理的编译选项,应用性 能的提高程度可以达到10-30%。

既然如此,编译时具体应该注意哪些问题才能让MySQL数据库运行得更快呢?

▲ 使用pgcc编译器
如果系统使用的是奔腾处理器,那么pgcc(Pentium GCC)正是为这些系统下运行的程序提供的专用编译器。pgcc是gcc编译器(http://www.gnu.org/software/gcc/)的 奔腾优化版,用pgcc编译MySQL代码可以让整体性能提高10%以上!关于pgcc的更多信息,请参见http: //www.goof.com/pcg/。当然,如果系统使用的不是奔腾处理器,采用这种方法提高MySQL的运行速度就不合适了,因为正如其名字所示, pgcc是专门为奔腾系统提供的。

▲ 把mysqld编译成静态模式
以不带共享库的形式编译mysqld同样可以提高性能。在配置行加入下面这个选项可以将mysqld编译成静态模式:
% >./configure -with-mysqld-ldflags=-all-static [--其他配置选项]

▲ 配置示例
下面的配置命令经常用于提高MySQL的性能:
% >CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6
-mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"
./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static
--disable-shared

详细解释每个gcc选项的作用已经超出了本文的范围,请访问gcc的说明文档了解这些信息(http://gcc.gnu.org/)。注意不要拘泥于这个例子,请在命令行执行man gcc仔细了解每一个gcc选项的含义。

正确的编译方法固然重要,但它只是提高MySQL服务器性能工作的一部分。MySQL服务器的许多参数会影响服务器的性能表现,而且我们可以把这些参数保存到配置文件,使得每次MySQL服务器启动时这些参数都自动发挥作用。这个配置文件就是my.cnf。

MySQL服务器提供了my.cnf文件的几个示例,它们可以在/usr/local/mysql/share/mysql/目录下找到,名字分别为my -small.cnf、my-medium.cnf、my-large.cnf以及my-huge.cnf。文件名字中关于规模的说明描述了该配置文件适 用的系统类型。例如,如果运行MySQL服务器的系统内存不多,而且MySQL只是偶尔使用,那么使用my-small.cnf配置文件最为理想,这个配 置文件告诉mysqld daemon使用最少的系统资源。反之,如果MySQL服务器用于支持一个大规模的在线商场,系统拥有2G的内存,那么使用mysql-huge.cnf 最为合适。

要使用上述示例配置文件,我们应该先复制一个最适合要求的配置文件,并把它命名为my.cnf。这个复制得到的配置文件可以按照如下三种方式使用:
全局:把这个my.cnf文件复制到服务器的/etc目录,此时文件中所定义的参数将全局有效,即对该服务器上运行的所有MySQL数据库服务器都有效。
局部:把这个my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/将使该文件只对指定的服务器有效,其中[MYSQL-INSTALL-DIR]表示安装MySQL的目录。
用户:最后,我们还可以把该文件的作用范围局限到指定的用户,这只需把my.cnf文件复制到用户的根目录即可。

那么,如何设置my.cnf文件中的参数呢?或者进一步说,哪些参数是我们可以设置的呢?所有这些参数都对MySQL服务器有着全局性的影响,但同时每 一个参数都和MySQL的特定部分关系较为密切。例如,max_connections参数属于mysqld一类。那么,如何才能得知这一点呢?这只需执行如下命令:
% >/usr/local/mysql/libexec/mysqld --help

该命令将 显示出和mysqld有关的各种选项和参数。要寻找这些参数非常方便,因为这些参数都在“Possible variables for option --set-variable (-O) are”这行内容的后面。找到这些参数之后,我们就可以在my.cnf文件中按照如下方式设置所有这些参数:

set-variable = max_connections=100

这行代码的效果是:同时连接MySQL服务器的最大连接数量限制为100。不要忘了在my.cnf文件[mysqld]小节加上一个set-variable指令,具体请参见配置文件中的示例。

数据库的常规优化

MySQL 本身的配置文件 my.cnf(或 my.ini)中的相关参数,对整个数据库系统来说尤为重要。针对不同的服务器内存容量,MySQL 程序包中提供了 my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf 四个分别适用于服务器内存不低于 64M、256M、512M、1G 情况下的参数设置,您可以根据自身机器的实际情况,数据库应用所占比重,在上述四个文件中提供的参数基础上对配置文件进行修改。Unix 类系统用户,建议将配置文件命名为 my.cnf 放置于 /etc 中;Windows 系统用户直接在 Winmysqladmin.exe 中对 my.ini 进行修改即可。 除了以上默认的配置文件提供的参数以外,通常情况您还需要在 [mysqld] 后修改或增加以下的参数以适应大部分 web 应用程序的需要:
* 最大连接数为 600,以满足一般应用对连接数的需要:增加 max_connections = 600。根据我们的经验,500~1000 是较为合适的数值,没必要将其设置为超过 1000,那只会造成对资源的浪费。
* 不使用 innodb 和 bdb:增加两行内容,分别是 skip-innodb 和 skip-bdb。Discuz! 和大部分 web 应用程序不需要使用此两项功能,因此将其关闭以节约内存和磁盘空间,提高效率。
* 连接超时时间 5,避免空闲进程过多的内存占用:增加 wait_timeout = 5。通过减少超时时间,使得使用 pconnect(长期连接)的用户在利用其不需反复验证用户名和密码的同时,避免打开过多的空闲进程,减少内存消耗。
* 禁止端口连接:增加 skip-networking。如果使用 Unix 类操作系统,数据库和 httpd 在同一台服务器,且不需要远程读取数据库,可增设此项参数,关闭默认的 3306 端口,有效提禁止外部网络未经授权的访问,避免端口被用以进行 DDoS 攻击。Windows 系统不需要(不能)增加这个参数。
其他参数的配置在此不详述,如果您对服务器及 MySQL 数据库有相当的了解,可以通过数据库的日常运行情况,有针对性的进行修改。

数据表优化(Optimize Table)

当数据库中删除了大量的数据后,可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。Discuz! 在系统数设置界面提供了数据表优化的功能,可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作。您只要在做完批量删除,或定期(如每一两个月)进行一次数据表优化操作即可。
Tags - , , , , , ,

06 八 08 PHP 5.3要发布了

前几天就得知PHP发布了5.3 Alpha,刚刚去php.net看了下新版本的介绍,发现果然多了一些新东东,呵呵。

  • Namespaces (documentation maybe out dated)
  • 这就是传说中的“命名空间”啦,^_^

  • Late static binding and __callStatic
  • 支持“晚(静态)绑定”了

  • Lambda functions and closures
  • 支持λ函数和闭包运算

  • Addition of the intl, phar (phar is scheduled for some more work a head of alpha2), fileinfo and sqlite3 extensions
  • 支持intl、phar、fileinfo和sqlite3等扩展

  • Optional cyclic garbage collection
  • 可选的循环垃圾收集器

  • Optional support for the MySQLnd replacement driver for libmysql
  • 可选的替代libmysql的MySQLnd支持

  • Windows older than Windows 2000 (Windows 98, NT4, etc.) are not supported anymore (details)
  • 不再支持Win2000以前的系统(Windows 98, NT4等等)

  • New syntax features like NOWDOC, limited GOTO, ternary short cut "?:"
  • 支持新的语法特性如“NOWDOC”等,限制了“GOTO”和三元运算符“?:”等

    在我看来,此次版本步进,最大的意义在于上边的“命名空间”、“晚(静态)绑定”和MySQLnd,“命名空间”的呼声很高,早就应该加进去了;“晚(静态)绑定”现在还没看到实际东西,暂不做评论;至于MySQLnd,这个是MySQL官方出品的“Native driver for PHP”,针对这句话,官方是这么解释的

  • “native”: This doesn’t mean “written in PHP”; that would be too slow. PHP itself is a program written in C. Therefore “native” means this driver is written in C and tightly integrated into PHP at the C level. This allows the driver to achieve maximum performance (just like libmysql).
  • 这意味着不是“以PHP编写”,因为那样速度很慢。PHP本身是用C语言编写的,因此“native”意味着这个数据库驱动也是以C语言编写并在C语言级别上与PHP紧密集成。这使得驱动能够发挥最大的效能(类似libmysql)。

  • “driver”: This is not a new programming API or PHP extension; there are already three APIs (ext/mysql, ext/mysqli, PDO/MySQL) and three extensions, so there is no need for more. Rather, mysqlnd is a library that implements the MySQL low-level communication protocol. This library can be used by the existing extensions. Currently ext/mysql and ext/mysqli have been modified so they can optionally use mysqlnd instead of libmysql, and PDO/MySQL will be modified later.
  • 这不是一个新的API或PHP扩展,已经有三套API(ext/mysql、ext/mysqli、PDO/MySQL)和三套扩展所以不必开发更多的。而MySQLnd更像是一个实现了与MySQL底层通讯协议的库,可以被已经存在的扩展使用。现在ext/mysql和ext/mysqli已经过修改可以选择使用MySQLnd来代替libmysql,PDO/MySQL随后也将做修改。

  • “for PHP”: This is nothing new in the sense that libmysql is also for PHP. But mysqlnd is published under the terms of the PHP license whereas libmysql was not. Therefore, unlike with libmysql, there is no need for the FLOSS License Exception to make the license compatible with that of PHP. Those who recall the (partly heated) discussions about the exception might be especially happy to hear about this.
  • 与libmysql for PHP而言,这没什么变化,但MySQLnd基于PHP License发布而libmysql不是。因此,不再需要FLOSS License以使其兼容,对于提出这项内容的人而言是一个好消息。

    期待PHP 5.3 Stable的发布!


    Tags - , , , , , , , ,