<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>陈书艺—Creative,Calmness,Passion,Unremitting,Belief &#187; PHP</title>
	<atom:link href="http://www.cnedwin.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cnedwin.com</link>
	<description>Edwin Chen's Blog</description>
	<lastBuildDate>Mon, 29 Jun 2009 11:05:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP 5.2.6 Released</title>
		<link>http://www.cnedwin.com/20.html</link>
		<comments>http://www.cnedwin.com/20.html#comments</comments>
		<pubDate>Sun, 04 May 2008 06:26:46 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[行业动态]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/20.html</guid>
		<description><![CDATA[期待已久的PHP5.2.6终于发布了！其实几天前Released就可以下载了，但是官方网站没有更新，怕有变动一直没有下载。这次对比PHP5.2.5的更新，是非常有意义的一次变动。
The PHP development team would like to announce the immediateavailability of PHP 5.2.6. This release focuses on improving the stability ofthe PHP 5.2.x branch with over 120 bug fixes, several of which are security related.All users of PHP are encouraged to upgrade to this release. Further details about the PHP 5.2.6 release can be found [...]]]></description>
			<content:encoded><![CDATA[<p>期待已久的PHP5.2.6终于发布了！其实几天前Released就可以下载了，但是官方网站没有更新，怕有变动一直没有下载。这次对比PHP5.2.5的更新，是非常有意义的一次变动。</p>
<p>The PHP development team would like to announce the immediateavailability of PHP 5.2.6. This release focuses on improving the stability ofthe PHP 5.2.x branch with over 120 bug fixes, several of which are security related.All users of PHP are encouraged to upgrade to this release. Further details about the PHP 5.2.6 release can be found in the <a href="http://www.php.net/releases/5_2_6.php" mce_href="http://www.php.net/releases/5_2_6.php" target="_blank"><font style="" color="#0000ff">release announcement for 5.2.6</font></a>, the full list of changes is available in the <a href="http://www.php.net/ChangeLog-5.php#5.2.6" mce_href="http://www.php.net/ChangeLog-5.php#5.2.6" target="_blank"><font style="" color="#0000ff">ChangeLog for PHP 5</font></a>. <img src="http://www.cnedwin.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" mce_src="http://www.cnedwin.com/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" class="mceWPmore mceItemNoResize" title="更多……"> <b>Security Enhancements and Fixes in PHP 5.2.6:</b></p>
<ul>
<li>Fixed possible stack buffer overflow in the FastCGI SAPI identified by Andrei Nigmatulin.</li>
<li>Fixed integer overflow in printf() identified by Maksymilian Aciemowicz.</li>
<li>Fixed security issue detailed in CVE-2008-0599 identified by Ryan Permeh.</li>
<li>Fixed a safe_mode bypass in cURL identified by Maksymilian Arciemowicz.</li>
<li>Properly address incomplete multibyte chars inside escapeshellcmd() identified by Stefan Esser.</li>
<li>Upgraded bundled PCRE to version 7.6</li>
</ul>
<p>Downloads：<a href="http://www.php.net/downloads.php" mce_href="http://www.php.net/downloads.php" target="_blank">http://www.php.net/downloads.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/20.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS 5.1部署L.A.M.P环境配置手册</title>
		<link>http://www.cnedwin.com/18.html</link>
		<comments>http://www.cnedwin.com/18.html#comments</comments>
		<pubDate>Tue, 29 Apr 2008 19:00:43 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[手册]]></category>
		<category><![CDATA[环境]]></category>
		<category><![CDATA[部署]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=18</guid>
		<description><![CDATA[刚刚为公司的系统部门编写的公司LAMP部署标准，基于CentOS5.1 32/64位系统。
一、系统约定
软件源代码包存放位置        /usr/local/src
源码包编译安装位置(prefix)        /usr/local/software_name
脚本以及维护程序存放位置        /usr/local/sbin
MySQL 数据库位置        /var/lib/mysql（可按情况设置）
Apache 网站根目录        /www/domain.com（可按情况设置）
Apache 虚拟主机日志根目录        /var/logs/www（可按情况设置）
Apache 运行账户        www:www

二、系统环境部署及调整
1. 检查系统是否正常
# more /var/log/messages        （检查有无系统级错误信息）
# dmesg （检查硬件设备是否有错误信息）
# ifconfig（检查网卡设置是否正确）
# ping www.moophp.org （检查网络是否正常）
2. 关闭不需要的服务
# export LANG=&#8217;en_US&#8217; //设置语言
# ntsysv
以下仅列出需要启动的服务，未列出的服务一律推荐关闭：
atd
crond
irqbalance
vsftpd   (FTP服务可选)
microcode_ctl
network
ntpd
sendmail
sshd
syslog
3. 重新启动系统
# init 6
4. 配置 vim
# vi /root/.bashrc
在 alias mv=&#8217;mv -i&#8217; 下面添加一行：alias vi=&#8217;vim&#8217; 保存退出。
# echo &#8217;syntax on&#8217; &#62; /root/.vimrc
5. [...]]]></description>
			<content:encoded><![CDATA[<p>刚刚为公司的系统部门编写的公司LAMP部署标准，基于CentOS5.1 32/64位系统。</p>
<p>一、系统约定<br />
软件源代码包存放位置        /usr/local/src<br />
源码包编译安装位置(prefix)        /usr/local/software_name<br />
脚本以及维护程序存放位置        /usr/local/sbin<br />
MySQL 数据库位置        /var/lib/mysql（可按情况设置）<br />
Apache 网站根目录        /www/domain.com（可按情况设置）<br />
Apache 虚拟主机日志根目录        /var/logs/www（可按情况设置）<br />
Apache 运行账户        www:www</p>
<p><span id="more-18"></span></p>
<p>二、系统环境部署及调整<br />
1. 检查系统是否正常<br />
# more /var/log/messages        （检查有无系统级错误信息）<br />
# dmesg （检查硬件设备是否有错误信息）<br />
# ifconfig（检查网卡设置是否正确）<br />
# ping <a href="http://www.moophp.org/" target="_blank">www.moophp.org</a> （检查网络是否正常）</p>
<p>2. 关闭不需要的服务<br />
# export LANG=&#8217;en_US&#8217; //设置语言<br />
# ntsysv<br />
以下仅列出需要启动的服务，未列出的服务一律推荐关闭：<br />
atd<br />
crond<br />
irqbalance<br />
vsftpd   (FTP服务可选)<br />
microcode_ctl<br />
network<br />
ntpd<br />
sendmail<br />
sshd<br />
syslog</p>
<p>3. 重新启动系统<br />
# init 6</p>
<p>4. 配置 vim<br />
# vi /root/.bashrc<br />
在 alias mv=&#8217;mv -i&#8217; 下面添加一行：alias vi=&#8217;vim&#8217; 保存退出。<br />
# echo &#8217;syntax on&#8217; &gt; /root/.vimrc</p>
<p>5. 使用 yum 程序安装所需开发包（以下为标准的 RPM 包名称）<br />
a.修改/etc/yum.repos.d/CentOS-Base.repo，将镜象站点地址改为在中国的镜象站点地址。<br />
修改如下：</p>
<p># CentOS-Base.repo<br />
#<br />
# This file uses a new mirrorlist system developed by Lance Davis for CentOS.<br />
# The mirror system uses the connecting IP address of the client and the<br />
# update status of each mirror to pick mirrors that are updated to and<br />
# geographically close to the client. You should use this for CentOS updates<br />
# unless you are manually picking other mirrors.<br />
#<br />
# If the mirrorlist= does not work for you, as a fall back you can try the<br />
# remarked out baseurl= line instead.<br />
#<br />
#</p>
<p>[base]<br />
name=CentOS-$releasever &#8211; Base<br />
baseurl=http://mirror.be10.com/centos/$releasever/os/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5<br />
protect=1</p>
<p>#released updates<br />
[updates]<br />
name=CentOS-$releasever &#8211; Updates<br />
baseurl=http://mirror.be10.com/centos/$releasever/updates/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5<br />
protect=1</p>
<p>#packages used/produced in the build but not released<br />
[addons]<br />
name=CentOS-$releasever &#8211; Addons<br />
baseurl=http://mirror.be10.com/centos/$releasever/addons/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5<br />
protect=0</p>
<p>#additional packages that may be useful<br />
[extras]<br />
name=CentOS-$releasever &#8211; Extras<br />
baseurl=http://mirror.be10.com/centos/$releasever/extras/$basearch/<br />
gpgcheck=1<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5<br />
protect=0</p>
<p>#additional packages that extend functionality of existing packages<br />
[centosplus]<br />
name=CentOS-$releasever &#8211; Plus<br />
baseurl=http://mirror.be10.com/centos/$releasever/centosplus/$basearch/<br />
gpgcheck=1<br />
enabled=0<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5<br />
protect=1</p>
<p>#contrib &#8211; packages by Centos Users<br />
[contrib]<br />
name=CentOS-$releasever &#8211; Contrib<br />
baseurl=http://mirror.be10.com/centos/$releasever/contrib/$basearch/<br />
gpgcheck=1<br />
enabled=0<br />
protect=0<br />
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5</p>
<p>#packages in testing<br />
[testing]<br />
name=CentOS-5 &#8211; Testing<br />
baseurl=http://mirror.be10.com/centos/5/testing/i386/</p>
<p>gpgcheck=1<br />
enabled=0<br />
protect=0</p>
<p>b.保存后更新系统,执行：<br />
# yum upgrade<br />
c.建议更新所有列出的程序<br />
d.最后安装需要的开发库：<br />
# yum install vim-enhanced gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel kernel</p>
<p>6. a.定时校正服务器时钟，启用ntpd服务<br />
# service ntpd start<br />
b.对TCP/IP网络参数进行调整，加强抗SYN Flood能力<br />
# echo &#8216;net.ipv4.tcp_syncookies = 1&#8242; &gt;&gt; /etc/sysctl.conf<br />
将net.ipv4.tcp_syncookies = 1写入sysctl.conf 文件<br />
# sysctl -p<br />
查看结果</p>
<p>7. 源码编译安装所需包(Source)<br />
(1) GD2<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/gd-2.0.35.tar.gz" target="_blank">http://www.ismole.net/downloads/gd-2.0.35.tar.gz</a><br />
# tar xzvf gd-2.0.35.tar.gz<br />
# cd gd-2.0.35<br />
# ./configure &#8211;prefix=/usr/local/gd2<br />
# make<br />
# make install</p>
<p>(2) LibXML2<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/libxml2-2.6.32.tar.gz" target="_blank">http://www.ismole.net/downloads/libxml2-2.6.32.tar.gz</a><br />
# tar xzvf libxml2-2.6.32.tar.gz<br />
# cd libxml2-2.6.32<br />
# ./configure &#8211;prefix=/usr/local/libxml2<br />
# make<br />
# make install</p>
<p>(3) LibMcrypt<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/libmcrypt-2.5.8.tar.bz2" target="_blank">http://www.ismole.net/downloads/libmcrypt-2.5.8.tar.bz2</a><br />
# tar xjvf libmcrypt-2.5.8.tar.bz2<br />
# cd libmcrypt-2.5.8<br />
# ./configure &#8211;prefix=/usr/local/libmcrypt<br />
# make<br />
# make install</p>
<p>(4) Apache日志截断程序<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/cronolog-1.7.0-beta.tar.gz" target="_blank">http://www.ismole.net/downloads/cronolog-1.7.0-beta.tar.gz</a><br />
# tar xzvf cronolog-1.7.0-beta.tar.gz<br />
# cd cronolog-1.7.0-beta<br />
# ./configure &#8211;prefix=/usr/local/cronolog<br />
# make<br />
# make install</p>
<p>8. 升级OpenSSL和OpenSSH<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/openssl-0.9.8g.tar.gz" target="_blank">http://www.ismole.net/downloads/openssl-0.9.8g.tar.gz</a><br />
# wget –c <a href="http://www.ismole.net/downloads/openssh-5.0p1.tar.gz" target="_blank">http://www.ismole.net/downloads/openssh-5.0p1.tar.gz</a><br />
# tar xzvf openssl-0.9.8g.tar.gz<br />
# cd openssl-0.9.8g<br />
# ./config &#8211;prefix=/usr/local/openssl<br />
# make<br />
# make test<br />
# make install<br />
# cd ..<br />
# tar xzvf openssh-5.0p1.tar.gz<br />
# cd openssh-5.0p1<br />
# ./configure  \<br />
&#8220;&#8211;prefix=/usr&#8221; \<br />
&#8220;&#8211;with-pam&#8221; \<br />
&#8220;&#8211;with-zlib&#8221; \<br />
&#8220;&#8211;sysconfdir=/etc/ssh&#8221; \<br />
&#8220;&#8211;with-ssl-dir=/usr/local/openssl&#8221; \<br />
&#8220;&#8211;with-md5-passwords&#8221;<br />
# make<br />
# make install</p>
<p>（1）禁用 SSH V1 协议<br />
找到：<br />
#Protocol 2,1<br />
改为：<br />
Protocol 2</p>
<p>（2）禁止root直接登录<br />
此处先建立一个普通系统用户：<br />
# useradd username<br />
# passwd username<br />
找到：<br />
#PermitRootLogin yes<br />
改为：<br />
PermitRootLogin no</p>
<p>（3）禁用服务器端GSSAPI<br />
找到以下两行，并将它们注释：<br />
GSSAPIAuthentication yes<br />
GSSAPICleanupCredentials yes</p>
<p>（4）禁用 DNS 名称解析<br />
找到：<br />
#UseDNS yes<br />
改为：<br />
UseDNS no</p>
<p>（5）禁用客户端 GSSAPI<br />
# vi /etc/ssh/ssh_config<br />
找到：<br />
GSSAPIAuthentication yes<br />
将这行注释掉。</p>
<p>最后，确认修改正确后重新启动 SSH 服务<br />
# service sshd restart<br />
# ssh -v<br />
确认 OpenSSH 以及 OpenSSL 版本正确。</p>
<p>8. FTP服务器的配置<br />
#vi /etc/vsftpd/vsftpd.conf<br />
把anonymous_enable=YES注释掉不允许匿名登录。<br />
把 chroot_list_enable=YES<br />
chroot_list_file=/etc/vsftpd.chroot_list<br />
前的注释去掉。<br />
把ftpd_banner=*前的注释去掉。后面改成你的欢迎信息(这样设置可以避免显示ftp服务器的版本信息)<br />
保存，并执行<br />
#service vsftpd start</p>
<p>这时可以用刚才添加的普通用户登陆FTP，root默认不能通过FTP方式登录。</p>
<p>三、编译安装L.A.M.P环境<br />
1. 下载软件<br />
# cd /usr/local/src<br />
# wget –c <a href="http://www.ismole.net/downloads/" target="_blank">http://www.ismole.net/downloads/</a>软件包名称<br />
httpd-2.2.6.tar.bz2<br />
mysql-5.1.24-rc-linux-i686-glibc23.tar.gz<br />
php-5.2.4.tar.bz2<br />
ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz</p>
<p>2. 安装MySQL<br />
# tar xzvf mysql-5.1.24-rc-linux-i686-glibc23.tar.gz<br />
# mv mysql-5.1.24-rc-linux-i686-glibc23  /usr/local/<br />
# ln -s /usr/local/ mysql-5.1.24-rc-linux-i686-glibc23  /usr/local/mysql<br />
# useradd mysql<br />
# chown -R mysql:root  /usr/local/mysql/<br />
# cd /usr/local/mysql<br />
# ./scripts/mysql_install_db  &#8211;user=mysql<br />
# cp ./support-files/mysql.server  /etc/rc.d/init.d/mysqld<br />
# chown root:root /etc/rc.d/init.d/mysqld<br />
# chmod 755 /etc/rc.d/init.d/mysqld<br />
# chkconfig &#8211;add mysqld<br />
# chkconfig &#8211;level 35 mysqld on<br />
# cp ./support-files/my-huge.cnf  /etc/my.cnf<br />
# mv /usr/local/mysql/data  /var/lib/mysql<br />
# chown -R mysql:mysql /var/lib/mysql/<br />
# vi /etc/my.cnf  修改以下内容：</p>
<p>（1）        在 [mysql] 段增加一行：<br />
default-character-set = utf8<br />
（2）        在 [mysqld] 段增加或修改：<br />
datadir = /var/lib/mysql<br />
&#8211;skip-innodb<br />
default-character-set = utf8<br />
&#8211;wait-timeout = 5<br />
max_connections = 512<br />
max_connect_errors = 10000000<br />
thread_concurrency = CPU个数×2<br />
将 log-bin 注释<br />
# bin/mysqladmin -u root password &#8216;password_for_root&#8217;</p>
<p>3. 编译安装Apache<br />
# cd /usr/local/src<br />
# tar xjvf httpd-2.2.6.tar.bz2<br />
# cd httpd-2.2.6<br />
# ./configure \<br />
&#8220;&#8211;prefix=/usr/local/apache2&#8243; \<br />
&#8220;&#8211;with-included-apr&#8221; \<br />
&#8220;&#8211;enable-so&#8221; \<br />
&#8220;&#8211;enable-deflate=shared&#8221; \<br />
&#8220;&#8211;enable-expires=shared&#8221; \<br />
&#8220;&#8211;enable-rewrite=shared&#8221; \<br />
&#8220;&#8211;enable-static-support&#8221; \<br />
&#8220;&#8211;disable-userdir&#8221;<br />
# make<br />
# make install<br />
# echo &#8216;/usr/local/apache2/bin/apachectl start &#8216; &gt;&gt; /etc/rc.local</p>
<p>4. 编译安装PHP<br />
# cd /usr/local/src<br />
# tar xjvf php-5.2.4.tar.bz2<br />
# cd php-5.2.4<br />
# ./configure &#8211;prefix=/usr/local/php &#8211;with-apxs2=/usr/local/apache2/bin/apxs &#8211;with-config-file-path=/usr/local/php/etc &#8211;with-mysql=/usr/local/mysql &#8211;with-libxml-dir=/usr/local/libxml2 &#8211;with-gd=/usr/local/gd2 &#8211;with-jpeg-dir &#8211;with-png-dir &#8211;with-bz2 &#8211;with-freetype-dir &#8211;with-iconv-dir &#8211;with-zlib-dir &#8211;with-mcrypt=/usr/local/libmcrypt &#8211;enable-soap &#8211;enable-gd-native-ttf &#8211;enable-ftp &#8211;enable-mbstring &#8211;enable-exif &#8211;disable-ipv6 &#8211;disable-cgi &#8211;disable-cli<br />
# make<br />
# make install<br />
# mkdir /usr/local/php/etc<br />
# cp php.ini-dist /usr/local/php/etc/php.ini</p>
<p>5. 安装Zend Optimizer<br />
# cd /usr/local/src<br />
# tar xzvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz<br />
# ./ ZendOptimizer-3.3.3-linux-glibc23-i386/install.sh<br />
安装Zend Optimizer过程的最后不要选择重启Apache。</p>
<p>6. 整合Apache与PHP<br />
# vi /usr/local/apache2/conf/httpd.conf<br />
找到：<br />
AddType application/x-gzip .gz .tgz<br />
在该行下面添加<br />
AddType application/x-httpd-php .php</p>
<p>找到：<br />
&lt;IfModule dir_module&gt;<br />
DirectoryIndex index.html<br />
&lt;/IfModule&gt;<br />
将该行改为<br />
&lt;IfModule dir_module&gt;<br />
DirectoryIndex index.html index.htm index.php<br />
&lt;/IfModule&gt;</p>
<p>找到：<br />
#Include conf/extra/httpd-mpm.conf<br />
#Include conf/extra/httpd-info.conf<br />
#Include conf/extra/httpd-vhosts.conf<br />
#Include conf/extra/httpd-default.conf<br />
去掉前面的“#”号，取消注释。</p>
<p>注意：以上 4 个扩展配置文件中的设置请按照相关原则进行合理配置！</p>
<p>修改完成后保存退出。<br />
# /usr/local/apache2/bin/apachectl restart</p>
<p>7. 查看确认L.A.M.P环境信息、提升 PHP 安全性<br />
在网站根目录放置 phpinfo.php 脚本，检查phpinfo中的各项信息是否正确。</p>
<p>确认 PHP 能够正常工作后，在 php.ini 中进行设置提升 PHP 安全性。<br />
# vi /etc/php.ini<br />
找到：<br />
disable_functions =<br />
设置为：<br />
phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server</p>
<p>三、服务器安全性设置<br />
1. 设置系统防火墙<br />
# vi /usr/local/sbin/fw.sh<br />
将以下脚本命令粘贴到 fw.sh 文件中。<br />
#!/bin/bash</p>
<p># Stop iptables service first<br />
service iptables stop</p>
<p># Load FTP Kernel modules<br />
/sbin/modprobe ip_conntrack_ftp<br />
/sbin/modprobe ip_nat_ftp</p>
<p># Inital chains default policy<br />
/sbin/iptables -F -t filter<br />
/sbin/iptables -P INPUT DROP<br />
/sbin/iptables -P OUTPUT ACCEPT</p>
<p># Enable Native Network Transfer<br />
/sbin/iptables -A INPUT -i lo -j ACCEPT</p>
<p># Accept Established Connections<br />
/sbin/iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT</p>
<p># ICMP Control<br />
/sbin/iptables -A INPUT -p icmp -m limit &#8211;limit 1/s &#8211;limit-burst 10 -j ACCEPT</p>
<p># WWW Service<br />
/sbin/iptables -A INPUT -p tcp &#8211;dport 80 -j ACCEPT</p>
<p># FTP Service<br />
/sbin/iptables -A INPUT -p tcp &#8211;dport 21 -j ACCEPT</p>
<p># SSH Service<br />
/sbin/iptables -A INPUT -p tcp &#8211;dport 22 -j ACCEPT</p>
<p># chmod 755 /usr/local/sbin/fw.sh<br />
# echo &#8216;/usr/local/sbin/fw.sh&#8217; &gt;&gt; /etc/rc.local<br />
# /usr/local/sbin/fw.sh</p>
<p>原载地址：<a href="http://www.ismole.net/thread-505-1-1.html">http://www.ismole.net/thread-505-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/18.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flickr Stats 功能的设计经验</title>
		<link>http://www.cnedwin.com/17.html</link>
		<comments>http://www.cnedwin.com/17.html#comments</comments>
		<pubDate>Tue, 29 Apr 2008 18:50:16 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[生活趣闻]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Varchar]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=17</guid>
		<description><![CDATA[继续我的学习笔记之旅。Flickr 的 DBA Dathan Pattishall 在前几天的 MySQL 大会上分享了 Scaling Heavy Concurrent Writes In Real Time (Record every Referral for Flickr Realtime) ，其中介绍了 Flickr Stats 的设计经验。国内好多 Web 站点其实也在设计类似的功能，只是不知道细节罢了。
数据结构原型
字段               数据类型
Path_query         Varchar(255)     [...]]]></description>
			<content:encoded><![CDATA[<p>继续我的学习笔记之旅。Flickr 的 DBA <a href="http://www.linkedin.com/in/dathan">Dathan Pattishall</a> 在前几天的 MySQL 大会上分享了 Scaling Heavy Concurrent Writes In Real Time (Record every Referral for Flickr Realtime) ，其中介绍了 Flickr Stats 的设计经验。国内好多 Web 站点其实也在设计类似的功能，只是不知道细节罢了。</p>
<p><span id="more-17"></span>数据结构原型</p>
<p>字段               数据类型<br />
Path_query         Varchar(255)        PK<br />
Domain             Varchar(50)<br />
Owner              Bigint<br />
When               Date<br />
Object-ID          Bigint<br />
Object-Type        Tinyint<br />
Counts and stuff   Various ints        May be some keys</p>
<p>主键是字符串，开销太大。其他的索引如果做主键，也比较大。当表大小超过内存的时候，插入速度很慢，I/O 能力也上不来。<br />
优化数据结构</p>
<p>数据预处理，通过 CONV(SUBSTR(MD5(Url),0,16),16,10) 把 Path_query 修改为 64 位的 ID (8字节), 主键为 ID+Owner+object+object-type，这个统计信息很容易抽象到一个数据对象，这个索引的设计也在于此。</p>
<p>另外补充一点，利用 PHP 的 ip2long() 和 long2ip() 函数对 IP 地址作预处理，耗费的存储空间只为原来地 25%，这是个很有趣的技巧。<br />
数据 Sharding</p>
<p>对于海量的数据，以一个礼拜为间隔，水平分割。按照不同的数据力度每周一个表，每年一个全局表，再加上一个汇总表。数据量越大，InnoDB 存储引擎针对字符串的索引浪费的空间就越大。单个查询的 I/O 也自然大了起来。</p>
<p>所有应用对 DB 的响应要求 是 300 毫秒。但高并发写入的时候响应时间就糟糕起来。Flickr 的 Java 牛人实现了 Referral 队列，每 4000 条做批量处理。这样 IO 拥塞的就解决掉了。</p>
<p>总体的服务器规模过去 介绍过，对专业版用户的数据是永久保留的，而普通用户则只保留几周，为节省空间，采用 MyISAM 引擎，当用户转为专业版时，迁移数据。</p>
<p>补充一下，抓取 URL 是用的 curl 。最后，<a href="http://www.scribd.com/doc/2594652/Record-every-Referral-for-Flickr-Realtime">这篇 PPT 在线观看</a>。</p>
<p>&#8211;EOF&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/17.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Suhosin介绍</title>
		<link>http://www.cnedwin.com/16.html</link>
		<comments>http://www.cnedwin.com/16.html#comments</comments>
		<pubDate>Tue, 29 Apr 2008 13:31:25 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Suhosin]]></category>
		<category><![CDATA[安全]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=16</guid>
		<description><![CDATA[用Suhosin加强PHP脚本语言安全性
PHP是一种非常流行之网站脚本语言，但是它本身所固有之安全性是非常薄弱。本文讲述了PHP增强计划（Hardened-PHP project）和新之Suhosi计划，Suhosin提供了增强之PHP之安全配置。

PHP是带有争论地但又是最流行之一种网站脚本语言。它之所以流行，是因为它低廉之价格，然而，这低廉之价格导致用PHP写之网站应用程序越来越多之同时也越来越多之展现出PHP本身在安全上之脆弱，这种安全特性显示出PHP是极不可靠，不过同时对这个脚本语言本身而言它又是非常灵活之，使用它就能很容易之实现代码，不过这些代码都是臃肿之且不安全之，虽然是这样它还是一直都拥有很多之使用者。你可以根据实际情况来假设，一次又一次，各种应用软件都体现了这种脆弱性：容易受到SQL注入、跨站脚本、任意执行指令等等之攻击。
因为象safe_mode和open_basedir这样内置之PHP安全措施将被忽略，PHP增强计划创建之PHP更具有安全性，同时也对PHP进行校验检查。最初，这些是由增强之PHP补丁完成之，这些补丁需要修补并重新编译PHP自身。最近，PHP增强计划发布了一个名为Suhosin之新工程。
Sohosin包括有两部分：第一部分是PHP之补丁，这个补丁强化了Zend引擎自身，以免可能产生缓冲溢出，也可以防止相关之弱点。第二部分是Suhosin之扩展，这是一个PHP之独立使用模块。这两部分可以一起工作，或者是扩展部分单独工作。
 
开发人员不希望为了达到安全性而总去维护他们自己之PHP安装设置和他们当然更喜欢直接使用销售商提供之Linux分布系统上PHP，使用扩展模块能提供更多PHP本身所不能具有之安全特点。
 
扩展模块很容易安装；它也能通过PECL安装，或者是下载后通过编译安装：
 
 
$ tar xvzf suhosin-0.9.17
 
$ cd suhosin-0.9.17
$ phpize
$ ./configure
 
 
$ make
$ sudo make install
为了使用suhosin，还需要增加/etc/php.ini，如下所示：
 
 
extension=suhosin.so
对于大部分人来说默认之配置选项已经足够了。为了加强设置，可以在/etc/php.ini中增加相应之值。网站中详细地介绍了有关之各种配置选项，这些说明可以帮助你进行初始化配置。
 
使用Suhosin，你可以得到一些错误日志，你能把这些日志放到系统日志中，也可以同时写到其他任意之日志文件中去；它还可以为每一个虚拟主机创建黑名单和白名单；可以过滤GET和POST请求、文件上载和cookie。你还能传送加密之会话和cookie，可以设置不能传送之存储上线等等。它不像原始之PHP强化补丁，Suhosin是可以被像Zend Optimizer这样之第三方扩展软件所兼容之。
]]></description>
			<content:encoded><![CDATA[<p>用Suhosin加强PHP脚本语言安全性</p>
<p>PHP是一种非常流行之网站脚本语言，但是它本身所固有之安全性是非常薄弱。本文讲述了PHP增强计划（Hardened-PHP project）和新之Suhosi计划，Suhosin提供了增强之PHP之安全配置。</p>
<p><span id="more-16"></span></p>
<p>PHP是带有争论地但又是最流行之一种网站脚本语言。它之所以流行，是因为它低廉之价格，然而，这低廉之价格导致用PHP写之网站应用程序越来越多之同时也越来越多之展现出PHP本身在安全上之脆弱，这种安全特性显示出PHP是极不可靠，不过同时对这个脚本语言本身而言它又是非常灵活之，使用它就能很容易之实现代码，不过这些代码都是臃肿之且不安全之，虽然是这样它还是一直都拥有很多之使用者。你可以根据实际情况来假设，一次又一次，各种应用软件都体现了这种脆弱性：容易受到SQL注入、跨站脚本、任意执行指令等等之攻击。</p>
<p>因为象safe_mode和open_basedir这样内置之PHP安全措施将被忽略，PHP增强计划创建之PHP更具有安全性，同时也对PHP进行校验检查。最初，这些是由增强之PHP补丁完成之，这些补丁需要修补并重新编译PHP自身。最近，PHP增强计划发布了一个名为Suhosin之新工程。</p>
<p>Sohosin包括有两部分：第一部分是PHP之补丁，这个补丁强化了Zend引擎自身，以免可能产生缓冲溢出，也可以防止相关之弱点。第二部分是Suhosin之扩展，这是一个PHP之独立使用模块。这两部分可以一起工作，或者是扩展部分单独工作。</p>
<p> </p>
<p>开发人员不希望为了达到安全性而总去维护他们自己之PHP安装设置和他们当然更喜欢直接使用销售商提供之Linux分布系统上PHP，使用扩展模块能提供更多PHP本身所不能具有之安全特点。</p>
<p> </p>
<p>扩展模块很容易安装；它也能通过PECL安装，或者是下载后通过编译安装：</p>
<p class="Bdu312"> </p>
<p> </p>
<p>$ tar xvzf suhosin-0.9.17</p>
<p> </p>
<p>$ cd suhosin-0.9.17</p>
<p>$ phpize</p>
<p>$ ./configure</p>
<p class="Bdu312"> </p>
<p> </p>
<p>$ make</p>
<p>$ sudo make install</p>
<p>为了使用suhosin，还需要增加/etc/php.ini，如下所示：</p>
<p class="Bdu312"> </p>
<p> </p>
<p>extension=suhosin.so</p>
<p>对于大部分人来说默认之配置选项已经足够了。为了加强设置，可以在/etc/php.ini中增加相应之值。网站中详细地介绍了有关之各种配置选项，这些说明可以帮助你进行初始化配置。</p>
<p> </p>
<p>使用Suhosin，你可以得到一些错误日志，你能把这些日志放到系统日志中，也可以同时写到其他任意之日志文件中去；它还可以为每一个虚拟主机创建黑名单和白名单；可以过滤GET和POST请求、文件上载和cookie。你还能传送加密之会话和cookie，可以设置不能传送之存储上线等等。它不像原始之PHP强化补丁，Suhosin是可以被像Zend Optimizer这样之第三方扩展软件所兼容之。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/16.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]PHP语言教父炮轰Java:已输掉Web之战</title>
		<link>http://www.cnedwin.com/13.html</link>
		<comments>http://www.cnedwin.com/13.html#comments</comments>
		<pubDate>Thu, 17 Apr 2008 10:22:49 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[行业动态]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[教父]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=13</guid>
		<description><![CDATA[PHP 3之后的主要语言开发者之一、Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言。他指出，目前Java厂商试图在JVM上提供动态语言实现的路子根本不对，应该全面拥抱标准的动态语言。
由于Gutmans的特殊地位，他的这篇长文已经在技术界引发了强烈争议。参见其blog上和TSS上的讨论1，2。
下面是对全文的一个编译版本，基本反映了原貌。其中对多核环境中多线程（JVM）与多进程（LAMP）的比较，C语言生态系统以及开源语言与Java等厂商语言和技术的比较，感觉都是非常有价值的。


翻译全文
Gutmans 回忆自己几 年前参与的一个基于IBM Websphere的大型企业级项目。项目团队中无论开发还是架构人员都非常出色，但其中最优秀的人与Andi谈起PHP和动态语言时，还是将之视为玩具 语言。这在当时正是Java界对动态语言的典型心态。但是，他们恰恰忽视了Web，因此Java EE设计时并没有以Web为中心，而且关注在企业集成、事务管理和其他后端处理上。虽然Java EE通过servlet和JSP支持Web开发也有不短的历史，但是掌握标准发展的大公司们忽视了Web的RESTful本质，仍然在向通用平台的方向上 走。
而与此同时，建于C语言库和工具的生态系统之上的LAMP架构，则成了Web程序最流行的开发平台。其中最常用的语言是PHP。由于 PHP专注于Web开发，而且为此不断演变，它简直就是为Web范型（paradigm）量身打造的，能够快速和容易地解决常见的Web问题，因此获得了 最大的市场份额。根据Ajaxian.com的调查，大约50%的RIA开发人员都使用PHP。由于各种PHP程序如Wordpress, Drupal, mediaWiki, osCommerce, SugarCRM的流行，这种趋势更加明显。
随着大多数业务应用程序包 括CRM、ERP、报表、文档管理等等也都转向了Web，那些大的Java厂商都意识到，Java对Web范型的形成和发展影响甚微，因此他们开始支持各 种标准和非标准的Java Web框架（JSF、Struts、Spring MVC等等），要使Java适应Web。这些框架虽然有些也取得了一定成功，但是它们都无法解决Java在Web上的主要问题：由于严格的类型化和架构过 度复杂，开发时间和开发人员的技能要求都更高，也就是说，总成本无法令人满意。
而且，大的Java厂商还什么都想占着。一方面想融入Web，一方面又不肯放弃自己已经在Java上建立起来的数十亿计的生意。甚至动态语言的广泛流行都未能显著改变他们的行为模式。但是随着微软雄心勃勃的多语言运行环境.NET的出现，大势又变了。
成 功的动态语言包括PHP, Perl, Python和Ruby都是用C写的，充分利用了C语言库生态系统的广泛性和深入性。而且它们都是社区驱动的，没有什么正八经的语言规范，发展不会被公司 政治所阻碍。这些语言都是由使用者自己开发的，他们只有一个目的：快速搞定工作。因此语言可能在小的版本更新时就加入重要的改进。这种敏捷本质正是适应 Web应用快速变化必需的。
而且，LAMP的部署方式有显著的优势。在多进程架构中，Web服务器和动态语言软件中的故障一般不会使网站 垮掉。虽然会有某个进程崩溃，但其他服务Web 请求的进程仍然可以继续运行。这与JVM这种多线程的环境中软件故障包括崩溃和死锁通常都会使系统垮掉，形成了鲜明对比。而且在特定时间后回收进程的能力 能够防止内存泄漏和内存碎片化这两种常见的内存问题使软件随着时间推移性能降低。LAMP上软件更新时，可以轻松和渐增地推到服务器，无需冗长的构建和打 包。虽然有时这会带来不规范、不严格的问题，但是只要正确实施，开发人员和运营人员的日子都会好过得多。
相比之下，Java厂商受困于与 Java绑定太紧对多种语言的支持很少的JVM。他们并没有转向能够使其客户两全其美的LAMP和Java技术松耦合的模型，而是患得患失，怕失去对客户 的控制，竞相在JVM上提供动态语言。无论是微软这个强敌，还是Java中互相竞争的厂商，都在实施自己的动态语言策略。
现在，Sun正 在其Java EE解决方案上支持JRuby和Jython而投入；IBM Websphere集团则认识到Java EE平台运行现代Web应用的无效，在Project Zero上大力投入，该项目的目的是使IBM在Web 2.0世界中也能有一席之地，目前支持Groovy和PHP；BEA也有一些孵化项目，但是被Oracle并购后，这些项目是否能有结果目前不明。 Project Zero的首席架构师是IBM公司里最先公开承认Java现在可以认为只是一种系统语言而不适合构建RESTful Web应用的几个人之一。而构建RESTful Web应用正是Project Zero的目的。Java堡垒花了10年多时间才承认Java在Web上投资回报不佳，而目前的趋势，将有更多的客户做出更明智的选择。动态语言将有大的 提升。与大型机一样，Java已经在企业级IT和关键业务应用中根深叶茂，因此不会很快消失。但是在Web应用上，Java语言很可能会在市场份额上急剧 下降。
问题在于，非微软的Web市场是会采用动态语言的JVM实现，还是容纳这些语言事实标准实现的LAMP架构。虽然我认为会有客户被前者吸引，但是市场主流还是会选择LAMP。原因在于：
1. 标准实现更新速度很快，而JVM版本总是滞后，会带来兼容性问题。这与Mono跟不上.NET的问题类似。
2. JVM最初设计时并没有考虑支持动态语言，因此在可见的将来，要满足实际需求，挑战非常大。像闭包、间接方法调用和类型juggling等动态特性就不容 易解决，这从目前JRuby与Ruby的C版本的比较中可以看出。而且，硬件厂商是否有兴趣跟上也是有待观察的。而开源技术就没有这种问题。
3. 现代Web的可伸缩需求对Web层的处理强度的要求越来越大。基于C的架构更可能与操作系统底层（原文为primitives）最有效地互操作，提供高 效、内存占用小的架构，满足这种强度。高性能的Web服务器比如lighttpd, Zeus, IIS 7，高性能的缓存系统比如Facebook等最大的网站使用的memcached，还有其他性能关键的子系统比如内存管理，都是例子。
4. 多核系统非常适合LAMP架构的多进程方式。随着芯片业现在把主要精力都放在了多核而不是超线程技术上，JVM这样的多线程环境的优点在今天的硬件上将无法充分发挥。而多进程方式将提供更多稳定性和可靠性。
5. 由于LAMP的简单性，它对于开发人员而言进入门槛非常低，而又能够提供很好的伸缩性，包括Yahoo和Facebook这样的大规模产品系统。
总 [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 3之后的主要语言开发者之一、Zend公司的创始人之一Andi Gutmans最近在blog中直言不讳地批评了Java语言。他指出，目前Java厂商试图在JVM上提供动态语言实现的路子根本不对，应该全面拥抱标准的动态语言。</p>
<p>由于Gutmans的特殊地位，他的这篇长文已经在技术界引发了强烈争议。参见其blog上和TSS上的讨论1，2。</p>
<p>下面是对全文的一个编译版本，基本反映了原貌。其中对多核环境中多线程（JVM）与多进程（LAMP）的比较，C语言生态系统以及开源语言与Java等厂商语言和技术的比较，感觉都是非常有价值的。</p>
<p><span id="more-13"></span><br />
<strong><br />
翻译全文</strong></p>
<p>Gutmans 回忆自己几 年前参与的一个基于IBM Websphere的大型企业级项目。项目团队中无论开发还是架构人员都非常出色，但其中最优秀的人与Andi谈起PHP和动态语言时，还是将之视为玩具 语言。这在当时正是Java界对动态语言的典型心态。但是，他们恰恰忽视了Web，因此Java EE设计时并没有以Web为中心，而且关注在企业集成、事务管理和其他后端处理上。虽然Java EE通过servlet和JSP支持Web开发也有不短的历史，但是掌握标准发展的大公司们忽视了Web的RESTful本质，仍然在向通用平台的方向上 走。</p>
<p>而与此同时，建于C语言库和工具的生态系统之上的LAMP架构，则成了Web程序最流行的开发平台。其中最常用的语言是PHP。由于 PHP专注于Web开发，而且为此不断演变，它简直就是为Web范型（paradigm）量身打造的，能够快速和容易地解决常见的Web问题，因此获得了 最大的市场份额。根据Ajaxian.com的调查，大约50%的RIA开发人员都使用PHP。由于各种PHP程序如Wordpress, Drupal, mediaWiki, osCommerce, SugarCRM的流行，这种趋势更加明显。</p>
<p>随着大多数业务应用程序包 括CRM、ERP、报表、文档管理等等也都转向了Web，那些大的Java厂商都意识到，Java对Web范型的形成和发展影响甚微，因此他们开始支持各 种标准和非标准的Java Web框架（JSF、Struts、Spring MVC等等），要使Java适应Web。这些框架虽然有些也取得了一定成功，但是它们都无法解决Java在Web上的主要问题：由于严格的类型化和架构过 度复杂，开发时间和开发人员的技能要求都更高，也就是说，总成本无法令人满意。</p>
<p>而且，大的Java厂商还什么都想占着。一方面想融入Web，一方面又不肯放弃自己已经在Java上建立起来的数十亿计的生意。甚至动态语言的广泛流行都未能显著改变他们的行为模式。但是随着微软雄心勃勃的多语言运行环境.NET的出现，大势又变了。</p>
<p>成 功的动态语言包括PHP, Perl, Python和Ruby都是用C写的，充分利用了C语言库生态系统的广泛性和深入性。而且它们都是社区驱动的，没有什么正八经的语言规范，发展不会被公司 政治所阻碍。这些语言都是由使用者自己开发的，他们只有一个目的：快速搞定工作。因此语言可能在小的版本更新时就加入重要的改进。这种敏捷本质正是适应 Web应用快速变化必需的。</p>
<p>而且，LAMP的部署方式有显著的优势。在多进程架构中，Web服务器和动态语言软件中的故障一般不会使网站 垮掉。虽然会有某个进程崩溃，但其他服务Web 请求的进程仍然可以继续运行。这与JVM这种多线程的环境中软件故障包括崩溃和死锁通常都会使系统垮掉，形成了鲜明对比。而且在特定时间后回收进程的能力 能够防止内存泄漏和内存碎片化这两种常见的内存问题使软件随着时间推移性能降低。LAMP上软件更新时，可以轻松和渐增地推到服务器，无需冗长的构建和打 包。虽然有时这会带来不规范、不严格的问题，但是只要正确实施，开发人员和运营人员的日子都会好过得多。</p>
<p>相比之下，Java厂商受困于与 Java绑定太紧对多种语言的支持很少的JVM。他们并没有转向能够使其客户两全其美的LAMP和Java技术松耦合的模型，而是患得患失，怕失去对客户 的控制，竞相在JVM上提供动态语言。无论是微软这个强敌，还是Java中互相竞争的厂商，都在实施自己的动态语言策略。</p>
<p>现在，Sun正 在其Java EE解决方案上支持JRuby和Jython而投入；IBM Websphere集团则认识到Java EE平台运行现代Web应用的无效，在Project Zero上大力投入，该项目的目的是使IBM在Web 2.0世界中也能有一席之地，目前支持Groovy和PHP；BEA也有一些孵化项目，但是被Oracle并购后，这些项目是否能有结果目前不明。 Project Zero的首席架构师是IBM公司里最先公开承认Java现在可以认为只是一种系统语言而不适合构建RESTful Web应用的几个人之一。而构建RESTful Web应用正是Project Zero的目的。Java堡垒花了10年多时间才承认Java在Web上投资回报不佳，而目前的趋势，将有更多的客户做出更明智的选择。动态语言将有大的 提升。与大型机一样，Java已经在企业级IT和关键业务应用中根深叶茂，因此不会很快消失。但是在Web应用上，Java语言很可能会在市场份额上急剧 下降。</p>
<p>问题在于，非微软的Web市场是会采用动态语言的JVM实现，还是容纳这些语言事实标准实现的LAMP架构。虽然我认为会有客户被前者吸引，但是市场主流还是会选择LAMP。原因在于：</p>
<p>1. 标准实现更新速度很快，而JVM版本总是滞后，会带来兼容性问题。这与Mono跟不上.NET的问题类似。</p>
<p>2. JVM最初设计时并没有考虑支持动态语言，因此在可见的将来，要满足实际需求，挑战非常大。像闭包、间接方法调用和类型juggling等动态特性就不容 易解决，这从目前JRuby与Ruby的C版本的比较中可以看出。而且，硬件厂商是否有兴趣跟上也是有待观察的。而开源技术就没有这种问题。</p>
<p>3. 现代Web的可伸缩需求对Web层的处理强度的要求越来越大。基于C的架构更可能与操作系统底层（原文为primitives）最有效地互操作，提供高 效、内存占用小的架构，满足这种强度。高性能的Web服务器比如lighttpd, Zeus, IIS 7，高性能的缓存系统比如Facebook等最大的网站使用的memcached，还有其他性能关键的子系统比如内存管理，都是例子。</p>
<p>4. 多核系统非常适合LAMP架构的多进程方式。随着芯片业现在把主要精力都放在了多核而不是超线程技术上，JVM这样的多线程环境的优点在今天的硬件上将无法充分发挥。而多进程方式将提供更多稳定性和可靠性。</p>
<p>5. 由于LAMP的简单性，它对于开发人员而言进入门槛非常低，而又能够提供很好的伸缩性，包括Yahoo和Facebook这样的大规模产品系统。</p>
<p>总 而言之，越来越清楚的是，动态语言将逐渐成为Web开发的标准。微软和Java厂商都认识到这个趋势，现在正在各自的软件平台之大力投入，给出解决方案。 但是，因为主要动态语言社区都是在.NET CLR和Java JVM软件平台之外发展起来的，这些厂商如果只是想依靠将成功的动态语言复制到自己的平台上而反败为胜，他们将处于困难的境地。有些厂商已经意识到这一情 况，采用了一些混合策略，同时为客户提供动态语言的标准实现，虽然还没有完全与其解决方案组合配合起来。微软在PHP上的投入就是如此，Sun也开始为客 户提供原生的Ruby和PHP实现。我相信虽然JVM向动态语言抛出的橄榄枝可能会吸引一些Java客户，但是这无法跟上开源社区开发原生动态语言实现的 步伐。JVM的动态语言实现对于Java厂商与时俱进是不够的，它们需要全面地拥抱原生的事实标准的社区驱动的动态语言。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/13.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MooPHP开发框架简介</title>
		<link>http://www.cnedwin.com/12.html</link>
		<comments>http://www.cnedwin.com/12.html#comments</comments>
		<pubDate>Thu, 17 Apr 2008 09:49:59 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[行业动态]]></category>
		<category><![CDATA[MooPHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[奇矩互动]]></category>
		<category><![CDATA[开发框架]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=12</guid>
		<description><![CDATA[====== MooPHP框架简介 ======
===== 序言 =====
从整个PHP产业来看，随着PHP语言的日益流行，PHP的市场占有率不断提高，各种PHP框架也层出不穷。通过借鉴.Net、Java、Ruby On Rails等语言的开发思想，使得PHP在快速开发、企业应用等方面逐渐站在了Web开发语言的前端。
纵观国外的Zend Framework、CakePHP；国内的FleaPHP、ThinkPHP等这些优秀的PHP开源框架，我们不难发现它们对于PHP初学者还不够友好。较高的入门难度和庞大的体系，已经不能完全满足当前PHP业界日益增长的多种多样的PHP需求。这些PHP开发框架都是非常出色的，但是由于文档、设计思想、开发模式、入门难度中的一点或者几点降低了它们的广泛适用性，同时也为其他PHP开发框架提供了发展的机会。由此，MooPHP应运而生。
实际上，从国外到国内各大PHP专业论坛关于PHP的讨论相当激烈，对于技术永无止境的追求让我们乐此不疲，但是我们应该想到：为PHP初学者提供更大的帮助会对整个PHP业界产生更大的推动力。我敬佩国内外做开源软件和开源框架的朋友们，让我们一起伴随MooPHP为整个开源世界共享自己的一份力量。

===== MooPHP简介 =====
MooPHP，全名是More &#38; Original PHP Framwork。从MooPHP的全名我们就可以感受到MooPHP框架的设计理念：在安全、高效、稳定、易用的前提下，还原PHP语言的原生态；以松耦合的方式，进一步增强了MooPHP的扩展性。与Zend Framework、FleaPHP等PHP开发框架一样，MooPHP除了核心之外，基于其本身松耦合的特性，非常容易进行外围的扩展。
不可否认，在PHP社区宣布停止对PHP4支持的今天，PHP4的程序仍然占据着主要的地位。MooPHP以其原生态的PHP语言，很好的使用了PHP4、PHP5等多种PHP运行环境，并良好的运行于各种服务器构架中。
==== 语法特点 ====
下面仅以一例来说明MooPHP的语法特点。
=== 安全 ===
PHP程序的漏洞可以说有一半以上是由于变量的未过滤或者未初始化造成的，尤其是数字型变量。在MooPHP中，通过MooGetGPC函数对GPC变量的获得途径和方法做了硬性规定，以保证获得的数据是合法、有效、纯洁的数据。
&#60;code=php&#62;
/**
* 获取GPC变量。对于type为integer的变量强制转化为数字型
* @param string $key &#8211; 权限表达式
* @param string $type &#8211; integer 数字类型；string 字符串类型；array 数组类型
* @param string $var &#8211; R $REQUEST变量；G $GET变量；P $POST变量；C $COOKIE变量
* @return string 返回经过过滤或者初始化的GPC变量
*/
function MooGetGPC($key, $type = &#8216;integer&#8217;, $var = &#8216;R&#8217;) {
switch($var) {
case &#8216;G&#8217;: [...]]]></description>
			<content:encoded><![CDATA[<p>====== MooPHP框架简介 ======<br />
===== 序言 =====<br />
从整个PHP产业来看，随着PHP语言的日益流行，PHP的市场占有率不断提高，各种PHP框架也层出不穷。通过借鉴.Net、Java、Ruby On Rails等语言的开发思想，使得PHP在快速开发、企业应用等方面逐渐站在了Web开发语言的前端。</p>
<p>纵观国外的Zend Framework、CakePHP；国内的FleaPHP、ThinkPHP等这些优秀的PHP开源框架，我们不难发现它们对于PHP初学者还不够友好。较高的入门难度和庞大的体系，已经不能完全满足当前PHP业界日益增长的多种多样的PHP需求。这些PHP开发框架都是非常出色的，但是由于文档、设计思想、开发模式、入门难度中的一点或者几点降低了它们的广泛适用性，同时也为其他PHP开发框架提供了发展的机会。由此，MooPHP应运而生。</p>
<p>实际上，从国外到国内各大PHP专业论坛关于PHP的讨论相当激烈，对于技术永无止境的追求让我们乐此不疲，但是我们应该想到：为PHP初学者提供更大的帮助会对整个PHP业界产生更大的推动力。我敬佩国内外做开源软件和开源框架的朋友们，让我们一起伴随MooPHP为整个开源世界共享自己的一份力量。</p>
<p><span id="more-12"></span></p>
<p>===== MooPHP简介 =====<br />
MooPHP，全名是More &amp; Original PHP Framwork。从MooPHP的全名我们就可以感受到MooPHP框架的设计理念：在安全、高效、稳定、易用的前提下，还原PHP语言的原生态；以松耦合的方式，进一步增强了MooPHP的扩展性。与Zend Framework、FleaPHP等PHP开发框架一样，MooPHP除了核心之外，基于其本身松耦合的特性，非常容易进行外围的扩展。</p>
<p>不可否认，在PHP社区宣布停止对PHP4支持的今天，PHP4的程序仍然占据着主要的地位。MooPHP以其原生态的PHP语言，很好的使用了PHP4、PHP5等多种PHP运行环境，并良好的运行于各种服务器构架中。</p>
<p>==== 语法特点 ====<br />
下面仅以一例来说明MooPHP的语法特点。<br />
=== 安全 ===<br />
PHP程序的漏洞可以说有一半以上是由于变量的未过滤或者未初始化造成的，尤其是数字型变量。在MooPHP中，通过MooGetGPC函数对GPC变量的获得途径和方法做了硬性规定，以保证获得的数据是合法、有效、纯洁的数据。<br />
&lt;code=php&gt;<br />
/**<br />
* 获取GPC变量。对于type为integer的变量强制转化为数字型<br />
* @param string $key &#8211; 权限表达式<br />
* @param string $type &#8211; integer 数字类型；string 字符串类型；array 数组类型<br />
* @param string $var &#8211; R $REQUEST变量；G $GET变量；P $POST变量；C $COOKIE变量<br />
* @return string 返回经过过滤或者初始化的GPC变量<br />
*/<br />
function MooGetGPC($key, $type = &#8216;integer&#8217;, $var = &#8216;R&#8217;) {<br />
switch($var) {<br />
case &#8216;G&#8217;: $var = &amp;$_GET; break;<br />
case &#8216;P&#8217;: $var = &amp;$_POST; break;<br />
case &#8216;C&#8217;: $var = &amp;$_COOKIE; break;<br />
case &#8216;R&#8217;: $var = &amp;$_REQUEST; break;<br />
}<br />
switch($type) {<br />
case &#8216;integer&#8217;:<br />
$return = intval($var[$key]);<br />
break;<br />
case &#8217;string&#8217;:<br />
$return = isset($var[$key]) ? $var[$key] : NULL;<br />
break;<br />
case &#8216;array&#8217;:<br />
$return = isset($var[$key]) ? $var[$key] : array();<br />
break;<br />
default:<br />
$return = intval($var[$key]);<br />
}<br />
return $return;<br />
}</p>
<p>/**<br />
* 为变量或者数组添加转义<br />
* @param string $value &#8211; 字符串或者数组变量<br />
* @return array<br />
*/<br />
function MooAddslashes($value) {<br />
return $value = is_array($value) ? array_map(&#8217;MooAddslashes&#8217;, $value) : addslashes($value);<br />
}<br />
&lt;/code&gt;</p>
<p>=== 易用 ===<br />
下面的MooWriteFile函数，将PHP中的fopen、flock、fwrite、fclose等四个文件操作函数合并为一。由于文件操作在PHP开发中的常用性，MooPHP更将常用文件以及文件夹操作封装起来，极大的方便了PHP开发。<br />
&lt;code=php&gt;<br />
/**<br />
* 写文件<br />
* @param string $file &#8211; 需要写入的文件，系统的绝对路径加文件名<br />
* @param string $content &#8211; 学要写入的内容<br />
* @param string $mod &#8211; 写入模式，默认为w<br />
* @return boolean 返回是否写入成功<br />
*/<br />
function MooWriteFile($file, $content, $mod = &#8216;w&#8217;) {<br />
if(@$fp = @fopen($file, $mod)) {<br />
@flock($fp, 2);<br />
@fwrite($fp, $content);<br />
@fclose($fp);<br />
return true;<br />
}<br />
}<br />
&lt;/code&gt;</p>
<p>=== 稳定 ===<br />
MooPHP是其创始人及其团队两年以来，通过大大小小几十件案例、四次重新架构并最终定型而来的。她凝聚着一个团队对于PHP快速开发以及项目公司培训PHP初学者的独特理解。并且通过持续研究和更深入的探讨，具有长远的发展历史和多年经验的精华积累。</p>
<p>更为惊喜的是，MooPHP已经有了一个稳定的团队，并且由商业公司提供资金支持。这可以保证MooPHP项目具有稳定、可持续的发展，采用MooPHP作为应用程序基础架构是您不二的选择。</p>
<p>=== 高效 ===<br />
MooPHP核心主文件MooPHP/MooPHP.php文件真正核心代码，不超过200行。并有模板缓存，生成静态等一系列成熟的解决方案。高效一直是我们的追求，并付诸于MooPHP实践。</p>
<p>更多的技术细节将不再继续阐述，如果您有兴趣可以参阅MooPHP文档中心：http://www.moophp.net</p>
<p>==== 兼容性 ====<br />
PHP5代表着PHP未来的发展方向，但现实情况是即便在全世界范围内而言，PHP4的市场占有率也是不可忽视的很重要一部分。所以，MooPHP的当前版本仍然基于PHP4开发，虽然没法利用PHP5的一些新特性，却最大程度的保护了开发者的前期技术投资。</p>
<p>==== 完全中文化 ====<br />
MooPHP是国内开发者创建的，所以从源代码注释到文档，所有的一切都是中文。这对于学习使用框架的开发者来说，将提供巨大的便利。即便有问题，也可以在QQ群和论坛上得到及时反馈。</p>
<p>==== 扩展性高 ====<br />
在前面的介绍中，我们已经知道MooPHP以松耦合的体系搭建起了整个框架。松耦合的主要特点就是更灵活，在此架构的支持下，加上MooPHP从开始就已经注意到了扩展性的重要性，MooPHP的扩展性可想而知。</p>
<p>==== BSD协议 ====<br />
MooPHP开源PHP开发框架采用所有开源协议中，几乎是最“自由”的BSD协议。赋予使用者更高的使用权和决策权。有关BSD协议的详细信息，请参考：http://www.opensource.org/licenses/bsd-license.php 。选择MooPHP来做为项目的基础架构，完全不用担心遇到许可协议问题。</p>
<p>==== 模板体系 ====<br />
经过深入的研究和细致的探寻，MooPHP从其他成熟模板引擎吸取了大量经验和实例，放弃采用任何成熟的模板引擎，而是集众家之所长独立研发了MooTemplate模板引擎。并将其在MooPHP框架中实现。</p>
<p>MooTemplate模板引擎不仅解决了困扰已久的速度瓶颈问题，而且模板中包含丰富易用的逻辑功能，又完美的实现了模板的可扩展性，使得一个模板足以容纳一个页面的全部信息，而不必再像以往那样必须用十几个小模板才能完成一个具有逻辑功能的页面。将为界面的扩充带来极大方便——只需修改模板就可实现一些基本的页面功能而不必改动程序。</p>
<p>MooTemplate模板引擎主要特点如下：</p>
<p>* 在模板内实现了数据输出，如输出常量、输出变量。<br />
* 在模板内实现了条件判断，涉及的模板标签有{if}、{else}、{elseif}、{/if}<br />
* 在模板内实现了数组循环、数组嵌套循环，涉及的模板标签有{loop}、{/loop}<br />
* 在模板内实现了嵌套子模板template标签，涉及的模板标签有{template}<br />
* 在模板内实现了PHP语法中的包含文件，涉及的模板标签有{include}<br />
* 在模板内实现了PHP语法中的for循环，涉及的模板标签有{for}、{/for}<br />
* 在模板内实现了模板内书写PHP语法，涉及的模板标签有{php}<br />
* 在模板内实现了数据查询block标签，涉及的模板标签有{block}（独创的**可扩展**标签）</p>
<p>更多详情，请查阅：http://www.moophp.net/documents/templatesyntax</p>
<p>==== 数据库访问 ====<br />
MooPHP封装了常用的MySQL、SQLite等数据库的常用操作。并仍旧按照原生态的思想，不对SQL查询进行过多的干扰，极大的提高了MooPHP在数据库方面的适用性和易用性。</p>
<p>==== 后台体系 ====<br />
我们一向是追求快捷开发项目，而一般的项目都需要有一个管理的后台。所以基于此需求，MooPHP提供了一个快捷的构建管理后台的后台类。后台类使用非常的方便灵活。你需要做的就是关注你具体细节实现的部分。 以下就是构建一个常用管理后台界面的代码：<br />
&lt;code=php&gt;<br />
//note 加载MooPHP框架<br />
require dirname(__FILE__) . &#8216;/MooPHP/MooPHP.php&#8217;;</p>
<p>//note 菜单的配置信息<br />
require MOOPHP_ROOT.&#8217;/../Moo-admin/menu.inc.php&#8217;;</p>
<p>//note  载入MooAdminTemplate类<br />
$admin = MooAutoLoad(&#8217;MooAdminTemplate&#8217;);</p>
<p>//note 取得动作和菜单变量<br />
$menu = MooGetGPC(&#8217;menu&#8217;, &#8217;string&#8217;);<br />
$action = MooGetGPC(&#8217;action&#8217;, &#8217;string&#8217;);<br />
$operation = MooGetGPC(&#8217;operation&#8217;, &#8217;string&#8217;);</p>
<p>//note 根据条件输出菜单<br />
if($menu == &#8216;topMenu&#8217;) {<br />
//note 构造头部菜单<br />
$admin-&gt;topMenu($topMenu);</p>
<p>} elseif ($menu  == &#8216;leftMenu&#8217;) {<br />
//note 构造左侧边菜单<br />
$admin-&gt;leftMenu($leftMenu);</p>
<p>} elseif (!$menu &amp;&amp; !$action) {<br />
//note 初始化框架页面<br />
$admin-&gt;frame(&#8217;?menu=topMenu&#8217;, &#8216;?menu=leftMenu&#8217;, &#8216;?action=basic&#8217;);<br />
}</p>
<p>//note 头部信息<br />
$admin-&gt;adminHeader();</p>
<p>//note 加载需要模块 此处省略相关变量过滤过程<br />
if(file_exists(MOOPHP_ROOT.&#8217;/../Moo-admin/&#8217;.$action.&#8217;.inc.php&#8217;)) {<br />
require MOOPHP_ROOT.&#8217;/../Moo-admin/&#8217;.$action.&#8217;.inc.php&#8217;;<br />
}</p>
<p>//note 尾部信息<br />
$admin-&gt;adminFooter();<br />
&lt;/code&gt;</p>
<p>===== 后记 =====<br />
其实PHP框架都有大同小异的地方，框架的目的或在于提高开发效率、或规范团队开发、或者是其他目的。但是最核心的目的永远是方便PHP开发，本着这个目的，MooPHP一直在努力。</p>
<p>如果您对MooPHP感兴趣，不妨到<a href="http://www.moophp.net">http://www.moophp.net</a> <a href="http://www.ismole.net">http://www.ismole.net</a>上更加深入的了解。我们也热切的希望更多的PHP开发者加入到MooPHP的行列中来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/12.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从PHP的模板引擎看Discuz!模板机制</title>
		<link>http://www.cnedwin.com/4.html</link>
		<comments>http://www.cnedwin.com/4.html#comments</comments>
		<pubDate>Thu, 03 Apr 2008 02:46:30 +0000</pubDate>
		<dc:creator>Edwin</dc:creator>
				<category><![CDATA[技术探讨]]></category>
		<category><![CDATA[Discuz!]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[模板]]></category>

		<guid isPermaLink="false">http://www.cnedwin.com/?p=4</guid>
		<description><![CDATA[本文是MooPHP创始人Kimi写的，感觉不错，分享一下
一、关于模板引擎的前言
从phplib到smarty，再到Discuz!的模板机制，本文试图通过PHP模板引擎为你讲解作者自己的PHP心得。
我清楚的记得在我刚上大学开始学习PHP的时候，曾经在phpe.net看到过一篇关于phplib Template和FastTemplate这两模板引擎性能比较的文章。让我在接下来半年的时间内持续的使用着phplib。不可否认phplib是左右了一代PHP开发人员对于PHP模板引擎的认识。或许你也会对下面的方法比较熟悉

$t-&#62;set_file
$t-&#62;set_var
当我对于phplib的执行效率不满意的时候，我开始寻找下一个PHP的模板引擎，于是smarty跳入我的视野范围，当我费尽心血去学会了smarty并使用开发了很多东西，而现在的我突然发现记得的也就只有下面的方法了
$s-&#62;assign
$s-&#62;display
究竟我们需要模板引擎来做什么呢，MVC？简单？易用？效率？请看下文的分析。
二、程序处理的分析
1.PHPLIB的程序处理过程
从phplib的处理开始讲起
$t = new Template()
$t-&#62;set_file
$t-&#62;set_var
$t-&#62;parse
$t-&#62;p
看上面的代码，翻译成中文就是
[*]初始化模板类$t
[*]设置模板文件
[*]设置模板变量
[*]分析模板文件中的模板变量
[*]输出内容
通过了最少5个步骤在php程序中实现模板的处理
2.Smarty的程序处理过程
现在来看smarty的处理
$s = new Smarty
$s-&#62;assign
$s-&#62;display
翻译成中文就是
[*]初始化模板类$s
[*]设置模板变量
[*]解析并输出模板
3.Discuz!模板的程序处理过程
include template(tplname);
主要作用就是指定给程序需要处理的模板文件
在上述三种模板处理机制中，最容易理解和接受就是Discuz!模板的处理过程。初始化、设置变量、解析模板、输出内容，Discuz!只用了一个函数来做。对于一个开源的论坛软件，这样处理的好处是显而易见的，对于Discuz!进行二次开发的程序员的要求降低。简化模板语言，方便风格和插件的制作，这也在一定程度上促进了Discuz!的传播
三、模板源文件的语法
在phplib中处理循环嵌套的时候，使用：
&#60;!&#8211;    BEGIN row   &#8211;&#62;
{it}
&#60;!&#8211;     END row    &#8211;&#62;
在smarty中处理循环嵌套的时候，引入了
&#60;{section name=loopName loop=$loopArray}&#62;（当然还有foreach这样的）
在Discuz!中处理循环嵌套的时候，
&#60;!&#8211;{loop $array $value}&#8211;&#62;
其实真正的模板面对的可以说是不懂PHP或者懂一点PHP的美工同志们，模板的复杂就意味着美工制作页面的难度加大。在必不可少的需要模板有逻辑处理的时候，为什么不在html代码中使用原生态的PHP语法，而让美工相当于去学习另外一种语言呢？在我个人的经验中，显然是Discuz!的模板语言更为简单易学，也为我节省了更多的时间。
四、Discuz!模板处理机制
我剥离出一个简单的Discuz!模板处理函数
function template($file, $templateid = 0, $tpldir = &#8221;) {
$tplfile = DISCUZ_ROOT.&#8217;./&#8217;.$tpldir.&#8217;/&#8217;.$file.&#8217;.htm&#8217;;//模板源文件，此处$tplfile变量的值可能是D:\discuz\templates\default\demo.htm
$objfile = DISCUZ_ROOT.&#8217;./forumdata/templates/&#8217;.$templateid.&#8217;_&#8217;.$file.&#8217;.tpl.php&#8217;;//模板缓存文件，此处$objfile变量的值可能是D:\discuz\forumdata\templates\1_demo.tpl.php
//如果模板源文件的修改时间迟于模板缓存文件的修改时间，
//就是模板源文件被修改而模板缓存没有更新的时候，
//则调用parse_template函数重新生成模板缓存文件。
if(@filemtime($tplfile) &#62; @filemtime($objfile)) {
require_once DISCUZ_ROOT.&#8217;./include/template.func.php&#8217;;
parse_template($file, $templateid, $tpldir);
}
//返回缓存文件名称
//$objfile变量内容可能为D:\discuz\forumdata\templates\1_demo.tpl.php
return $objfile;
}
而php页面的模板执行语句
include template(&#8217;demo&#8217;);
实际上在本例中就是相当于
include &#8216;D:\discuz\forumdata\templates\1_demo.tpl.php&#8217;;
这个流程就是一个demo.php文件中当数据处理完成以后include template(&#8217;demo&#8217;)，去显示页面。
五、总结
我也曾经看到过有列举出很多种的PHP模板引擎，但是我觉着phplib、smarty、Discuz!模板机制就足以说明问题了。
1.我们需要模板来做什么？
分离程序与界面，为程序开发以及后期维护提供方便。
2.我们还在关心什么？
PHP模板引擎的效率，易用性，可维护性。
3.最后的要求什么？
简单就是美！
我的文章好像没有写完，其实已经写完了，我要说明的就是从PHP的模板引擎看Discuz!模板机制。分析已经完成，或许以后我会再写篇实际数据的测试供给大家参考！
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ismole.net/thread-60-1-1.html">本文</a>是MooPHP创始人<a href="http://www.ismole.net/space.php?action=viewpro&amp;uid=2">Kimi</a>写的，感觉不错，分享一下</p>
<p>一、关于模板引擎的前言<br />
从phplib到smarty，再到Discuz!的模板机制，本文试图通过PHP模板引擎为你讲解作者自己的PHP心得。</p>
<p>我清楚的记得在我刚上大学开始学习PHP的时候，曾经在phpe.net看到过一篇关于phplib Template和FastTemplate这两模板引擎性能比较的文章。让我在接下来半年的时间内持续的使用着phplib。不可否认phplib是左右了一代PHP开发人员对于PHP模板引擎的认识。或许你也会对下面的方法比较熟悉</p>
<p><span id="more-4"></span><br />
$t-&gt;set_file<br />
$t-&gt;set_var<br />
当我对于phplib的执行效率不满意的时候，我开始寻找下一个PHP的模板引擎，于是smarty跳入我的视野范围，当我费尽心血去学会了smarty并使用开发了很多东西，而现在的我突然发现记得的也就只有下面的方法了</p>
<p>$s-&gt;assign<br />
$s-&gt;display</p>
<p>究竟我们需要模板引擎来做什么呢，MVC？简单？易用？效率？请看下文的分析。</p>
<p>二、程序处理的分析</p>
<p>1.PHPLIB的程序处理过程<br />
从phplib的处理开始讲起</p>
<p>$t = new Template()<br />
$t-&gt;set_file<br />
$t-&gt;set_var<br />
$t-&gt;parse<br />
$t-&gt;p</p>
<p>看上面的代码，翻译成中文就是</p>
<p>[*]初始化模板类$t<br />
[*]设置模板文件<br />
[*]设置模板变量<br />
[*]分析模板文件中的模板变量<br />
[*]输出内容</p>
<p>通过了最少5个步骤在php程序中实现模板的处理</p>
<p>2.Smarty的程序处理过程<br />
现在来看smarty的处理<br />
$s = new Smarty<br />
$s-&gt;assign<br />
$s-&gt;display</p>
<p>翻译成中文就是</p>
<p>[*]初始化模板类$s<br />
[*]设置模板变量<br />
[*]解析并输出模板</p>
<p>3.Discuz!模板的程序处理过程<br />
include template(tplname);</p>
<p>主要作用就是指定给程序需要处理的模板文件</p>
<p>在上述三种模板处理机制中，最容易理解和接受就是Discuz!模板的处理过程。初始化、设置变量、解析模板、输出内容，Discuz!只用了一个函数来做。对于一个开源的论坛软件，这样处理的好处是显而易见的，对于Discuz!进行二次开发的程序员的要求降低。简化模板语言，方便风格和插件的制作，这也在一定程度上促进了Discuz!的传播</p>
<p>三、模板源文件的语法</p>
<p>在phplib中处理循环嵌套的时候，使用：<br />
&lt;!&#8211;    BEGIN row   &#8211;&gt;<br />
{it}<br />
&lt;!&#8211;     END row    &#8211;&gt;<br />
在smarty中处理循环嵌套的时候，引入了<br />
&lt;{section name=loopName loop=$loopArray}&gt;（当然还有foreach这样的）<br />
在Discuz!中处理循环嵌套的时候，<br />
&lt;!&#8211;{loop $array $value}&#8211;&gt;<br />
其实真正的模板面对的可以说是不懂PHP或者懂一点PHP的美工同志们，模板的复杂就意味着美工制作页面的难度加大。在必不可少的需要模板有逻辑处理的时候，为什么不在html代码中使用原生态的PHP语法，而让美工相当于去学习另外一种语言呢？在我个人的经验中，显然是Discuz!的模板语言更为简单易学，也为我节省了更多的时间。</p>
<p>四、Discuz!模板处理机制<br />
我剥离出一个简单的Discuz!模板处理函数</p>
<p>function template($file, $templateid = 0, $tpldir = &#8221;) {</p>
<p>$tplfile = DISCUZ_ROOT.&#8217;./&#8217;.$tpldir.&#8217;/&#8217;.$file.&#8217;.htm&#8217;;//模板源文件，此处$tplfile变量的值可能是D:\discuz\templates\default\demo.htm<br />
$objfile = DISCUZ_ROOT.&#8217;./forumdata/templates/&#8217;.$templateid.&#8217;_&#8217;.$file.&#8217;.tpl.php&#8217;;//模板缓存文件，此处$objfile变量的值可能是D:\discuz\forumdata\templates\1_demo.tpl.php</p>
<p>//如果模板源文件的修改时间迟于模板缓存文件的修改时间，<br />
//就是模板源文件被修改而模板缓存没有更新的时候，<br />
//则调用parse_template函数重新生成模板缓存文件。<br />
if(@filemtime($tplfile) &gt; @filemtime($objfile)) {<br />
require_once DISCUZ_ROOT.&#8217;./include/template.func.php&#8217;;<br />
parse_template($file, $templateid, $tpldir);<br />
}</p>
<p>//返回缓存文件名称<br />
//$objfile变量内容可能为D:\discuz\forumdata\templates\1_demo.tpl.php<br />
return $objfile;<br />
}<br />
而php页面的模板执行语句</p>
<p>include template(&#8217;demo&#8217;);</p>
<p>实际上在本例中就是相当于</p>
<p>include &#8216;D:\discuz\forumdata\templates\1_demo.tpl.php&#8217;;</p>
<p>这个流程就是一个demo.php文件中当数据处理完成以后include template(&#8217;demo&#8217;)，去显示页面。</p>
<p>五、总结<br />
我也曾经看到过有列举出很多种的PHP模板引擎，但是我觉着phplib、smarty、Discuz!模板机制就足以说明问题了。</p>
<p>1.我们需要模板来做什么？<br />
分离程序与界面，为程序开发以及后期维护提供方便。</p>
<p>2.我们还在关心什么？<br />
PHP模板引擎的效率，易用性，可维护性。</p>
<p>3.最后的要求什么？<br />
简单就是美！</p>
<p>我的文章好像没有写完，其实已经写完了，我要说明的就是从PHP的模板引擎看Discuz!模板机制。分析已经完成，或许以后我会再写篇实际数据的测试供给大家参考！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cnedwin.com/4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
