<?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>PHP 爱好者</title>
	<atom:link href="http://www.phpfans.org/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.phpfans.org</link>
	<description>－－用最通俗的语言描述这个世界。</description>
	<lastBuildDate>Sun, 20 Jun 2010 05:37:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>LAMP安装所需的一些软件包</title>
		<link>http://www.phpfans.org/?p=91</link>
		<comments>http://www.phpfans.org/?p=91#comments</comments>
		<pubDate>Thu, 17 Jun 2010 09:27:59 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=91</guid>
		<description><![CDATA[httpd 包名: httpd-2.2.15.tar.gz 下载地址: http://httpd.apache.org/download.cgi 包路径: http://labs.renren.com/apache-mirror/httpd/httpd-2.2.15.tar.gz mysql 包名: mysql-5.1.48.tar.gz http://www.mysql.com/downloads/mysql/ http://mysql.byungsoo.net/Downloads/MySQL-5.1/mysql-5.1.48.tar.gz php 包名: php-5.3.2.tar.gz http://www.php.net/downloads.php http://cn2.php.net/get/php-5.3.2.tar.gz/from/cn.php.net/mirror libxml2 包名: libxml2-2.6.30-.tar.gz http://ftp.gnome.org/pub/GNOME/sources/libxml2 http://ftp.acc.umu.se/pub/GNOME/sources/libxml2/2.6/libxml2-2.6.30.tar.gz libxslt 包名: libxslt-1.1.22.tar.gz http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/ http://ftp.acc.umu.se/pub/GNOME/sources/libxslt/1.1/libxslt-1.1.22.tar.gz curl 包名: curl-7.20.1.tar.gz http://curl.haxx.se/download/ http://curl.haxx.se/download/curl-7.20.1.tar.gz gd2 包名: gd-2.0.35.tar.gz http://www.libgd.org/releases/ http://www.libgd.org/releases/gd-2.0.35.tar.gz freetype 包名: freetype-2.3.12.tar.gz http://sourceforge.net/projects/freetype/files/ http://sourceforge.net/projects/freetype/files/freetype2/2.3.12/freetype-2.3.12.tar.gz/download jpeg 包名: jpegsrc.v8b.tar.gz http://ijg.org/files/ http://ijg.org/files/jpegsrc.v8b.tar.gz libpng 包名: libpng-1.4.2.tar.gz http://www.libpng.org/pub/png/libpng.html http://download.sourceforge.net/libpng/libpng-1.4.2.tar.gz zlib 包名: gd-2.0.35.tar.gz [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=91</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WEB监控体系之设备负载监控</title>
		<link>http://www.phpfans.org/?p=83</link>
		<comments>http://www.phpfans.org/?p=83#comments</comments>
		<pubDate>Sun, 11 Apr 2010 11:14:58 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=83</guid>
		<description><![CDATA[　　第一次写和工作密切相关的文章，却无从下手，胡乱写起，纯当总结。 　　设备负载监控属于硬件级的基础监控，比设备基础监控粒度要粗一些，属于设备基础监控上一层的硬件监控，适合于数量较大、具有集群特性的硬件综合指标监控。当然，其监控数据来源仍为单机设备基础信息。 　　单机基础硬件指标大概包括CPU使用率、内存使用率、磁盘I/O、磁盘空间使用率、网卡出入包量、网卡出入流量、平均负载等。那么各种业务逻辑可能对这些指标都会有所侧重，例如WEB服务器比较侧重CPU、包量、流量，而DB比较侧重磁盘I/O、CPU使用率，CACHE则更关注内存使用率、CPU使用率等。对于数量庞大、类型不一的服务器，不可能关注到这么细致的数据信息，所以必须在几个维度进行汇总以便更好实现服务器管理。 　　那么设备负载监控系统的设计目标是什么呢？大概总结有以下几点： 　　1、减少管理单元，提高维护效率； 　　2、方便查看业务总体负载状况； 　　3、尽快发现高负载设备以便及时增加设备缓解业务压力； 　　4、减少空闲设备量，提高设备复用率，降低设备成本； 　　5、发现负载均衡方面的问题 　　要实现以上几个目标，首先需要将服务器分门别类。如WEB、DB、CACHE、业务逻辑等。上面提到，这些设备应该具备集群特性，其大概形式如下： 　　如上图所示，除灰色部分外，该集群拥有4台一样的设备，每台设备上均安装有1、2、3三种软件，这样这些设备的正常运行状况应该基本一致。当该集群呈现负载较繁忙的状况的时候，可以比较容易复制1-4号设备以增加一台一样的5号设备来降低业务负载。而当该集群负载较空闲的时候，可以将第4号软件部署于该集群下以充分利用设备性能。 　　在该集群负载均衡的状况下，单机的负载状况表现出来的特征，应该就是该集群的负载特征，通过管理集群即可映射到管理单机设备，假设有1000台设备，每个集群50台，那么只需要管理20个集群即可，管理单元明显减少。 　　在现实情况下，其实无法达到百分百负载均衡，所以还是需要一些算法计算集群的指标。最基本的算法就是MAX、MIN、AVG了。这三个基本可以处理90%以上情况。我曾经设计过比较复杂的公式支持，后来发现基本上用不上。当然算法越粗暴误差越大。如使用MAX计算CPU使用率，那么假如该集群下某台设备由于特殊原因CPU一直占用较高，那么表现在集群上的CPU使用率也会较高，而实际情况可能这个集群相对空闲。而使用AVG求平均数值，那么一些异常设备将会被淹没不能及时发现，所以这里需要根据业务特性做一些权衡和取舍。当然不建议使用更复杂的算法，因为配置维护成本比较高，而且数值计算结果不直观。 　　为了修正个别设备引起集群高负载的问题，引入了高负载设备数的指标。假如该集群负载较高且高负载设备数也高于某个比例（如50%）则认为该负载值准确描述集群压力状况。 　　接下来看看实际指标的计算方法。 　　首先是负载值的定义。考虑到单机指标太多，业务复杂，所以一律是用百分比来反映负载状况。如10%负载、80%负载、200%负载等。这样单位统一直观。而不需要去考虑具体单位和具体数值。以CPU使用率为例，假设当CPU使用率为80%的时候，负载为100%，那么将80定义为CPU使用率的基准值，当CPU使用率为40%的时候，计算出来的负载为50%，而当CPU使用率为100%时，计算出来的负载为125%。同样其他指标需要定义一些基准值做为负载100%的值。例如百M网卡定义80M为100%负载等。 　　这样单机所有基础指标均可以使用百分比表示，CPU使用率、内存使用率、磁盘I/O、磁盘空间使用率、网卡出入包量、网卡出入流量等均换算成负载比例，根据设备所属类型（WEB、DB、CACHE、逻辑等）设计权重结合计算公式得到单机负载值，如： 　　单机负载 = AVG(CPU使用率*权重/CPU使用率基准,出流量*权重/出流量基准&#8230;); 　　实际上单机负载的作用只在于计算高负载设备数。因为这样的计算方式累加到集群中的负载值误差会偏大。为了修正这一问题，引入集群指标负载的概念，即：集群的CPU使用率负载、集群流量负载等，由于同一集群的各项指标较相近，这样将同类型指标进行叠加，减少误差，其公式如下： 　　集群CPU使用率负载 = AVG(设备1CPU使用率/CPU使用率基准,设备2CPU使用率/CPU使用率基准,&#8230;); 　　从业务结构上看，会有如下关系图： 　　以上为现阶段使用的计算关系图，还有另外一种误差较大的关系图如下： 　　上图设备负载计算主要用于单机负载管理上，实际从单机负载直接计算集群负载的误差会较大，所以一般会采用前一种计算逻辑。不过视图2还能较为直观反映某一集群的负载均衡问题。 　　实际上负载监控的作用远远高于其起初设计目标。随着业务的增长，可以看到集群负载也随之增长，虽然有波动，但是通过计算后仍会随着业务增长表现出增长趋势，那么系统就可以根据近一段时间内的负载增长状况，结合业务实际增长状况，预测出未来该集群所要达到的负载值，当超过一个临界值的时候（如80%负载），可以有计划的实行扩容操作（增加设备），而不是等到业务突然呈现高负荷、稳定性降低的时候，才紧急进行设备扩充。 　　关于负载预测，我在之前有提到过，我是使用线性回归方法计算的，其中最小二乘法计算公式如下： 　　下面代码简单枚举历史10个点来计算该设备负载增长率： //Y坐标值表示设备历史负载 $y = array(52.09, 52.4, 53.29, 54.22, 55.15, 55.83, 56.89, 56.98, 57.55, 57.8); //X坐标值表示顺序天数 $x = array(1, 2, 3, 4, 5, 6, 7, 8, 9, [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=83</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>深圳腾讯互联网运营部招聘运营开发工程师</title>
		<link>http://www.phpfans.org/?p=82</link>
		<comments>http://www.phpfans.org/?p=82#comments</comments>
		<pubDate>Fri, 05 Mar 2010 08:45:17 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=82</guid>
		<description><![CDATA[工作职责： 1. 负责互联网海量用户社区的运营支持系统的建设和开发工作； 2. 参与系统的需求分析、设计、编码等开发工作； 3. 负责相关系统的运营和维护工作，保证系统稳定可靠运行。 工作要求： 1. 计算机相关专业本科以上学历，3年以上开发工作经验； 2. 精通PHP开发，具有大型LAMP系统设计和开发经验； 3. 熟悉数据库，精通SQL和数据结构，具有MySQL或者oracle开发经验为佳； 4. 精通HTML/XHTML、CSS、Javascript等web开发技能； 5. 了解使用linux基本操作命令，熟悉Shell脚本的编写； 6. 同时具有C/C++、CGI、XML、AJAX开发经验为佳； 7. 工作有激情，成就感强烈，热爱开发事业； 8. 学习能力强，具有良好的团队合作能力。 有兴趣的联系我 shenkong#qq.com]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=82</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>简单的PHP日历算法</title>
		<link>http://www.phpfans.org/?p=81</link>
		<comments>http://www.phpfans.org/?p=81#comments</comments>
		<pubDate>Mon, 28 Dec 2009 07:22:43 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=81</guid>
		<description><![CDATA[　　看看有没有比我更优的，HOHO。 /** * 日历 * * Copyright(c) 2007 by 陈毅鑫(深空). All rights reserved * To contact the author write to {@link mailto:shenkong@php.net} * @author 陈毅鑫(深空) */ if (function_exists('date_default_timezone_set')) { date_default_timezone_set('Asia/Chongqing'); } $date = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d'); $date = getdate(strtotime($date)); $end = getdate(mktime(0, 0, 0, $date['mon'] + 1, 1, $date['year']) - 1); $start = [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=81</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>《Head First 设计模式》代码之PHP版</title>
		<link>http://www.phpfans.org/?p=80</link>
		<comments>http://www.phpfans.org/?p=80#comments</comments>
		<pubDate>Mon, 28 Dec 2009 01:49:14 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>
		<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=80</guid>
		<description><![CDATA[　　《Head First 设计模式》是本不错的讲解设计模式的书，不像F4写的那么枯燥，应该算是比较容易理解的好书。书中的例子都比较浅显易懂，不过由于是外国佬写的，所以例子的习惯不是很附合中国特色，可能偶尔看起来有些别扭，还有语言习惯也不是中国风。当然��看过这本书之后，你才能深刻理解设计模式到底能为你解决哪些问题，不能为你解决哪些问题（比如不能代替你的编码）。 　　我将书中部分代码改成PHP，看下代码再配合概念应该是比较容易理解了。 　　策略模式 &#60;?php /** * 策略模式 * 定义了算法族，分别封装起来，让它们之间可以互相替换， * 此模式让算法的变化独立于使用算法的客户。 */ //飞行行为接口 interface FlyBehavior { public function fly(); } //呱呱叫行为接口 interface QuackBehavior { public function quack(); } //翅膀飞行 class FlyWithWings implements FlyBehavior { public function fly() { echo &#34;I'm flying!!\n&#34;; } } //不会飞 class FlyNoWay implements FlyBehavior { public function fly() { [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=80</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>基于HTTP长连接的“服务器推”技术的简易聊天室</title>
		<link>http://www.phpfans.org/?p=79</link>
		<comments>http://www.phpfans.org/?p=79#comments</comments>
		<pubDate>Wed, 28 Oct 2009 11:43:48 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>
		<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=79</guid>
		<description><![CDATA[　　关于HTTP长连接的“服务器推”技术原理可以查看IBM的这篇文章，我简单的做了个DEMO： 　　首先是首页，包含一个文本输入和一个显示聊天内容的iframe，还有一个隐藏iframe用来提交form表单： &#60;?php //chat.php header('cache-control: private'); header('Content-Type: text/html; charset=utf-8'); ?&#62; &#60;html&#62; &#60;script type=&#34;text/javascript&#34;&#62; function submitChat(obj) { obj.submit(); document.getElementsByName('content')[0].value = ''; } &#60;/script&#62; &#60;iframe src=&#34;./chat_content.php&#34; height=&#34;300&#34; width=&#34;100%&#34;&#62;&#60;/iframe&#62; &#60;iframe name=&#34;say&#34; height=&#34;0&#34; width=&#34;0&#34;&#62;&#60;/iframe&#62; &#60;form method=&#34;POST&#34; target=&#34;say&#34; action=&#34;./say.php&#34; onsubmit=&#34;submitChat(this)&#34;&#62; &#60;input type=&#34;text&#34; size=&#34;30&#34; name=&#34;content&#34; /&#62; &#60;input type=&#34;button&#34; value=&#34;say&#34; onclick=&#34;submitChat(this.form)&#34; /&#62; &#60;/form&#62; &#60;/html&#62; 　　另外一个就是保存用户提交的聊天内容了，我简单的写一下文本，而且没有做什么锁定，这个只是简易版本： &#60;?php $content = trim($_POST['content']); if ($content) { [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=79</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>我的第一个Windows窗体程序</title>
		<link>http://www.phpfans.org/?p=77</link>
		<comments>http://www.phpfans.org/?p=77#comments</comments>
		<pubDate>Tue, 20 Oct 2009 14:20:02 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[C 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=77</guid>
		<description><![CDATA[　　虽然之前也用JAVA编写过窗体程序，但毕竟不是原装的，这次采用C来写Windows窗体，发现比JAVA简单一些，HOHO #include &#60;windows.h&#62; #include &#60;windowsx.h&#62; int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd) { MessageBox(NULL, "Hello world!", "你好世界!", MB_OK &#124; MB_ICONASTERISK); return 0; } 　　采用Visual Studio 2008，创建的空项目，直接编译竟然就可以了。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=77</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>我的新书架</title>
		<link>http://www.phpfans.org/?p=73</link>
		<comments>http://www.phpfans.org/?p=73#comments</comments>
		<pubDate>Sun, 18 Oct 2009 01:59:55 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=73</guid>
		<description><![CDATA[　　手头书有点小多，乱七八糟铺了一沙发，昨天去宜家买了个CD架当书架使，小一点不过貌似够用了，研究结果就是一般书架都很高，超过两米，只有几款比较矮的，另外深度都是28cm左右，其实我不太喜欢太深的书架，一方面占地方，另外一方面书陷进去很不好看。最后选了个小的CD架，这样可以放在电脑旁边，随手可以拿到咯，好了废话不多说上图：]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=73</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>用线性回归方法计算直线斜率</title>
		<link>http://www.phpfans.org/?p=69</link>
		<comments>http://www.phpfans.org/?p=69#comments</comments>
		<pubDate>Tue, 13 Oct 2009 11:25:35 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=69</guid>
		<description><![CDATA[　　最近在做设备负载预测，考虑到负载波动，需要拿出近似增长率来计算未来数天的设备负载增长状况，想想看以前的数学都没有学好，算法也没有搞好，只能求助同事和百度Google，最终还是折腾出来了。 　　关于线性回归可以参考百度知道。其中采用最小二乘法可以比较容易的算出过往设备负载增长的斜率，具体公式如下： 　　下面代码简单枚举历史10个点来计算该设备负载增长率： //Y坐标值表示设备历史负载 $y = array(52.09, 52.4, 53.29, 54.22, 55.15, 55.83, 56.89, 56.98, 57.55, 57.8); //X坐标值表示顺序天数 $x = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); //计算X和Y均值 $ax = array_sum($x)/count($x); $ay = array_sum($y)/count($y); //计算斜率公式中的分母(em)和分子(ez) $em = 0; $ez = 0; for ($i = 0; $i < count($x); $i++) { //分母求和 $em += [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=69</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>由会话重定向看到的对象销毁问题</title>
		<link>http://www.phpfans.org/?p=68</link>
		<comments>http://www.phpfans.org/?p=68#comments</comments>
		<pubDate>Mon, 12 Oct 2009 07:58:24 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=68</guid>
		<description><![CDATA[　　今天和同事又讨论到DB类中析构函数是否要关闭数据库连接的问题，粗略看起来貌似在DB对象销毁之前关闭数据库连接再正常不过： class DB { public $conn; public function __construct() { $this->conn = mysql_connect('localhost', 'root', ''); mysql_select_db('test', $this->conn); } public function query($sql) { return mysql_query($sql, $this->conn); } public function __destruct() { echo "destruct:close&#60;br /&#62;"; mysql_close($this->conn); } } 　　执行： &#60;?php //class DB .. $db = new DB; ?&#62; 　　正常打印 destruct:close 。 　　再来看看下面的会话重定向到DB： &#60;?php class DB { public [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=68</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>读取和修改大文件的某行内容</title>
		<link>http://www.phpfans.org/?p=66</link>
		<comments>http://www.phpfans.org/?p=66#comments</comments>
		<pubDate>Sun, 27 Sep 2009 13:17:28 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=66</guid>
		<description><![CDATA[　　最近碰到一个比较有趣的问题，就是修改某个文件的某一行字符，不过文件太大，file()直接读取是不可能的，我使用fgets来跳转到指定行，并用fwrite修改某个字符串： $fp = fopen('d:/file.txt', 'r+'); if ($fp) { $i = 1; while (!feof($fp)) { //修改第二行数据 if ($i == 2) { fseek($fp, 2, SEEK_CUR); fwrite($fp, '#'); break; } fgets($fp); $i++; } fclose($fp); } 　　这里需要注意的是fgets获取到一行后，文件指针指向行尾(也就是下一行开头)，所以fwrite操作的是fgets后的下一行开头，至于从该行的第几个字符开始写，可以使用fseek函数来移动文件指针。另外一个需要注意的是，这里fwrite写入是执行替换操作，而不是插入操作，所以指针后面的字符会一个个被替换掉。至于怎么插入我就没研究了。估计很困难。为了效率可能只能写入另外一个临时文件了，不知道有没有其他更好的方法。 　　另外今天还看到了使用SPL进行操作的方法： $fp = new SplFileObject('d:/file.txt', 'r+'); //转到第二行, seek方法参数从0开始计数, 经我测试指针指向行尾了, 所以修改的是第三行 $fp-&#62;seek(1); //获取当前行内容(第二行) $line = $fp->current(); //下面是对第三行的操作 $fp-&#62;fseek(2, SEEK_CUR); $fp-&#62;fwrite('#'); 　　SplFileObject提供的方法比基本的文件操作函数更丰富一些，包括采用key/value方法遍历文件行等。SPL应该是PHP5增加进去的吧，还有其他很多很有用的对象。包括数组、文件目录操作、异常处理、一些基本类型操作等，这些功能还在陆续增加，可以通过继承SPL扩展这些方法让我们处理底层的操作更方便。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=66</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>入手两台BENQ G2220HD</title>
		<link>http://www.phpfans.org/?p=63</link>
		<comments>http://www.phpfans.org/?p=63#comments</comments>
		<pubDate>Sun, 27 Sep 2009 11:10:50 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=63</guid>
		<description><![CDATA[　　为了省去和电视机来回切换的麻烦，昨天入手了两台BENQ G2220HD，换下当前的DELL 2209WA，问我为什么换下IPS屏而用TN屏呢，因为这个是1920*1080分辨率，DELL这台只有1680*1050，以前买台17&#8242;CRT的价格可以买现在两台22&#8242;LCD，呵呵，两台嘛，一台送姐姐。这样换下来的DELL 2209WA准备拿公司里用。 　　BENQ这个是目前我看了最便宜的型号，当然我比较少作图，所以比较无所谓，至于看电影有电视机。分辨率和价格是我选择它的主要原因，HOHO。外观也还可以，就是竟然不带DVI线。 　　另外赞一下Windows7的显示设置，设置分辨率比以前方便多了，支持多种模式，包括复制、扩展等。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=63</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>免费的网站监控－监控宝</title>
		<link>http://www.phpfans.org/?p=60</link>
		<comments>http://www.phpfans.org/?p=60#comments</comments>
		<pubDate>Thu, 24 Sep 2009 16:47:59 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=60</guid>
		<description><![CDATA[　　今天逛博客，在老王的技术手册看到做网站监控的网站，由于自己的工作也有一方面是监控，所以感觉特别亲切，立即注册了一把，比较简单容易，特别适合个人主页使用，没事看看自己买的服务器是不是挂了，也挺有意思的。总比别人告诉你后你才发现强。 　　我就只试用了监控宝，配合139.com的免费邮件短信提醒功能，可以做到即能短信接收网站异常告警，也能避免手机号码泄漏，当然在监控宝上要写上Email别名啦，至于监控宝都帮你分析了些什么，看他们网站上的介绍即可： 　　另外就是它提供的服务器访问速度跟踪，将一个10k左右的图片传到自己的服务器，在监控宝上生成一个测试URL，测试访问用户访问这个URL的速度，当然他提供的是个URL，要别人去点的话很麻烦，所以我在BLOG底部增加了一个iframe，呵呵，每次访问就都会自动访问一下那个地址啦。 &#60;iframe height='0' width='0' border='0' style='display:none;' src='http://exp.jiankongbao.com/load.php?host_id=254'&#62;&#60;/iframe&#62;]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=60</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Need For Speed : Shift</title>
		<link>http://www.phpfans.org/?p=57</link>
		<comments>http://www.phpfans.org/?p=57#comments</comments>
		<pubDate>Sun, 20 Sep 2009 06:42:50 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=57</guid>
		<description><![CDATA[　　自从疯狂玩极品飞车6代和7代后，就没再找到玩飞车的感觉了，大学时候刚好是地下狂飙上市，那个时候买了手柄天天玩，还和远望几个网友联网玩，后来上班后就没怎么玩飞车了。再再后来来深圳我买了罗技MOMO方向盘，可是后面几个版本的飞车怎么也找不到以前的感觉了。画面、操作感、游戏感好像不强了，而且都是整个世界乱开的，开会就感觉没意思了。不过出于对极品飞车的喜爱，基本上每一版我都会下来玩玩，这次的飞车13依然不例外，不过给我的却是个例外，这是一个非常不错的版本，画面很亮，不再是阴阴沉沉了（和六代一样），各种效果都做得很好，特别是汽车非常逼真。而且增加了三代的车内驾驶视角，真是感更强了（可以看到侧面观后镜）。总之，我一下玩了一两个小时。 　　说说几点改变吧。一是再也不是像以前那样可以踩满油门过弯了，呵呵，如果还是那样做的话应该是直接开进路边的沙地，那个很难开出来。对于过弯还是要稍微练习一下，毕竟改变比较大，玩惯以前版本的话上手可能不太适应，不过极品飞车的优点就是上手快，所以练习几场基本没问题，总结如下：小弯松开油门减速即可过，打弯可以有两种过法，太急的弯需要踩刹车减速过，否则的话，也可以轻点手刹漂移过。另外一个我觉得非常好的两点，就是以前的路标，现在做到地面上了，非常好的一个改进，再也不会因为看不清远处的路标而不知道往哪个方向拐弯了，因为路标就在地上。而且更强大的是，路标会在绿色、黄色、红色之间切换，如果速度过快，会显示成黄色或者红色，表示如果按照这个速度不减速的话，前面的弯肯定过不了，如果你减速的话，路标会跟着变成绿色，也就是他会自动检测你的当前速度计算出你过弯的可能性，这个真的非常适合新手。 　　以前我特别不喜欢玩漂移、追逐赛（12好多追逐赛好烦），这一代貌似没有专门比赛漂移的，还好。我比较喜欢一群人一起比赛分个一二三。13也有生涯模式，不过看起来已经不是满世界乱跑了，而是一场场比赛，然后每场比赛都有星星，有兴趣可以全部刷满，呵呵，当然开启下个级别不一定要把所有都刷满。还有一些友谊赛也不错。更好的一个设置是，你可以一直参加同一场比赛刷经验和钱，呵呵。 　　完美支持Windows7。声音环绕效果很不错，我用的7.1音箱，侧面和后方声音都不错，就是感觉前方主声道的声音太大，掩盖了环绕声道。 　　好了说了这么多我现在才10级，我会把他打暴的。附上图片吧： 　　附上下载地址：极品飞车13变速。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=57</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP MVC及模板引擎</title>
		<link>http://www.phpfans.org/?p=55</link>
		<comments>http://www.phpfans.org/?p=55#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:00:59 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>
		<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=55</guid>
		<description><![CDATA[　　模板引擎，这四个字听起来很高深的样子，一般用到“引擎”两字都会感觉比较高级，类似游戏3D引擎、Zend引擎等，其实都是唬人的，骗外行人的。所以在我初学PHP的那会，也因为这四个字导致了我觉得很难而没有去看他到底是什么样一个东西，直到很长时间以后使用Smarty才真正了解模板引擎的原理和作用。Smarty(http://smarty.php.net)，PHP官方模板引擎，看名字给人感觉应该很快，其实很慢，即使他有预编译(另一个看起来很高级的名词，同样也是唬人的，下面我会讲到这个)。[注：我刚才点开Smarty发现他说他已经不是一个PHP子项目了，汗，看来确实唬人，哈玩笑^_^]。其实在PHP里，模板引擎扮演着View(其实通俗说就是页面，看英文有时候会给人很高级的错觉)的角色，这是一个很重要的角色，因为用户的交互啊，界面效果啊等等都在这里，这是最终用户看到的你的系统的样子。 　　开头就说模板引擎，只是跟大家说明一下这个东西其实没有什么难理解的，明白其原理以后你会发现他是纸老虎，所以你要有信心你会很轻松看完此文。 　　为了更好的说明模板引擎所扮演的角色，我不得不也谈谈MVC。这个话题恐怕互联网上谈及的很多，我也只能根据我的理解来描述，可能有不恰当的地方，欢迎讨论。通常的MVC是指Model、View和Controller。也就是模型、视图和控制器。我理解MVC也是在学了PHP不短时间后了，当时请教老廖(http://qeephp.com)，才恍然大悟。 　　先来说说Controller，也就是控制器，控制器是个什么东西呢？在PHP里他是扮演一个接收用户请求，把用户请求定位到指定数据模型的角色。解释起来感觉不是很好解释，来看一个简单的留言本的例子： //用户请求可能是 http://www.example.com/guest.php?module=list $module = $_GET['module']; switch ($module) { case 'list': require_once 'list.php'; break; case 'add': require_once 'add.php'; break; case 'del': require_once 'del.php'; break; default: require_once 'list.php'; break; } 　　是不是看起来很简单好像没什么东西呀，只是根据用户的请求参数包含不同的文件而已。没错，确实很容易，这个switch语句其实就一个最简单的控制器的实现。他控制什么？他控制你根据不同的用户请求参数调用不同的数据模型处理用户请求。那么这里的list可能是一个留言列表，add是添加留言，del是删除留言。Controller的传统实现可以这么简单，当然现在的很多技巧包括根据不同的用户请求包含不同的业务逻辑处理类，比如list自动定位到/model/List.class.php这样的一些技巧性操作等。 　　再来说说Model，其实我们一般花比较长时间设计和编写的也是这块内容，也就是具体的业务逻辑实现。比如一个留言列表要处理些什么，都是在这里实现。还是直接看一个Model例子比较直观： //Guest_List.class.php class Guest_List { public $page = 1; public function __construct() { $this-&#62;db = DB::init($GLOBALS['dsn']); $this-&#62;page = (int) $_GET['page']; } public [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=55</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>浅谈权限设计</title>
		<link>http://www.phpfans.org/?p=53</link>
		<comments>http://www.phpfans.org/?p=53#comments</comments>
		<pubDate>Sun, 13 Sep 2009 13:45:07 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[PHP 程序设计]]></category>
		<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=53</guid>
		<description><![CDATA[　　PHPChina的专家版在谈权限设计，苦于没有权限回帖，特发此博文谈谈简单的权限设计。讨论在这里。 　　最简单的权限验证，应该是登录态的验证，如果登录，则可以怎样，没有登录，则不能怎样： if ($isLogin === true) { //do something } else { //do nothing } 　　一般使用会话或者Cookie来保存登录态，具体实现不在此文讨论范围。一般权限都和人挂勾，首先识别你是谁，然后看你有能力做什么，然后再确认你的能力在这个地方是否可以使，一个权限验证算是基本上完成。我们围绕这几点来看权限如何去设计。 　　首先要能识别操作者是何许人，我们需要一张保存操作者信息的表，也就是通常所说的用户表。简单的用户表如下： CREATE TABLE user ( userId int(10) unsigned NOT NULL, username varchar(255) NOT NULL, PRIMARY KEY (userId) ) 　　一般使用一个用户ID来标识一个唯一的用户，可以使用数字，或者直接使用用户名作为主键(如果用户名不重复)。这里我们使用userId来唯一标识一个用户。 　　有了用户以后，接下来需要确认这个用户所具有的能力，也就是权限，那么首先我们需要列一下我们的系统总共需要几个权限，比如增、删、改、查等。增加一张权限表： CREATE TABLE permission ( permissionId int(10) unsigned NOT NULL , permissionName varchar(255) NOT NULL , PRIMARY KEY (permissionId) ) [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=53</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>腾讯学院赠送的U盘</title>
		<link>http://www.phpfans.org/?p=49</link>
		<comments>http://www.phpfans.org/?p=49#comments</comments>
		<pubDate>Thu, 10 Sep 2009 11:42:36 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=49</guid>
		<description><![CDATA[　　由于参与毕业生培训，教师节公司也准备了一份小礼物，算是我的第一个U盘，4G:)很开心呀。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=49</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>语言与工具，并论VC编程</title>
		<link>http://www.phpfans.org/?p=47</link>
		<comments>http://www.phpfans.org/?p=47#comments</comments>
		<pubDate>Mon, 07 Sep 2009 17:43:15 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[生活感悟]]></category>
		<category><![CDATA[系统设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=47</guid>
		<description><![CDATA[　　由于工作的性质，我可能有不小的比例采用VC编程(ctrl+c/ctrl+v)，从一个系统设计上来讲，可能这样做会大大降低代码的可维护性，不过我觉得这种说法还是要建立在所处的特定业务环境，如一个论坛产品的开发，或者一个博客产品的开发，或者你必须优化提供高扩展性等。而我现在所处的环境，是一个用户需求瞬息万变的环境，我没有足够的时间思考我当前写的代码是否合理，可能我刚写完不久，这段代码就已作废。 　　因此我在想，采用何种方式架构你的系统，需要将你的上下文环境纳入考虑范围，以寻求最合适的解决方案，最能达到目标，最省时间。也就是我所提的观点之一：系统设计应该以目标为导向。如一个DEMO、可能真的不需要去考虑代码有多优雅，它需要快速的实现，尽快让用户看到一个非抽象的东西，以这个目标来讲，你所要的就是能有多快就有多块。那么我会在我以前实现过的代码中拷贝我需要的片段，加点东西组合在一起迅速做出来。或者我干脆都不用MVC，直接eaho出想要的页面。事实告诉我，我为此节省了大量的时间，去做那些需要比较花心思设计的地方，比如系统框架、系统库等，和学各种各样的不同的工具。 　　几年前，如果别人问我是做什么的，我可能会说我是做PHP开发的，如果今天你问我做什么的，我其实难以回答，我是做PHP开发的吗？没错，我用得比较多的是PHP，甚至后台脚本也使用PHP编写，但是我可能会在某些特定需求上，将一些功能转到数据库、或者转到前端让Javascript，或者以后我可能会用C去处理那些需要用到C的东西。这是我想要提的第二个观点：在合适的情况下，使用合适的工具，构建合适的应用系统。我确实比较喜欢PHP，因为其简单。但是，如果参考第一条，以目标为导向的话，有时候一个实现采用PHP并不一定合适，你可能会很执著的说PHP也能做到，不错，它可能可以做到，但是你要花比较高的代价。抛开语言来看系统设计，你就会发现这些系统的零部件需要各种不同特性的工具来打造，你需要选择适合这个特性的工具，它可能是PHP，也可能是存储过程，可能是后台运算，也可能是前端处理，你要做的就是把握好是用什么工具最方便最能达到目的。要达到这个目标，你还要做的就是，充分认识各种工具的优缺点，他们的适用场景，或者甚至你需要扩展你的工具箱，让你有更多的选择的余地，那么这些都是需要花不少时间的。 　　有些人说开发到一定阶段很迷茫，那么我可能会问你，你的工具箱里有多少东西，你用的称手的有多少？我想这样你该不会迷茫了吧。学习语言我想不仅仅只是为了语言本身，各种不同的语言技巧，各种不同的实现方式，我觉得这些都没有太大必要，如果你把目标建立在构建一个适合某种应用场景的系统的时候，抛开语言的时候，很多困惑都会迎刃而解。用户才不会管你采用什么方式去实现，只要能用，用得满意就OK了，你要做的只是，站在用户的角度，聆听用户的需求，拓展用户的潜在需求，扮演用户的角色，在最快的时间内给出用户真正想要的东西，我想就是成功的应用系统开发和设计。 　　那么回答VC编程是否可行，他只是我实现目标的其中一种手段罢了。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=47</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>多个浏览器表格渲染失败</title>
		<link>http://www.phpfans.org/?p=48</link>
		<comments>http://www.phpfans.org/?p=48#comments</comments>
		<pubDate>Sun, 06 Sep 2009 17:49:26 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[前台脚本开发]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=48</guid>
		<description><![CDATA[　　最近在开发一个多层级结构的东西，采用表格来展示多层级关系，由于采用递归来生成表格HTML代码，一开始当然一堆问题，不过调了半天把一些粗心大意的问题解决了，我一般调试是在IE下，不过表格太大，所以IE可能会有点慢，我就采用的Chrome，可是总是错位啊，奇怪了，找啊找，找啊找，没发现问题，用IE看，正常，嗯当时以为IE比较强悍，纠错能力比较强，我就装了Dreamweaver，厄，打开近万行表格很慢的说，我不得不请假回家用我这台战斗机调试。我采用删除定位法，一行行减少表格，发现到某一个行数显示就好了。我顿悟，浏览器BUG。先后我测试了Firefox3.5，Safari4.0.3，Chrome2.x，Opera10、IE5.5、IE6、IE7、IE8，前面三个浏览器全部渲染错位，后面IE全部正确、Opera10也正常，厄，奇怪的是几个浏览器都在同一个地方错位，我就极其怀疑是否引擎代码都是互相拷贝的- -!!，具体有兴趣的可以看看以下链接：http://www.phpfans.org/temp/demo33.html，表格很大，打开请慎重。大概有两万多行代码，1万行表格。]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=48</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fork子进程</title>
		<link>http://www.phpfans.org/?p=42</link>
		<comments>http://www.phpfans.org/?p=42#comments</comments>
		<pubDate>Thu, 03 Sep 2009 16:11:35 +0000</pubDate>
		<dc:creator>深空</dc:creator>
				<category><![CDATA[C 程序设计]]></category>

		<guid isPermaLink="false">http://www.phpfans.org/?p=42</guid>
		<description><![CDATA[　　这两天下载了无数版本Linux，包括openSuse 11.1，Ubuntu 9.04，Suse Enterprise Desktop 11等，在虚拟机上装了下，感觉还是不错的。 　　当然装这个主要是要在上面学学C开发啦，顺便读读《UNIX环境高级编程(第二版)》，不错的书，不过理解起来有难度。第一章就讲fork子进程了，当然对于我这种菜鸟，看起来是晕头转向，恰好小寒同学从中给予指点，让我略微明白了一下下，于是乎有了下面的程序： #include &#60;stdio.h&#62; #include &#60;stdlib.h&#62; main() { int i = 0; while (i < 1000) { pid_t pid_i = fork(); if (pid_i == 0) { printf("child:%d\n", i); //exit(0); } else { i++; } } } 　　厄，编译执行后后果自负哈。要想正常就把exit的注释去掉啦，否则是个死循环(10002n, n->＋∞)。 　　然后我来根据我的回忆理解一下这段代码。pid_t 是pid(进程id)的类型，其实感觉就是个int，没看源代码不清楚是不是，哈哈。第六行开始调用fork()函数产生一个子进程，这个产生过程是在父进程执行的，所以这个fork在这个时候只执行了一次，不过执行后就产生父子两个进程，所以其实pid是被赋了两次，你可以在fork()调用之后把后面的代码看成一个分身术，分成两套独立代码，其中父进程给pid_i赋值，得到子进程id，而子进程也做赋值操作，只不过得到的是0，注意进程id是一个非负值，如果为负则表示出错误了。接下去父子该干嘛干嘛，还是按照往下的程序执行了，在fork完成的当口，所有状态拆成两份。fork完成后，各干各的！fork单词的含义体现得淋漓尽致(见注解)。 　　嗯，没错，这就是我对进程的理解，雷不？ 　　注： 简明英汉词典 fork D.J.[fɔ:k] K.K.[fɔrk] n. 1 餐叉 2 [...]]]></description>
		<wfw:commentRss>http://www.phpfans.org/?feed=rss2&amp;p=42</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
