-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2011 年 12 月 21 日 10:01
-- 服务器版本: 5.5.16
-- PHP 版本: 5.3.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- 数据库: `blog`
--

-- --------------------------------------------------------

--
-- 表的结构 `cat`
--

CREATE TABLE IF NOT EXISTS `cat` (
  `catId` int(11) NOT NULL AUTO_INCREMENT,
  `catName` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`catId`)
) ENGINE=MyISAM  DEFAULT CHARSET=gbk AUTO_INCREMENT=16 ;

--
-- 转存表中的数据 `cat`
--

INSERT INTO `cat` (`catId`, `catName`) VALUES
(1, 'PHP'),
(2, '服务器'),
(3, 'HTML&XML'),
(4, 'JS&CSS'),
(5, '数据库'),
(6, 'LINUX');

-- --------------------------------------------------------

--
-- 表的结构 `link`
--

CREATE TABLE IF NOT EXISTS `link` (
  `linkId` int(11) NOT NULL AUTO_INCREMENT,
  `linkName` varchar(255) NOT NULL DEFAULT '',
  `linkSrc` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`linkId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- 表的结构 `message`
--

CREATE TABLE IF NOT EXISTS `message` (
  `messageId` int(11) NOT NULL AUTO_INCREMENT,
  `newsId` int(11) NOT NULL DEFAULT '0',
  `content` varchar(255) NOT NULL DEFAULT '',
  `name` varchar(20) NOT NULL DEFAULT '',
  `addtime` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`messageId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- 表的结构 `news`
--

CREATE TABLE IF NOT EXISTS `news` (
  `newsId` int(11) NOT NULL AUTO_INCREMENT,
  `parentId` int(11) NOT NULL DEFAULT '1',
  `title` varchar(50) NOT NULL DEFAULT '',
  `author` varchar(10) NOT NULL DEFAULT 'admin',
  `desc` varchar(300) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `content` mediumtext CHARACTER SET utf8 NOT NULL,
  `addtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `views` int(11) NOT NULL DEFAULT '0',
  `recommend` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`newsId`)
) ENGINE=MyISAM  DEFAULT CHARSET=gbk AUTO_INCREMENT=51 ;

--
-- 转存表中的数据 `news`
--

INSERT INTO `news` (`newsId`, `parentId`, `title`, `author`, `desc`, `content`, `addtime`, `views`, `recommend`) VALUES
(1, 1, 'php的异步http请求类', 'admin', '　使用示例　　如下，在request的时候能够定义请求完成之后的callback函数。　　<?php　　$base = event_base_new();　　$uri = "http://www.baidu.com/";　　$config = array(　　&#39;eventbase&#39; ...', '<p>\r\n    <strong>使用示例</strong>\r\n</p>\r\n<p>\r\n    　　如下，在request的时候能够定义请求完成之后的callback函数。\r\n</p>\r\n<p>\r\n    &nbsp;\r\n</p>\r\n<p>\r\n    　　&lt;?php\r\n</p>\r\n<p>\r\n    　　$base = event_base_new();\r\n</p>\r\n<p>\r\n    　　$uri = &quot;http://www.baidu.com/&quot;;\r\n</p>\r\n<p>\r\n    　　$config = array(\r\n</p>\r\n<p>\r\n    　　&#39;eventbase&#39; =&gt; $base\r\n</p>\r\n<p>\r\n    　　);\r\n</p>\r\n<p>\r\n    　　for($i = 0; $i &lt; 10; $i++) {\r\n</p>\r\n<p>\r\n    　　$client = new AsyncHttpClient($uri, $config);\r\n</p>\r\n<p>\r\n    　　$client-&gt;request(function($result) {\r\n</p>\r\n<p>\r\n    　　echo &quot;Result len:&quot;;\r\n</p>\r\n<p>\r\n    　　echo strlen($result[&#39;response&#39;]);\r\n</p>\r\n<p>\r\n    　　// parse response with Zend_Http_Response\r\n</p>\r\n<p>\r\n    　　$response = Zend_Http_Response::fromString($result[&#39;response&#39;]);\r\n</p>\r\n<p>\r\n    　　echo $response-&gt;getBody();\r\n</p>\r\n<p>\r\n    　　echo &quot;\\n&quot;;\r\n</p>\r\n<p>\r\n    　　});\r\n</p>\r\n<p>\r\n    　　}\r\n</p>\r\n<p>\r\n    　　event_base_loop($base);\r\n</p>\r\n<p>\r\n    　　echo &quot;done\\n&quot;;\r\n</p>\r\n<p>\r\n    　　?&gt;\r\n</p>\r\n<p>\r\n    &nbsp;\r\n</p>\r\n<p>\r\n    　　目前的实现比较初级，只做了get方法的封装，如果需要http上传或者post，还需要另外实现。另外这个类也需要php的libevent扩展。\r\n</p>\r\n<p>\r\n    &nbsp;\r\n</p>', '2011-12-01 06:18:25', 0, 1),
(3, 1, 'PHP的echo为什么这么慢\r\n', 'admin', '作为一个行走江湖多年的老中医，今天受命去解决一例前端页面展现缓慢的问题。问题页的情况如下：apache + php使用smarty模板输出内容页面最终输出内容较大，80k+页面执行时间在500ms以上祭出法宝xhprof对问题页...', '<p>\n    作为一个行走江湖多年的老中医，今天受命去解决一例前端页面展现缓慢的问题。问题页的情况如下：&nbsp;\n</p>\n<p>\n    　　apache + php\n</p>\n<p>\n    　　使用smarty模板输出内容\n</p>\n<p>\n    　　页面最终输出内容较大，80k+\n</p>\n<p>\n    　　页面执行时间在500ms以上\n</p>\n<p>\n    　　祭出法宝xhprof对问题页面做了细致检查，发现页面的瓶颈竟然是模板(编译后的)中的一个echo语句，这个echo语句输出的字符串比较大，大概是50k+字节，花费时间为400多毫秒，占整个页面执行时间的80%。这样的echo输出在站点首页中其实是很常见的事情，没有数据库操作，按道理执行时间不应该这么长。\n</p>\n<p>\n    　　于是猛力使用搜索技能，最终在php手册的echo部分找到了一些蛛丝马迹，早在2003年就有前辈认为通过echo输出大字符串到客户端会引起服务器的性能问题，据我测试，在这个场景下使用print其实也是一样的慢。建议的解决办法是把字符串切割成更小的字符串输出，展现速度会有提升，输出函数如下：\n</p>\n<p>\n    　　&lt;?php\n</p>\n<p>\n    　　function echobig($string, $bufferSize = 8192) {\n</p>\n<p>\n    　　$splitString = str_split($string, $bufferSize);\n</p>\n<p>\n    　　foreach($splitString as $chunk)\n</p>\n<p>\n    　　echo $chunk;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　?&gt;\n</p>\n<p>\n    　　但是上面的处方不太对症，整个echobig的输出时间仍然在400毫秒左右，没有太大改善。\n</p>\n<p>\n    　　考虑到是输出大量内容到客户端比较慢，于是检查了apache的配置，原来还没打开deflate进行压缩，遂启用之。再次使用xhprof进行检查，这条echo的输出时间降低到5ms左右。\n</p>\n<p>\n    　　400ms到5ms，一个配置问题会产生80倍的差距，还真是省老钱了。这个故事告诉我们，压缩输出真的很重要。\n</p>\n<p>\n    <strong>UPDATE：加速你的echo&nbsp;</strong>http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/1127/9361.html\n</p>\n<p>\n    &nbsp;\n</p>', '2011-12-02 15:00:00', 0, 1),
(4, 1, '百度知道的php爬虫\r\n', 'admin', '百度知道爬虫！经过我们分析，百度知道是由静态网页组成。网址格式主要为http://zhidao.baidu.com/question/(编号).html，其中编号便是该问题的编号(PID)，按照时间逐个编号的，由于某些问题的删除或者某...', '<p>\n    &lt;?php<br />\n    /*<br />\n    &nbsp;百度知道爬虫！<br />\n    经过我们分析，百度知道是由静态网页组成。网址格式主要为<a href="http://zhidao.baidu.com/question/"><span style="color:#005a98">http://zhidao.baidu.com/question/</span></a>(编号).html，其中编号便是该问题的编号(PID)，按照时间逐个编号的，由于某些问题的删除或者某种原因，可能编号不连续。当我们发现该问题删除时，可以跳过该问题继续。<br />\n    */\n</p>\n<p>\n    <br />\n    class spider<br />\n    {<br />\n    &nbsp;private $content ;<br />\n    &nbsp;private $contentlen ;<br />\n    &nbsp;private $BestAnswer ;<br />\n    &nbsp;private $CurPosition ;<br />\n    &nbsp;function GetStart( $iStart )<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;return strpos( $this-&gt;content , &#39;&gt;&#39; , $iStart )+1 ;<br />\n    &nbsp;}<br />\n    &nbsp;function GetContent ( $url )<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$this-&gt;content = file_get_contents($url);<br />\n    &nbsp;&nbsp;$this-&gt;contentlen = strlen( $this-&gt;content ) ;<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;&lt;title&gt;&#39;) ;<br />\n    &nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/title&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;$title = substr( $this-&gt;content , $start , $this-&gt;$end-$start ) ;<br />\n    &nbsp;&nbsp;if ( strpos( $title , &#39;_百度知道&#39; , 1 ) &lt; 1 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;return false;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return ture ;<br />\n    &nbsp;}<br />\n    &nbsp;<br />\n    &nbsp;function GetTitle()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;&lt;title&gt;&#39;) ;<br />\n    &nbsp;&nbsp;if ( $start &gt; 0 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/title&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$this-&gt;CurPosition = $end ;<br />\n    &nbsp;&nbsp;&nbsp;return substr( $this-&gt;content , $start , $end-$start ) ;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return NULL ;<br />\n    &nbsp;}<br />\n    &nbsp;function GetQTitle()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;span class=&quot;question-title&quot;&#39; , $this-&gt;CurPosition ) ;<br />\n    &nbsp;&nbsp;if ( $start &gt; 0 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/span&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$this-&gt;CurPosition = $end ;<br />\n    &nbsp;&nbsp;&nbsp;return substr( $this-&gt;content , $start , $end-$start ) ;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return NULL ;<br />\n    &nbsp;}<br />\n    &nbsp;function GetClassFly()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;;<br />\n    &nbsp;}<br />\n    &nbsp;function GetQContent()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;pre id=&quot;question-content&quot;&#39; , $this-&gt;CurPosition ) ;<br />\n    &nbsp;&nbsp;if ( $start &gt; 0 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/pre&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$this-&gt;CurPosition = $end ;<br />\n    &nbsp;&nbsp;&nbsp;return substr( $this-&gt;content , $start , $end-$start ) ;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return NULL ;<br />\n    &nbsp;}<br />\n    &nbsp;function GetQsuply()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;id=&quot;question-suply&quot;&#39; , $this-&gt;CurPosition ) ;<br />\n    &nbsp;&nbsp;if ( $start &gt; 0 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/pre&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$this-&gt;CurPosition = $end ;<br />\n    &nbsp;&nbsp;&nbsp;return substr( $this-&gt;content , $start , $end-$start ) ;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return NULL ;<br />\n    &nbsp;}<br />\n    &nbsp;function GetAnswer()<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;$start = strpos( $this-&gt;content , &#39;class=&quot;reply-text mb10&quot;&#39; , $this-&gt;CurPosition ) ;<br />\n    &nbsp;&nbsp;if ( $start &gt; 0 )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;$start = $this-&gt;GetStart( $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$end = strpos( $this-&gt;content , &#39;&lt;/pre&gt;&#39; , $start ) ;<br />\n    &nbsp;&nbsp;&nbsp;$this-&gt;CurPosition = $end ;<br />\n    &nbsp;&nbsp;&nbsp;return substr( $this-&gt;content , $start , $end-$start ) ;<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;return NULL ;<br />\n    &nbsp;}<br />\n    }<br />\n    ini_set(&#39;max_execution_time&#39;, &#39;0&#39;);<br />\n    $TestSpider = new spider() ;<br />\n    $Startqid = 1000001 ;<br />\n    $sndqid = 1000051 ;<br />\n    $standurl = &#39;http://zhidao.baidu.com/question/&#39; ;<br />\n    $html = &#39;.html&#39; ;<br />\n    $url ;<br />\n    $NoUse = 0 ;<br />\n    function microtime_float()<br />\n    {<br />\n    &nbsp;&nbsp;&nbsp;&nbsp;list($usec, $sec) = explode(&quot; &quot;, microtime());<br />\n    &nbsp;&nbsp;&nbsp;&nbsp;return ((float)$usec + (float)$sec);<br />\n    }<br />\n    $time_start = microtime_float();<br />\n    $answer ;<br />\n    for ($i = $Startqid ; $i &lt; $sndqid ; $i++ )<br />\n    {<br />\n    &nbsp;$url = $standurl.$i.$html ;<br />\n    &nbsp;if ( $TestSpider-&gt;GetContent ( $url ) )<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;echo &#39;&lt;br&gt;正在爬取编号为&#39;.$i.&#39;的网页&lt;br&gt;&#39; ;<br />\n    &nbsp;&nbsp;$TestSpider-&gt;GetTitle() ; //得到网页标题,不用显示了<br />\n    &nbsp;&nbsp;echo &#39;&lt;font color=&quot;green&quot;&gt;问题：&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;&lt;a target=&quot;_blank&quot; href=&quot;&#39;.$url.&#39;&quot;&gt; &#39;.$TestSpider-&gt;GetQTitle().&#39;&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&#39; ; //得到问题题目<br />\n    &nbsp;&nbsp;echo &#39;&lt;font color=&quot;green&quot;&gt;问题具体内容：&lt;/font&gt;&#39;.$TestSpider-&gt;GetQContent().&#39;&lt;/font&gt;&lt;br&gt;&#39; ; //得到问题内容，有可能不存在<br />\n    &nbsp;&nbsp;echo &#39;&lt;font color=&quot;green&quot;&gt;问题补充说明：&lt;/font&gt;&#39;.$TestSpider-&gt;GetQsuply().&#39;&lt;/font&gt;&lt;br&gt;&#39; ; //问题补充说明，有可能不存在<br />\n    &nbsp;&nbsp;while ( ($answer = $TestSpider-&gt;GetAnswer()) != NULL )<br />\n    &nbsp;&nbsp;{<br />\n    &nbsp;&nbsp;&nbsp;echo &#39;&lt;font color=&quot;green&quot;&gt;问题答案：&lt;/font&gt;&#39;.$answer.&#39;&lt;/font&gt;&lt;br&gt;&#39; ; //得到答案。有可能没有答案！<br />\n    &nbsp;&nbsp;}<br />\n    &nbsp;&nbsp;ob_flush() ;<br />\n    &nbsp;&nbsp;flush() ;<br />\n    &nbsp;}<br />\n    &nbsp;else<br />\n    &nbsp;{<br />\n    &nbsp;&nbsp;echo &#39;&lt;p&gt;错误了&lt;a target=&quot;_blank&quot; href=&quot;&#39;.$url.&#39;&quot; style= &quot;color:#ff0000&quot;&gt;&#39;.$url.&#39;&lt;/a&gt;&lt;/p&gt;&#39; ;<br />\n    &nbsp;&nbsp;$NoUse++ ;<br />\n    &nbsp;}<br />\n    }<br />\n    $time_end = microtime_float();<br />\n    $time = $time_end - $time_start;<br />\n    $i = $i-$Startqid ;<br />\n    echo &#39;&lt;p&gt;爬取&#39;.$i.&#39;个网页用时&#39;.$time.&#39;秒&lt;/p&gt;其中跳过&#39;.$NoUse.&#39;个无效网页！&#39; ;\n</p>\n<p>\n    ?&gt;\n</p>\n<p>\n    &nbsp;\n</p>', '2011-12-01 16:00:00', 0, 1),
(5, 1, '基于PHP的Google Voice 短信API\r\n', 'admin', '　　Google Voice并没有提供官方API接口，但是实际上还是可以通过HTTP和XML请求的手段来实现。目前网上能够找到的API最终大都是溯源到Chad Smith的这篇主题帖。　　要通过Google Voice实现发送短信，首先要登...', '<p>\n    Google Voice并没有提供官方API接口，但是实际上还是可以通过HTTP和XML请求的手段来实现。目前网上能够找到的API最终大都是溯源到Chad Smith的这篇主题帖。&nbsp;\n</p>\n<p>\n    　　要通过Google Voice实现发送短信，首先要登录到Google Voice账号，然后取出页面中的“_rnr_se”参数，最后把这个参数和对方手机号、短信内容POST到Google Voice SMS的地址即可。Tyler Hall曾经写过一个Google Voice的php类，但是我试用时并不成功，总是卡在登录Google Voice的过程上。对此我二次开发了它的这个类，重写了绝大部分代码。\n</p>\n<p>\n    　　经过实际尝试，没有使用Chad Smith的XML请求地址，而是使用了移动终端版的Google Voice请求地址并且根据需要改动了POST请求的参数，最终搞定了一个基于php的Google Voice短信发送工具，<strong>调用地址在http://www.lostleon.com/tools/googlevoice/，项目地址在http://phpgooglevoice.googlecode.com/</strong>。\n</p>\n<p>\n    　　很遗憾，天翼189号码不被Google Voice支持。移动158号码测试通过。\n</p>\n<p>\n    &nbsp;\n</p>', '2011-11-01 10:00:00', 0, 1),
(2, 1, 'PHP断点续传-HTTP\r\n', 'admin', '<p>　/**　　* PHP-HTTP断点续传实现　　* @param string $path: 文件所在路径　　* @param string $file: 文件名　　* @return void　　*/　　function download($path,$file) {　　$real...', '<p>\n    <strong>&lt;?php</strong>\n</p>\n<p>\n    　　/**\n</p>\n<p>\n    　　* PHP-HTTP断点续传实现\n</p>\n<p>\n    　　* @param string $path: 文件所在路径\n</p>\n<p>\n    　　* @param string $file: 文件名\n</p>\n<p>\n    　　* @return void\n</p>\n<p>\n    　　*/\n</p>\n<p>\n    　　function download($path,$file) {\n</p>\n<p>\n    　　$real = $path.&#39;/&#39;.$file;\n</p>\n<p>\n    　　if(!file_exists($real)) {\n</p>\n<p>\n    　　return false;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　$size = filesize($real);\n</p>\n<p>\n    　　$size2 = $size-1;\n</p>\n<p>\n    　　$range = 0;\n</p>\n<p>\n    　　if(isset($_SERVER[&#39;HTTP_RANGE&#39;])) {\n</p>\n<p>\n    　　header(&#39;HTTP /1.1 206 Partial Content&#39;);\n</p>\n<p>\n    　　$range = str_replace(&#39;=&#39;,&#39;-&#39;,$_SERVER[&#39;HTTP_RANGE&#39;]);\n</p>\n<p>\n    　　$range = explode(&#39;-&#39;,$range);\n</p>\n<p>\n    　　$range = trim($range[1]);\n</p>\n<p>\n    　　header(&#39;Content-Length:&#39;.$size);\n</p>\n<p>\n    　　header(&#39;Content-Range: bytes &#39;.$range.&#39;-&#39;.$size2.&#39;/&#39;.$size);\n</p>\n<p>\n    　　} else {\n</p>\n<p>\n    　　header(&#39;Content-Length:&#39;.$size);\n</p>\n<p>\n    　　header(&#39;Content-Range: bytes 0-&#39;.$size2.&#39;/&#39;.$size);\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　header(&#39;Accenpt-Ranges: bytes&#39;);\n</p>\n<p>\n    　　header(&#39;application/octet-stream&#39;);\n</p>\n<p>\n    　　header(&quot;Cache-control: public&quot;);\n</p>\n<p>\n    　　header(&quot;Pragma: public&quot;);\n</p>\n<p>\n    　　//解决在IE中下载时中文乱码问题\n</p>\n<p>\n    　　$ua = $_SERVER[&#39;HTTP_USER_AGENT&#39;];\n</p>\n<p>\n    　　if(preg_match(&#39;/MSIE/&#39;,$ua)) {\n</p>\n<p>\n    　　$ie_filename = str_replace(&#39;+&#39;,&#39;%20&#39;,urlencode($file));\n</p>\n<p>\n    　　header(&#39;Content-Dispositon:attachment; filename=&#39;.$ie_filename);\n</p>\n<p>\n    　　} else {\n</p>\n<p>\n    　　header(&#39;Content-Dispositon:attachment; filename=&#39;.$file);\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　$fp = fopen($real,&#39;rb+&#39;);\n</p>\n<p>\n    　　fseek($fp,$range);\n</p>\n<p>\n    　　while(!feof($fp)) {\n</p>\n<p>\n    　　set_time_limit(0);\n</p>\n<p>\n    　　print(fread($fp,1024));\n</p>\n<p>\n    　　flush();\n</p>\n<p>\n    　　ob_flush();\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　fclose($fp);\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　/*End of PHP*/\n</p>\n<p>\n    &nbsp;\n</p>', '2011-11-02 16:00:00', 0, 0),
(6, 1, '一个PHP MySQL操作类...\r\n', 'admin', '<p>/** * MySQL 数据库操作工具类, 方便数据库操作. * 示例见底部注释. * @author: http://www.ideawu.net/blog/ */class Mysql{ var $conn; var $query_list = array(); ...', '<pre style="padding-bottom:4px; line-height:14px; padding-left:4px; padding-right:4px; color:#333333; padding-top:4px; background-origin:initial; background-clip:initial">\n    &lt;?php\n/**\n * MySQL 数据库操作工具类, 方便数据库操作.\n * 示例见底部注释.\n * @author: <span style="color:#000000">http://www.ideawu.net/blog/</span>*/\nclass Mysql{\n    var $conn;\n    var $query_list = array();\n    public $query_count = 0;\n\n    public function __construct($c){\n        if(!isset($c[''port''])){\n            $c[''port''] = ''3306'';\n        }\n        $server = $c[''host''] . '':'' . $c[''port''];\n        $this-&gt;conn = mysql_connect($server, $c[''username''], $c[''password''], true) or die(''connect db error'');\n        mysql_select_db($c[''dbname''], $this-&gt;conn) or die(''select db error'');\n        if($c[''charset'']){\n            mysql_query("set names " . $c[''charset''], $this-&gt;conn);\n        }\n    }\n\n    /**\n     * 执行 mysql_query 并返回其结果.\n     */\n    public function query($sql){\n        $stime = microtime(true);\n\n        $result = mysql_query($sql, $this-&gt;conn);\n        $this-&gt;query_count ++;\n        if($result === false){\n            throw new Exception(mysql_error($this-&gt;conn)." in SQL: $sql");\n        }\n\n        $etime = microtime(true);\n        $time = number_format(($etime - $stime) * 1000, 2);\n        $this-&gt;query_list[] = $time . '' '' . $sql;\n        return $result;\n    }\n\n    /**\n     * 执行 SQL 语句, 返回结果的第一条记录(是一个对象).\n     */\n    public function get($sql){\n        $result = $this-&gt;query($sql);\n        if($row = mysql_fetch_object($result)){\n            return $row;\n        }else{\n            return null;\n        }\n    }\n\n    /**\n     * 返回查询结果集, 以 key 为键组织成关联数组, 每一个元素是一个对象.\n     * 如果 key 为空, 则将结果组织成普通的数组.\n     */\n    public function find($sql, $key=null){\n        $data = array();\n        $result = $this-&gt;query($sql);\n        while($row = mysql_fetch_object($result)){\n            if(!empty($key)){\n                $data[$row-&gt;{$key}] = $row;\n            }else{\n                $data[] = $row;\n            }\n        }\n        return $data;\n    }\n\n    public function last_insert_id(){\n        return mysql_insert_id($this-&gt;conn);\n    }\n\n    /**\n     * 执行一条带有结果集计数的 count SQL 语句, 并返该计数.\n     */\n    public function count($sql){\n        $result = $this-&gt;query($sql);\n        if($row = mysql_fetch_array($result)){\n            return (int)$row[0];\n        }else{\n            return 0;\n        }\n    }\n\n    /**\n     * 开始一个事务.\n     */\n    public function begin(){\n        mysql_query(''begin'');\n    }\n\n    /**\n     * 提交一个事务.\n     */\n    public function commit(){\n        mysql_query(''commit'');\n    }\n\n    /**\n     * 回滚一个事务.\n     */\n    public function rollback(){\n        mysql_query(''rollback'');\n    }\n\n    /**\n     * 获取指定编号的记录.\n     * @param int $id 要获取的记录的编号.\n     * @param string $field 字段名, 默认为''id''.\n     */\n    function load($table, $id, $field=''id''){\n        $sql = "select * from `{$table}` where `{$field}`=''{$id}''";\n        $row = $this-&gt;get($sql);\n        return $row;\n    }\n\n    /**\n     * 保存一条记录, 调用后, id被设置.\n     * @param object $row\n     */\n    function save($table, &amp;$row){\n        $sqlA = '''';\n        foreach($row as $k=&gt;$v){\n            $sqlA .= "`$k` = ''$v'',";\n        }\n\n        $sqlA = substr($sqlA, 0, strlen($sqlA)-1);\n        $sql  = "insert into `{$table}` set $sqlA";\n        $this-&gt;query($sql);\n        if(is_object($row)){\n            $row-&gt;id = $this-&gt;last_insert_id();\n        }else if(is_array($row)){\n            $row[''id''] = $this-&gt;last_insert_id();\n        }\n    }\n\n    /**\n     * 更新$arr[id]所指定的记录.\n     * @param array $row 要更新的记录, 键名为id的数组项的值指示了所要更新的记录.\n     * @return int 影响的行数.\n     * @param string $field 字段名, 默认为''id''.\n     */\n    function update($table, &amp;$row, $field=''id''){\n        $sqlA = '''';\n        foreach($row as $k=&gt;$v){\n            $sqlA .= "`$k` = ''$v'',";\n        }\n\n        $sqlA = substr($sqlA, 0, strlen($sqlA)-1);\n        if(is_object($row)){\n            $id = $row-&gt;{$field};\n        }else if(is_array($row)){\n            $id = $row[$field];\n        }\n        $sql  = "update `{$table}` set $sqlA where `{$field}`=''$id''";\n        return $this-&gt;query($sql);\n    }\n\n    /**\n     * 删除一条记录.\n     * @param int $id 要删除的记录编号.\n     * @return int 影响的行数.\n     * @param string $field 字段名, 默认为''id''.\n     */\n    function remove($table, $id, $field=''id''){\n        $sql  = "delete from `{$table}` where `{$field}`=''{$id}''";\n        return $this-&gt;query($sql);\n    }\n\n    function escape(&amp;$val){\n        if(is_object($val) || is_array($val)){\n            $this-&gt;escape_row($val);\n        }\n    }\n\n    function escape_row(&amp;$row){\n        if(is_object($row)){\n            foreach($row as $k=&gt;$v){\n                $row-&gt;$k = mysql_real_escape_string($v);\n            }\n        }else if(is_array($row)){\n            foreach($row as $k=&gt;$v){\n                $row[$k] = mysql_real_escape_string($v);\n            }\n        }\n    }\n\n    function escape_like_string($str){\n        $find = array(''%'', ''_'');\n        $replace = array(''\\%'', ''\\_'');\n        $str = str_replace($find, $replace, $str);\n        return $str;\n    }\n}\n?&gt;\n\n\n</pre>\n<p style="line-height:20px; margin:8px 0px; font-family:arial, helvetica, sans-serif; white-space:normal; color:#333333">\n    <strong>使用例子:</strong>\n</p>\n<pre style="padding-bottom:4px; line-height:14px; padding-left:4px; padding-right:4px; color:#333333; padding-top:4px; background-origin:initial; background-clip:initial">\n    &lt;?php\n// 保存\n$db-&gt;save(''table_1'', $row);\n// 更新\n$db-&gt;update(''table_1'', $row);\n// 删除\n$db-&gt;remove(''table_1'', 1);\n// 查询\n$rows = $db-&gt;find($sql, ''id'')\n?&gt;\n\n</pre>\n<p>\n    &nbsp;&nbsp;\n</p>', '2011-10-01 06:00:00', 0, 0),
(7, 2, 'Apache 漏洞允许攻击者访问内网\r\n', 'admin', '　如果反向代理/重写规则没有正确定义，Apache HTTP服务器中一个尚未修复的漏洞将会允许攻击者访问内网中的敏感信息。反向代理模式被用于设置负载平衡、缓存和其它涉及多服务器资源分配的操作。Qualys的安全研...', '<p>\n    如果反向代理/重写规则没有正确定义，Apache HTTP服务器中一个尚未修复的漏洞将会允许攻击者访问内网中的敏感信息。反向代理模式被用于设置负载平衡、缓存和其它涉及多服务器资源分配的操作。Qualys的安全研究员发出警告，如果重写规则没有正确定义，攻击者可以诱使服务器执行未授权内网访问请求。&nbsp;\n</p>\n<p>\n    　　&nbsp;<strong><a href="http://httpd.apache.org/download.cgi"><span style="color:#005a98">下载最新版</span></a></strong>\n</p>\n<p>\n    &nbsp;\n</p>', '2011-10-03 07:00:00', 0, 1),
(8, 2, '超级负载均衡\r\n', 'admin', '　摘要　　超级负载均衡旨在为解决服务不断扩展、机器不断增多、机器性能差异等问题，以增强系统的稳定性，自动分配请求压力。算法实现了多个模型和均衡策略，能通过配置实现随机、轮询、一致hash等。同时也能...', '<p>\n    摘要&nbsp;\n</p>\n<p>\n    　　超级负载均衡旨在为解决服务不断扩展、机器不断增多、机器性能差异等问题，以增强系统的稳定性，自动分配请求压力。算法实现了多个模型和均衡策略，能通过配置实现随机、轮询、一致hash等。同时也能实现跨机房的相关分配。现已经在多个系统中使用。\n</p>\n<p>\n    　　TAG\n</p>\n<p>\n    　　负载均衡\n</p>\n<p>\n    　　内容\n</p>\n<p>\n    　　现有系统中存在的问题：\n</p>\n<p>\n    　　1. 慢连接、瞬时访问慢。\n</p>\n<p>\n    　　场景一：\n</p>\n<p>\n    　　如果后端新增加机器，cache命中率低，因此响应速度慢，但是能连接上且不超时。如果ui持续访问就会把ui夯住。\n</p>\n<p>\n    　　场景二：\n</p>\n<p>\n    　　如果后端模块某一台机器响应较慢。如果前端持续访问就会被夯住。\n</p>\n<p>\n    　　2. 死机。\n</p>\n<p>\n    　　场景一：\n</p>\n<p>\n    　　能断断续续响应请求，不过速度很慢。造成ui夯住。\n</p>\n<p>\n    　　3. 混合部署。\n</p>\n<p>\n    　　场景一：\n</p>\n<p>\n    　　多个模块在同一机器上，项目影响。\n</p>\n<p>\n    　　4. 机器权重。\n</p>\n<p>\n    　　场景一：\n</p>\n<p>\n    　　老机器，性能差;新机器，性能彪悍。因此他们应该承载不同的压力。\n</p>\n<p>\n    　　5. 跨机房冗余。\n</p>\n<p>\n    　　场景一：\n</p>\n<p>\n    　　后端对cache依赖很高的模块，因为采用的是一致hash算法，如果挂掉一台机器，对另外的机器cache命中率冲击很大。因此希望将对这个机器的请求均衡到另外一个机房。\n</p>\n<p>\n    　　6. php和c使用同样的策略。\n</p>\n<p>\n    　　现在php和c希望能使用的策略实际上是有很大的一致。为了避免重复开发，php和c希望采用同样的负载均衡库。\n</p>\n<p>\n    　　要解决的问题：\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://stblog.baidu-tech.com/wp-content/uploads/wp-display-data.php?filename=11307504420.png&amp;type=image%2Fpng&amp;width=696&amp;height=619" width="640" height="569" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　设计思路：\n</p>\n<p>\n    　　1. 根据均衡策略计算出的均衡值对Server进行逆序排序。\n</p>\n<p>\n    　　2. 负载选择。对步骤1排序后的Server按以下顺序进行选择：\n</p>\n<p>\n    　　a、按连接失败概率进行选择。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://stblog.baidu-tech.com/wp-content/uploads/wp-display-data.php?filename=11307504511.jpg&amp;type=image%2Fjpeg&amp;width=374&amp;height=272" width="374" height="272" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　注：横轴代表失败次数，纵轴代表选择的概率。\n</p>\n<p>\n    　　Cconn：一段区间内失败次数\n</p>\n<p>\n    　　f(Cconn)：连接概率，取值范围在(0，100]\n</p>\n<p>\n    　　b、按健康状态选择。\n</p>\n<p>\n    　　整个模型基于服务处理时间的收敛性。\n</p>\n<p>\n    　　分析：\n</p>\n<p>\n    　　1) 如果机器状态良好，则平均处理时间会保持在一个稳定水平;即使是小波动，也会较快平稳在一个状态。\n</p>\n<p>\n    　　2) 如果机器开始出现问题，处理时间会开始增长。如果增长持续超过一段时间，则说明有可能会影响服务;如果一段时间后稳定了，说明对请求没有太多影响。\n</p>\n<p>\n    　　f(healthy)：机器健康状态，取值范围[0,1]\n</p>\n<p>\n    　　select(healthy)：机器选择概率，取值范围[R,1]\n</p>\n<p>\n    　　c、如果所有机器都没选中，则随机选择一台机器进行服务。\n</p>\n<p>\n    　　3. 机器流量均分。\n</p>\n<p>\n    　　不同的机器处理能力是不一样的。当按照步骤2选择了某台机器，需要将其他处理时间为他的1/T(T&gt;=2)的机器也选取出来，将部分压力分给对应的机器。\n</p>\n<p>\n    　　设k台机器的处理时间分别是t1, t2,…,tk, 选中的机器id=i，比该机器处理能力高的机器时间分别为p1,p2,..,pr, (其中pj × T &lt;= ti)。设一段时间总访问量为Y，每台机器理论上的访问量应该为Vg=Y/k。而实际的Vr=Y/(ti * (1/t1+1/t2+…+1/tk))。则应该分出Vg-Vr的流量给pj。pj的流量比例为1/p1:1/p2:…:1/pr\n</p>\n<p>\n    　　算法设计：\n</p>\n<p>\n    　　A、均衡算法\n</p>\n<p>\n    　　1. 一致hash算法。\n</p>\n<p>\n    　　将每个server的ip和port加上balance_key三者做字符串拼接后，做md5签名。\n</p>\n<p>\n    　　value(server) = md5(server_ip + server_port + balance_key)\n</p>\n<p>\n    　　2. 随机算法。\n</p>\n<p>\n    　　value(server) = random();\n</p>\n<p>\n    　　3. 轮询算法。\n</p>\n<p>\n    　　value(server) =((server.id – (rounds % server_count)) + server_count) % server_count\n</p>\n<p>\n    　　4. 多个选一算法。\n</p>\n<p>\n    　　rank初始化为1， 如果默认的server失败，则rank+1\n</p>\n<p>\n    　　value(server) =((server.id – (rank % server_count)) + server_count) % server_count\n</p>\n<p>\n    　　B、负载算法\n</p>\n<p>\n    　　1. 连接状态算法。\n</p>\n<p>\n    　　a、对每一个server开辟一个状态队列。bool queue[K] 用来统计失败次数。每次有坏状态进队，计数加一。如果有坏状态出队，则计数减一。\n</p>\n<p>\n    　　b、按照f(Cconn)公式计算出选择概率。\n</p>\n<p>\n    　　c、利用rand()%100是否在[0,f(Cconn)]来决定是否选择该机器。\n</p>\n<p>\n    　　2. 健康状态算法。\n</p>\n<p>\n    　　a、每台机器维持一个一秒钟内的处理时间T和次数C。\n</p>\n<p>\n    　　b、当一秒过去以后，将T、C计算为平均处理时间R。\n</p>\n<p>\n    　　c、每M秒，统计每台机器最近一段时间的平均处理时间， 按照公式select(healthy)算出选择概率。\n</p>\n<p>\n    　　d、利用rand()%100是否在[0, select(healthy)*100]来决定是否选择该机器。\n</p>\n<p>\n    　　C、流量均分\n</p>\n<p>\n    　　按照策略选出满足要求的机器，按照流量均分公式进行流量分配。\n</p>\n<p>\n    　　分配时按照balance_key+server方式和random()来分配机器， 尽量保证请求落在同一台机器。\n</p>\n<p>\n    　　by wangbo\n</p>\n<p>\n    &nbsp;\n</p>', '2011-09-01 08:00:00', 0, 1),
(9, 2, 'Nginx 502错误触发条件与解决办法汇总\r\n', 'admin', '　　一些运行在Nginx上的网站有时候会出现502 Bad Gateway错误，有些时候甚至频繁的出现。有些站长是在刚刚转移到Nginx之后就出现了这个问题，所以经常会怀疑这是不是Nginx的问题，但事实上这是个误区。　　以...', '<p>\n    一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误，有些时候甚至频繁的出现。有些站长是在刚刚转移到Nginx之后就出现了这个问题，所以经常会怀疑这是不是Nginx的问题，但事实上这是个误区。&nbsp;\n</p>\n<p>\n    　　以下是从张宴和Ayou的博客搜集整理的一些Nginx 502错误的排查方法，供大家参考：\n</p>\n<p>\n    　　Nginx 502错误的原因比较多，是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题，一定要从后端找原因!但nginx把这些出错都揽在自己身上了，着实让nginx的推广者备受置疑，毕竟从字眼上理解，bad gateway?不就是bad nginx吗?让不了解的人看到，会直接把责任推在nginx身上，希望nginx下一个版本会把出错提示写稍微友好一些，至少不会是现在简单的一句502 Bad Gateway，另外还不忘附上自己的大名。\n</p>\n<p>\n    　　Nginx 502的触发条件\n</p>\n<p>\n    　　502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置：proxy_next_upstream，这个配置指定了nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机，里头写上的就是会出现502的所有情况拉，默认是error timeout。error就是当机、断线之类的，timeout就是读取堵塞超时，比较容易理解。我一般是全写上的：\n</p>\n<p>\n    &nbsp;\n</p>\n<pre style="padding-bottom:0px; line-height:28px; overflow-x:auto; overflow-y:auto; background-color:#f8f8f8; margin-top:0px; padding-left:0px; width:591px; padding-right:0px; font-family:&#39;courier new&#39;, monospace; color:#333333; padding-top:0px; background-origin:initial; background-clip:initial">\n    proxy_next_upstream error timeout invalid_header http_500 http_503;\n</pre>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　不过现在可能我要去掉http_500这一项了，http_500指定后端返回500错误时会转一个主机，后端的jsp出错的话，本来会打印一堆stacktrace的错误信息，现在被502取代了。但公司的程序员可不这么认为，他们认定是nginx出现了错误，我实在没空跟他们解释502的原理了……\n</p>\n<p>\n    　　503错误就可以保留，因为后端通常是apache resin，如果apache死机就是error，但resin死机，仅仅是503，所以还是有必要保留的。\n</p>\n<p>\n    <strong>　　解决办法</strong>\n</p>\n<p>\n    　　遇到502问题，可以优先考虑按照以下两个步骤去解决。\n</p>\n<p>\n    　　1、查看当前的PHP FastCGI进程数是否够用：\n</p>\n<p>\n    &nbsp;\n</p>\n<pre style="padding-bottom:0px; line-height:28px; overflow-x:auto; overflow-y:auto; background-color:#f8f8f8; margin-top:0px; padding-left:0px; width:591px; padding-right:0px; font-family:&#39;courier new&#39;, monospace; color:#333333; padding-top:0px; background-origin:initial; background-clip:initial">\n    netstat -anpo | grep "php-cgi" | wc -l\n</pre>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”，那么，说明“FastCGI进程数”不够用，需要增大。\n</p>\n<p>\n    　　2、部分PHP程序的执行时间超过了Nginx的等待时间，可以适当增加nginx.conf配置文件中FastCGI的timeout时间，例如：\n</p>\n<p>\n    &nbsp;\n</p>\n<pre style="padding-bottom:0px; line-height:28px; overflow-x:auto; overflow-y:auto; background-color:#f8f8f8; margin-top:0px; padding-left:0px; width:591px; padding-right:0px; font-family:&#39;courier new&#39;, monospace; color:#333333; padding-top:0px; background-origin:initial; background-clip:initial">\n    ......\nhttp\n{\n......\nfastcgi_connect_timeout 300;\nfastcgi_send_timeout 300;\nfastcgi_read_timeout 300;\n......\n}\n......\n</pre>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　php.ini中memory_limit设低了会出错，修改了php.ini的memory_limit为64M，重启nginx，发现好了，原来是PHP的内存不足了。\n</p>\n<p>\n    　　如果这样修改了还解决不了问题，可以参考下面这些方案：\n</p>\n<p>\n    　　一、max-children和max-requests\n</p>\n<p>\n    　　一台服务器上运行着nginx php(fpm) xcache，访问量日均 300W pv左右\n</p>\n<p>\n    　　最近经常会出现这样的情况： php页面打开很慢，cpu使用率突然降至很低，系统负载突然升至很高，查看网卡的流量，也会发现突然降到了很低。这种情况只持续数秒钟就恢复了\n</p>\n<p>\n    　　检查php-fpm的日志文件发现了一些线索\n</p>\n<p>\n    &nbsp;\n</p>\n<pre style="padding-bottom:0px; line-height:28px; overflow-x:auto; overflow-y:auto; background-color:#f8f8f8; margin-top:0px; padding-left:0px; width:591px; padding-right:0px; font-family:&#39;courier new&#39;, monospace; color:#333333; padding-top:0px; background-origin:initial; background-clip:initial">\n    Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200\nSep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″\nSep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll\nSep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587\n</pre>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　在这几句的前面，是1000多行的关闭children和开启children的日志\n</p>\n<p>\n    　　原来，php-fpm有一个参数 max_requests，该参数指明了，每个children最多处理多少个请求后便会被关闭，默认的设置是500。因为php是把请求轮询给每个children，在大流量下，每个childre到达max_requests所用的时间都差不多，这样就造成所有的children基本上在同一时间被关闭。\n</p>\n<p>\n    　　在这期间，nginx无法将php文件转交给php-fpm处理，所以cpu会降至很低(不用处理php，更不用执行sql)，而负载会升至很高(关闭和开启children、nginx等待php-fpm)，网卡流量也降至很低(nginx无法生成数据传输给客户端)\n</p>\n<p>\n    　　解决问题很简单，增加children的数量，并且将 max_requests 设置未 0 或者一个比较大的值：\n</p>\n<p>\n    　　打开 /usr/local/php/etc/php-fpm.conf\n</p>\n<p>\n    　　调大以下两个参数(根据服务器实际情况，过大也不行)\n</p>\n<p>\n    &nbsp;\n</p>\n<pre style="padding-bottom:0px; line-height:28px; overflow-x:auto; overflow-y:auto; background-color:#f8f8f8; margin-top:0px; padding-left:0px; width:591px; padding-right:0px; font-family:&#39;courier new&#39;, monospace; color:#333333; padding-top:0px; background-origin:initial; background-clip:initial">\n    &lt;value name=”max_children”&gt;5120&lt;/value&gt;\n&lt;value name=”max_requests”&gt;600&lt;/value&gt;\n</pre>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　然后重启php-fpm。\n</p>\n<p>\n    <strong>　　二、增加缓冲区容量大小</strong>\n</p>\n<p>\n    　　将nginx的error log打开，发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料，大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修改办法增加了缓冲区容量大小设置，502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数：client head buffer，fastcgi buffer size。\n</p>\n<p>\n    <strong>　　三、request_terminate_timeout</strong>\n</p>\n<p>\n    　　如果主要是在一些post或者数据库操作的时候出现502这种情况，而不是在静态页面操作中常见，那么可以查看一下php-fpm.conf设置中的一项：\n</p>\n<p>\n    　　request_terminate_timeout\n</p>\n<p>\n    　　这个值是max_execution_time，就是fast-cgi的执行脚本时间。\n</p>\n<p>\n    　　0s\n</p>\n<p>\n    　　0s为关闭，就是无限执行下去。(当时装的时候没仔细看就改了一个数字)\n</p>\n<p>\n    　　发现，问题解决了，执行很长时间也不会出错了。\n</p>\n<p>\n    　　优化fastcgi中，还可以改改这个值5s 看看效果。\n</p>\n<p>\n    　　php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉，都会出现502错误。\n</p>\n<p>\n    　　如果您还有其他的解决方法，欢迎与编辑沟通!当然，如果你的网站并发量的确很大，那么最终也许需要寻求系统级的解决办法……\n</p>\n<div class="pages">\n    <div id="numpage">\n    </div>\n</div>\n<p>\n    &nbsp;\n</p>', '2011-09-08 09:00:00', 0, 1),
(10, 2, 'Nginx(PHP/fastcgi)的PATH_INFO问题\r\n', 'admin', 'PATH_INFO是一个CGI 1.1的标准，经常用来做为传参载体.比如, 我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 另外不少PHP框架也使用PATH_INFO来作为路由载体. 在Apache中, 当不加配置的时候, 对于P...', '<p>\n    PATH_INFO是一个CGI 1.1的标准，经常用来做为传参载体.&nbsp;\n</p>\n<p>\n    　　比如, 我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 另外不少PHP框架也使用PATH_INFO来作为路由载体.\n</p>\n<p>\n    　　在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:\n</p>\n<p>\n    　　如果在服务器在存在一个/laruence/index.php\n</p>\n<p>\n    　　那么, 对于如下请求,\n</p>\n<p>\n    　　/laruence/index.php/dummy\n</p>\n<p>\n    　　/laruence/dummy\n</p>\n<p>\n    　　Apache都接受, 都会认为是对info.php的访问, 并会设置PATH_INFO为dummy\n</p>\n<p>\n    　　而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.\n</p>\n<p>\n    　　而因为默认的配置文件对PHP的支持只是很基础的, 所以对于默认配置来说对于上面的访问也会是404, 提示找不到文件出错.\n</p>\n<p>\n    　　这对于一些使用PATH_INFO来传递关键信息的PHP框架来说(比如Kohana, Thinkphp), 简直是致命的.\n</p>\n<p>\n    　　对于这个问题, 一般来说有俩种解决方法, 第一种就是使用rewrite, 但是这个方法的缺点也是很明显的, 需要把PATH_INFO转换成Query String. 此处就不说明这种方法了~\n</p>\n<p>\n    　　而, 第二种方法就是我今天要提的, 模拟PATH_INFO:\n</p>\n<p>\n    　　首先 , 我们知道在Nginx中, 是通过对文件名的扩展名匹配, 来决定是否要交给php cgi服务器去解释的. 在nginx.conf中一般都有如下的默认配置段:\n</p>\n<p>\n    　　location ~ .php$ {\n</p>\n<p>\n    　　fastcgi_index index.php;\n</p>\n<p>\n    　　fastcgi_pass 127.0.0.1:9000;\n</p>\n<p>\n    　　include fastcgi_params;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　所以,对于形如/laruence/info.php/pathinfo这样的文件路径, Nginx是不会正确的交给php cgi服务器的. 所以我们需要改写这段配置为:\n</p>\n<p>\n    　　location ~ .php {//片段匹配\n</p>\n<p>\n    　　fastcgi_index index.php;\n</p>\n<p>\n    　　fastcgi_pass 127.0.0.1:9000;\n</p>\n<p>\n    　　include fastcgi_params;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?\n</p>\n<p>\n    　　首先, 我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(ini配置解释), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值(其实也就是说明, PHP最初对CGI 1.1的支持并不到位)\n</p>\n<p>\n    　　然后, 就只要添加一个FASTCGI_PARAM项就好了:\n</p>\n<p>\n    　　location ~ .php {\n</p>\n<p>\n    　　fastcgi_index index.php;\n</p>\n<p>\n    　　fastcgi_pass 127.0.0.1:9000;\n</p>\n<p>\n    　　include fastcgi_params;\n</p>\n<p>\n    　　fastcgi_param PATH_INFO $fastcgi_script_name;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　现在试试吧…\n</p>\n<p>\n    　　btw: 当然, 上面的解决方法, 把对路径的分析交给了PHP去处理, 网上也有朋友给出了另外一种配置方法, 这个方法是由Nginx来分析路径(也就不需要fix_pathinfo):\n</p>\n<p>\n    　　location ~ \\.php\n</p>\n<p>\n    　　{\n</p>\n<p>\n    　　fastcgi_index index.php;\n</p>\n<p>\n    　　fastcgi_pass 127.0.0.1:9000;\n</p>\n<p>\n    　　include fastcgi_params;\n</p>\n<p>\n    　　set $path_info “”;\n</p>\n<p>\n    　　set $real_script_name $fastcgi_script_name;\n</p>\n<p>\n    　　if ($fastcgi_script_name ~ “^(.+?\\.php)(/.+)$”) {\n</p>\n<p>\n    　　set $real_script_name $1;\n</p>\n<p>\n    　　set $path_info $2;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;\n</p>\n<p>\n    　　fastcgi_param SCRIPT_NAME $real_script_name;\n</p>\n<p>\n    　　fastcgi_param PATH_INFO $path_info;\n</p>\n<p>\n    　　}\n</p>\n<p>\n    　　后记, 最近发现的一个安全漏洞(Nginx + PHP CGI的一个可能的安全漏洞)和这个配置有关系, 请大家务必在使用第二种配置的时候,关闭cgi.fix_pathinfo. 另外关于这个漏洞我个人认为这个和Nginx没啥关系, 不属于Nginx的漏洞. 是配置的问题, 现在到处都在说是Nginx的Bug, 不妥不妥.\n</p>\n<div class="pages">\n    <div id="numpage">\n    </div>\n</div>\n<p>\n    &nbsp;\n</p>', '2011-09-04 05:00:00', 0, 1);
INSERT INTO `news` (`newsId`, `parentId`, `title`, `author`, `desc`, `content`, `addtime`, `views`, `recommend`) VALUES
(11, 2, '网站性能优化之Apache调整\r\n', 'admin', '1. 开启Keep-Alive 开启Keep-Alive后，可以保证浏览器和服务器之间的连接持久存在，这样如果同一个域名请求很多资源的情况下可以省去建立连接的时间和资源消耗。所 以对于静态服务器来说，由于一个域名会请求N多资源，比较宜开启Keep-Alive，但是对于动态服', '<p>\n    <strong>1. 开启Keep-Alive</strong>\n</p>\n<p>\n    　　开启Keep-Alive后，可以保证浏览器和服务器之间的连接持久存在，这样如果同一个域名请求很多资源的情况下可以省去建立连接的时间和资源消耗。所 以对于静态服务器来说，由于一个域名会请求N多资源，比较宜开启Keep-Alive，但是对于动态服务器，不宜开启Keep-Alive，因为这样会造 成很多的空闲进程，浪费内存空间。\n</p>\n<p>\n    　　配置：\n</p>\n<p>\n    　　KeepAlive On #开启KeepAlive\n</p>\n<p>\n    　　KeepAliveTimeout 5 #保持连接5秒\n</p>\n<p>\n    　　<strong>2. HTTP缓存设置</strong>\n</p>\n<p>\n    　　当直接在浏览器中输入一个URL，或者点击一个链接的时候，那么浏览器缓存就会起作用，如果缓存没有过期，那么浏览器会从本地读取资源，不会发起HTTP请求，如果缓存过期，那么浏览器会发起新的浏览器请求。按ctrl+F5，浏览器会情况本地缓存，重新请求资源。\n</p>\n<p>\n    　　Expires是HTTP/1.0的缓存头， Cache-Control: max-age 是HTTP/1.1是用来进行HTTP缓存的头。Expires指定了资源过期的绝对时间，GMT格式，Cache-Control: max-age指定了资源过期的相对时间，单位是秒。在支持HTTP/1.1的浏览器上，如果发送两个头，那么Cache-Control: max-age会覆盖掉Expires;在支持HTTP/1.0的浏览器上，即使发送了两个头，但是只有Expires会起作用，所以为了兼容老的浏览 器，还是要同时发送这两个头。设置HTTP缓存，需要安装expires_module，其会发送Expires和Cache-Control: max-age两个HTTP头。\n</p>\n<p>\n    　　配置：\n</p>\n<p>\n    　　\n    <ifmodule>\n    </ifmodule>\n</p>\n<p>\n    　　ExpiresActive On\n</p>\n<p>\n    　　ExpiresByType application/x-javascript &quot;access plus 30 days&quot;\n</p>\n<p>\n    　　ExpiresByType text/css &quot;access plus 30 days&quot;\n</p>\n<p>\n    　　ExpiresByType image/gif &quot;access plus 30 days&quot;\n</p>\n<p>\n    　　ExpiresByType image/jpeg &quot;access plus 30 days&quot;\n</p>\n<p>\n    　　ExpiresByType image/png &quot;access plus 30 days&quot;\n</p>\n<p>\n    　　\n</p>\n<p>\n    　　ExpiresByType application/x-javascript “access plus 30 days” 表示对js资源设置Expires和Cache-Control: max-age头，其中Expires的值是以客户端访问资源的时间为基准的后30天，Cache-Control: max-age的值是3600x24x30秒。\n</p>\n<p>\n    　　ExpiresByType application/x-javascript “modification plus 30 days”和上面效果一样，只是Expires的时间是以资源最后修改的时间作为计算的基准。\n</p>\n<p>\n    　　<strong>3. 开启Gzip压缩，并设置vary头</strong>\n</p>\n<p>\n    　　Gzip会对文本资源进行压缩，一般能节省40%的大小，二进制内容不需要开启Gzip压缩，因为这些文件是已经压缩过的，如果再进行Gzip压缩反而会 增加其大小。静态资源一般都会在代理服务器上进行缓存，而有的浏览器支持Gzip，但是也有不支持Gzip的老旧浏览器，所以需要设置Vary: Accept-Encoding 头，这个头告诉代理缓存服务器要对资源缓存两份，一份压缩过的，一份没有压缩过，然后根据浏览器发送的Accept-Encoding头来返回压缩或者不 压缩的内容。设置Gzip压缩，需要安装deflate_module。\n</p>\n<p>\n    　　配置：\n</p>\n<p>\n    　　\n    <ifmodule>\n    </ifmodule>\n</p>\n<p>\n    　　#对js,html,xml,css,普通文本开启Gzip压缩\n</p>\n<p>\n    　　AddOutputFilterByType DEFLATE application/x-javascript text/html text/plain text/xml text/css\n</p>\n<p>\n    　　\n</p>\n<p>\n    　　<strong>4. 关掉ETag</strong>\n</p>\n<p>\n    　　Last-Modified与ETag是同样的功能，都是用来标识一个资源是否更改过，Last-Modified的值是资源的时间戳，如果按F5或者刷 新按钮则If-Modified-Since头会带着时间戳发送到服务器，如果服务器上资源的最后修改时间&lt;=这个时间，那么返回304 Not Modified，否则返回200 OK 以及新的资源;ETag的值是通过资源的信息(一般为inode，大小，时间戳)而计算出来的一个字符串，如果按F5或者刷新按钮则If-None- Match头会带着这个值发送到服务器，服务器用这个值来和当前资源的值进行比对，如果相等，则返回304 Not Modified，否则返回200 OK 以及新的资源。默认情况下Apache对静态资源会发送Last-Modified和ETage，但是由于ETage的计算会耗费服务器的CPU资源，所 以选择关掉，只开启Last-Modified。\n</p>\n<p>\n    　　配置：\n</p>\n<p>\n    　　FileETag None\n</p>\n<p>\n    　　Header unsets ETag\n</p>\n<div class="pages">\n    <div id="numpage">\n    </div>\n</div>\n<div class="clear">\n    <div id="baidu_clb_slot_168229">\n        <iframe style="border-right-width:0px; margin:0px; display:block; border-top-width:0px; border-bottom-width:0px; vertical-align:bottom; border-left-width:0px" id="baidu_clb_slot_iframe_168229" height="60" marginheight="0" src="about:blank" frameborder="0" width="468" marginwidth="0" scrolling="no"></iframe>\n    </div><br />\n</div>\n<p>\n    &nbsp;\n</p>', '2011-08-06 10:00:00', 0, 1),
(12, 2, 'Apache如何添加虚拟目录\r\n', 'admin', '添加虚拟目录 IfModule alias_module Alias /sww/ C:/xampp/htdocs/test/ /IfModule 出现限制权限访问， Access forbidden! You don''t have permission to access the requested object. It is either read-protected or not readable by the server. If you', '<h2 style="line-height:20px; margin:13px 0cm 0px; color:#4b4b4b">\n    <span style="line-height:30px; font-family:宋体; color:#4f81bd; font-size:12px">添加虚拟目录</span>\n</h2>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:16px; font-family:courier new; font-size:13px">&lt;IfModule alias_module&gt;</span><span style="font-size:13px"><span style="line-height:16px"><br />\n        </span><span style="line-height:16px; font-family:courier new"><span style="line-height:19px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Alias /sww/ &quot;C:/xampp/htdocs/test/&quot;</span></span><span style="line-height:16px"><span style="font-size:13px"><br />\n        </span><span style="font-family:courier new; font-size:13px">&lt;/IfModule&gt;</span></span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:宋体">出现限制权限访问，</span>\n</p>\n<h1 style="line-height:21px; margin:32px 0cm 0px; color:#4b4b4b">\n    <span style="line-height:39px; font-family:cambria; font-size:12px">Access forbidden!</span>\n</h1>\n<p style="line-height:19px; margin:5px 0cm; color:#4b4b4b; font-size:13px">\n    You don&#39;t have permission to access the requested object. It is either read-protected or not readable by the server.\n</p>\n<p style="line-height:19px; margin:5px 0cm; color:#4b4b4b; font-size:13px">\n    If you think this is a server error, please contact the&nbsp;<span style="font-size:16px"><a style="color:#1a8bc8" href="mailto:postmaster@localhost"><span style="line-height:24px; font-family:times new roman; color:#075db3">webmaster</span></a></span>.\n</p>\n<h2 style="line-height:20px; margin:13px 0cm 0px; color:#4b4b4b">\n    <span style="line-height:30px; font-family:cambria; font-size:12px">Error 403</span>\n</h2>\n<address style="line-height:19px; margin:0cm 0cm 0px 48px; color:#4b4b4b; font-size:13px">\n    <a style="color:#1a8bc8" href="http://localhost:81/">localhost</a><br />\n    <span style="font-family:times new roman; font-size:13px">2011/8/26 17:36:49<br />\n        Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1</span>\n</address>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:calibri">&nbsp;</span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:宋体">需添加目录设置</span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new; font-size:13px">&lt;Directory &quot;C:/xampp/htdocs/test/&quot;&gt;</span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px">AllowOverride None</span></span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px">Options None</span></span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px">Order allow,deny</span></span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px">Allow from all</span></span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:16px; font-family:courier new; font-size:13px">&lt;/Directory&gt;</span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:16px; font-family:宋体; font-size:13px">尝试：</span>\n</p>\n<p style="line-height:17px; text-indent:-24px; margin:0cm 0cm 0px 48px; color:#4b4b4b; font-size:13px" class="MsoListParagraphCxSpFirst">\n    <span style="line-height:16px"><span style="line-height:19px"><span style="font-family:courier new; font-size:13px">1.</span><span style="line-height:normal; font-family:times new roman; font-size:9px">&nbsp;&nbsp;</span></span></span><span style="line-height:16px; font-family:宋体; font-size:13px">将</span><span style="font-size:13px"><span style="line-height:16px; font-family:courier new">C:/xampp/htdocs/test/</span><span style="line-height:16px; font-family:宋体">的</span><span style="line-height:16px; font-family:courier new">/</span><span style="line-height:16px; font-family:宋体">去掉，结果：无法启动</span></span><span style="line-height:16px; font-family:courier new; font-size:13px">apache</span>\n</p>\n<p style="line-height:17px; text-indent:-24px; margin:0cm 0cm 0px 48px; color:#4b4b4b; font-size:13px" class="MsoListParagraphCxSpMiddle">\n    <span style="line-height:16px"><span style="line-height:19px"><span style="font-family:courier new; font-size:13px">2.</span><span style="line-height:normal; font-family:times new roman; font-size:9px">&nbsp;&nbsp;</span></span></span><span style="line-height:16px; font-family:宋体; font-size:13px">将</span><span style="font-size:13px"><span style="line-height:16px; font-family:courier new">C:/xampp/htdocs/test/</span><span style="line-height:16px; font-family:宋体">的</span><span style="line-height:16px; font-family:courier new">/</span><span style="line-height:16px; font-family:宋体">改成</span><span style="line-height:16px; font-family:courier new">\\</span><span style="line-height:16px; font-family:宋体">，结果：无法启动</span></span><span style="line-height:16px; font-family:courier new; font-size:13px">apache</span>\n</p>\n<p style="line-height:17px; text-indent:-24px; margin:0cm 0cm 0px 48px; color:#4b4b4b; font-size:13px" class="MsoListParagraphCxSpMiddle">\n    <span style="line-height:16px"><span style="line-height:19px"><span style="font-family:courier new; font-size:13px">3.</span><span style="line-height:normal; font-family:times new roman; font-size:9px">&nbsp;&nbsp;</span></span></span><span style="line-height:16px; font-family:宋体; font-size:13px">将</span><span style="font-size:13px"><span style="line-height:16px; font-family:courier new">C:/xampp/htdocs/test/</span><span style="line-height:16px; font-family:宋体">改为</span><span style="line-height:16px; font-family:courier new">&quot;D:/Work/Booksir/BP/Code/User_Booksir_com_cn/trunk/&quot;</span><span style="line-height:16px; font-family:宋体">，结果：无法启动</span></span><span style="line-height:16px; font-family:courier new; font-size:13px">apache</span>\n</p>\n<p style="line-height:17px; text-indent:-24px; margin:0cm 0cm 0px 48px; color:#4b4b4b; font-size:13px" class="MsoListParagraphCxSpMiddle">\n    <span style="line-height:16px"><span style="line-height:19px"><span style="font-family:courier new; font-size:13px">4.</span><span style="line-height:normal; font-family:times new roman; font-size:9px">&nbsp;&nbsp;</span></span></span><span style="line-height:16px; font-family:courier new; font-size:13px">C:/xampp/htdocs/test/</span><span style="font-size:13px"><span style="line-height:16px; font-family:宋体">文件夹有</span><span style="line-height:16px; font-family:courier new">Everyone</span><span style="line-height:16px; font-family:宋体">完全控制权限，给</span><span style="line-height:16px; font-family:courier new">D:/Work/Booksir/BP/Code/User_Booksir_com_cn/trunk</span><span style="line-height:16px; font-family:宋体">加上</span><span style="line-height:16px; font-family:courier new">Everyone</span><span style="line-height:16px; font-family:宋体">的完全控制权限，结果：仍无法启动</span></span><span style="line-height:16px; font-family:courier new; font-size:13px">apache</span>\n</p>\n<p style="line-height:17px; text-indent:-24px; margin:0cm 0cm 13px 48px; color:#4b4b4b; font-size:13px" class="MsoListParagraphCxSpLast">\n    <span style="line-height:16px"><span style="line-height:19px"><span style="font-family:courier new; font-size:13px">5.</span><span style="line-height:normal; font-family:times new roman; font-size:9px">&nbsp;&nbsp;</span></span></span><span style="line-height:16px; font-family:宋体; font-size:13px">将</span><span style="font-size:13px"><span style="line-height:16px; font-family:courier new">&quot;D:/Work/Booksir/BP/Code/User_Booksir_com_cn/trunk/&quot;</span><span style="line-height:16px; font-family:宋体">的</span><span style="line-height:16px; font-family:courier new">/</span><span style="line-height:16px; font-family:宋体">去掉，</span><span style="line-height:16px; font-family:courier new">/sww/</span><span style="line-height:16px; font-family:宋体">的</span><span style="line-height:16px; font-family:courier new">/</span><span style="line-height:16px; font-family:宋体">去掉，结果：成功启动</span></span><span style="line-height:16px; font-family:courier new; font-size:13px">apache</span>\n</p>\n<h3 style="background-image:none; text-align:left; line-height:17px; margin:13px 0cm 0px; color:#666666; font-size:14px">\n    <span style="line-height:21px; font-family:宋体; color:#4f81bd; font-size:12px">结论：</span>\n</h3>\n<h3 style="background-image:none; text-align:left; line-height:17px; margin:13px 0cm 0px; color:#666666; font-size:14px">\n    <span style="line-height:21px; font-family:宋体; color:#4f81bd; font-size:12px">最好</span>\n</h3>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="background-image:none; line-height:16px; background-color:#ffff00; background-attachment:scroll; font-family:courier new; background-position:0% 0%; font-size:13px">Alias /sww &quot;D:/Work/Booksir/BP/Code/User_Booksir_com_cn/trunk&quot;</span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="background-image:none; line-height:16px; background-color:#ffff00; background-attachment:scroll; font-family:courier new; background-position:0% 0%; font-size:13px">&lt;Directory &quot;D:/Work/Booksir/BP/Code/User_Booksir_com_cn/trunk&quot;&gt;</span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:16px; font-family:宋体; font-size:13px">后面都不要加</span><span style="font-size:13px"><span style="line-height:16px; font-family:courier new">/</span><span style="line-height:16px; font-family:宋体">，都不要使用</span><span style="line-height:16px; font-family:courier new">\\</span></span><span style="line-height:16px; font-family:宋体; font-size:13px">，这样比较保险</span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px"># If you include a trailing / on /webpath then the server will</span></span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px"># require it to be present in the URL.&nbsp;&nbsp;You will also likely</span></span>\n</p>\n<p style="line-height:normal; color:#4b4b4b; font-size:13px">\n    <span style="line-height:19px; font-family:courier new"><span style="font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px"># need to provide a &lt;Directory&gt; section to allow access to</span></span>\n</p>\n<p style="line-height:17px; margin:0cm 0cm 13px; color:#4b4b4b; font-size:13px">\n    <span style="line-height:16px; font-family:courier new"><span style="line-height:19px; font-size:13px">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:13px"># the filesystem path.</span></span>\n</p>\n<p>\n    &nbsp;\n</p>', '2011-07-06 05:00:00', 0, 1),
(13, 3, '在PHP中开发XML应用程序之基础篇\r\n', 'admin', 'XML(可扩展的标注语言)是一种W3C标准，主要用于Web应用程序和服务器之间实现容易的交互、数据的存储与使用。\r\n\r\n', '一、 XML简介\n\n　　XML(可扩展的标注语言)是一种W3C标准，主要用于Web应用程序和服务器之间实现容易的交互、数据的存储与使用。\n\n　　使用XML标准编码的数据具有能容易被人和计算机解释的意义和结构。XML数据是平台和应用程序独立的。不用多说，这本身就使XML成为适合于互联网的一个理想的数据交换格式(事实上，它正是因这一用途而被开发的)。最近,宽带连接的增长及消费者对于越过任何媒体进行数据共享的应用软件的需求意味着，XML Web服务和应用软件正变得越来越丰富。\n\n　　XML的发明正是为了解决描述网上丰富的数据的组织问题；而目前为止，这一问题仅能够通过HTML的巧妙使用得到部分地解决。\n\n　　下面是一XML文档的实例：\n\n＜?xml version="1.0"?＞\n＜party＞\n　＜location＞My House＜/location＞\n　＜time＞7pm＜/time＞\n　＜guest＞\n　　＜name＞John Bloggs＜/name＞\n　　＜item＞Crate of Fosters＜/item＞\n　＜/guest＞\n　＜guest＞\n　　＜name＞Sara Bloggs＜/name＞\n　　＜item＞Umbrella＜/item＞\n　＜/guest＞\n　＜guest＞\n　　＜name＞David Fig＜/name＞\n　　＜item＞Bombay Mix＜/item＞\n　＜/guest＞\n＜/party＞ \n\n　　如果你以前没见过XML，那么你可以认为它看起来象HTML。HTML是一种SGML应用程序，而XML是它的一个子集。然而，其相似性还包括它们具有相似的标注分隔符。\n\n　　仅需看一下上面的XML片断，我们就能看到，该数据是描述一个具有一些客人的聚会；其中，每一个客人相应于一项。用于描述数据的标签名完全由作者来选择。所有XML标准要求：数据必须是一致的并且用于描述数据的标签为良构的。我们可以进一步用一种文档类型声明(DTD)或一个XML模式来强制数据的完整性。然而为简化起见，我们在本文中将仅使用普通的XML。\n\n　　二、 XML应用程序\n\n　　刚才，我们已经看到了如何使用XML来描述任何种类的数据。事实上，XML已经在今天的许多Web应用程序中得到广泛使用，下面是一些著名的应用描述：\n\n　　· XHTML-这是使用最广泛的XML应用程序之一。它类似基于HTML的SGML-用于描述数据在网页上的显示方式。XHTML使用一DTD来确保所有的文档遵循标准。XHTML的出现使Web程序员的开发稍微容易了一些；然而，一种完全兼容于CSS和XHTML标准的web浏览器尚未出现。\n\n　　· XML-RPC-远程过程调用(RPC)，应用于分布式应用程序中以调用远程计算机上的过程。XML-RPC使用XML对关于过程调用的信息进行编码，并且使用HTTP把它发送到接收计算机。然后，过程的返回值被再次用XML编码并用HTTP连接发送回调用者计算机。\n\n　　· RSS-真正简单的聚合/丰富的站点摘要，它是一种用来聚合web站点内容（例如新闻、文章、共享价格和链接等）的方法，它用一个特殊的应用程序(一个聚合器)定期更新用户PC上的RSS回馈。该RSS数据是使用XML进行编码和传输的。\n\n　　· AJAX-异步的JavaScript和XML，允许web开发者创建具有丰富特征的事件驱动的运行在web浏览器上的web应用程序。其中，JavaScript用于把XML编码的数据发送到服务器端脚本（或从服务器端接收XML编码的数据），并允许局部的实时的页面更新而不需要更新所有页面内容。\n\n　　上面仅仅是XML的可能的应用的一部分。在以后文章中，我们将分析如何在PHP中使用这些应用软件。\n\n　　三、 在PHP中使用XML\n\n　　自从PHP 5.0以来，PHP能与XML交互的可用选项显著地增加。而PHP版本4所能提供的是不稳定的而且是非w3c兼容的DOM XML扩展。\n下面，我将集中讨论PHP 5所提供给我们的三个允许我们与XML交互的方法：DOM，简单XML和XPath。在可能之处，我将建议最适合于每种方法的条件和数据。所有的示例代码将使用XML数据源来描述一个库及其中包含的书。\n\n＜xml version="1.0"?＞\n＜library＞\n　＜categories＞\n　　＜category cid="1"＞Web Development＜/category＞\n　　＜category cid="2"＞Database Programming＜/category＞\n　　＜category cid="3"＞PHP＜/category＞\n　　＜category cid="4"＞Java＜/category＞\n　＜/categories＞\n　＜books＞\n　＜book＞\n　　＜title＞Apache 2＜/title＞\n　　＜author＞Peter Wainwright＜/author＞\n　　＜publisher＞Wrox＜/publisher＞\n　　＜category＞1＜/category＞\n　＜/book＞\n　＜book＞\n　　＜title＞Advanced PHP Programming＜/title＞\n　　＜author＞George Schlossnagle＜/author＞\n　　＜publisher＞Developer Library＜/publisher＞\n　　＜category＞1＜/category＞\n　　＜category＞3＜/category＞\n　＜/book＞\n　＜book＞\n　　＜title＞Visual FoxPro 6 - Programmers Guide＜/title＞\n　　＜author＞Eric Stroo＜/author＞\n　　＜publisher＞Microsoft Press＜/publisher＞\n　　＜category＞2＜/category＞\n　＜/book＞\n　＜book＞\n　　＜title＞Mastering Java 2＜/title＞\n　　＜author＞John Zukowski＜/author＞\n　　＜publisher＞Sybex＜/publisher＞\n　　＜category＞4＜/category＞\n　＜/book＞\n＜/books＞\n＜/library＞ \n\n\n四、 DOM\n\n　　DOM PHP扩展名允许使用W3C DOM API在XML文档上进行操作。在PHP 5出现之前，这是PHP能存取XML文档的唯一方法。如果你在JavaScript中使用了DOM，那么会认识到这些对象模型几乎是一样的。\n\n　　由于DOM方法在遍历和操作XML文档时比较罗嗦，所以任何DOM兼容的代码都有明显的优点-与任何其它实现相同的W3C兼容的对象模型的API兼容。\n\n　　在下面的实例代码中，我们使用DOM来显示关于每本书的信息。首先，我们遍历一下列表目录，把它们的Id和相应的名字装载到一个索引数组中。然后，我们显示每本书的一个简短描述：\n\n　　PHP:\n\n＜?php\n　/*这里我们必须指定XML版本:也即是1.0 */\n　$xml = new DomDocument(''1.0'');\n　$xml-＞load(''xml/library.xml'');\n　/*首先，创建一个目录列表*/\n　$categories = array();\n　$XMLCategories = $xml-＞getElementsByTagName(''categories'')-＞item(0);\n　foreach($XMLCategories-＞getElementsByTagName(''category'') as $categoryNode) {\n　　/*注意我们是如何得到属性的*/\n　　$cid = $categoryNode-＞getAttribute(''cid'');\n　　$categories[$cid] = $categoryNode-＞firstChild-＞nodeValue;\n　}\n?＞\n＜html＞\n＜head＞\n＜title＞XML Library＜/title＞\n＜/head＞\n＜body＞\n＜?\n　php foreach($xml-＞getElementsBytagName(''book'') as $book):\n　/*查找标题*/\n　$title = $book-＞getElementsByTagName(''title'')-＞item(0)-＞firstChild-＞nodeValue;\n　/*查找作者-为了简化起见，我们假设仅仅有一个作者*/\n　$author = $book-＞getElementsByTagName(''author'')-＞item(0)-＞firstChild-＞nodeValue;\n　/* 列表目录*/\n　$bookCategories = $book-＞getElementsByTagName(''category'');\n　$catList = '''';\n　foreach($bookCategories as $category) {\n　　$catList .= $categories[$category-＞firstChild-＞nodeValue] . ''， '';\n　}\n　$catList = substr($catList， 0， -2); ?＞\n＜div＞\n＜h2＞＜?php echo($title) ?＞＜/h2＞\n＜p＞＜b＞Author:＜/b＞: ＜?php echo($author) ?＞＜/p＞\n＜p＞＜b＞Categories: ＜/b＞: ＜?php echo($catList) ?＞＜/p＞\n＜/div＞\n＜? php endforeach; ?＞\n＜/html＞ \n\n　　再提一下，修改XML是较麻烦的。例如，添加一个目录的代码如下：\n\n　　PHP:\n\nfunction addCategory(DOMDocument $xml， $catID， $catName) {\n　$catName = $xml-＞createTextNode($catName); //创建一个结点以存储文本\n　$category = $xml-＞createElement(''category''); //创建一个目录元素\n　$category-＞appendChild($catName); //把文本添加到目录元素上\n　$category-＞setAttribute(''cid''， $catID); //设置目录的ID\n　$XMLCategories = $xml-＞getElementsByTagName(''categories'')-＞item(0);\n　$XMLCategories-＞appendChild($category); //添加新目录\n} \n\n　　五、 保存XML\n\n　　你可以使用save()和saveXML()方法之一来把DOM描述转换回XML字符串描述。save()方法用一指定的命名把XML保存到一个文件中，而saveXML()从文档的部分或整体中返回一个字符串。\n\n$xml-＞save(''xml/library.xml'');\n//保存全部文件\n$categories=$xml-＞saveXML($XMLCategories);\n//返回一个包含种类的字符串 \n\n　　为了说明把DOM兼容的代码移植到另外的语言是如何容易，下面是用JavaScript形式实现的与以上功能相同的代码：\n\nJavascript:\nfunction doXML(){\n　/* 首先创建一个种类列表*/\n　var categories = Array();\n　var XMLCategories = xml.getElementsByTagName(''categories'')[0];\n　var theCategories = XMLCategories.getElementsByTagName(''category'');\n　for (var i = 0; i ＜ theCategories.length; i++) {\n　　/* 注意我们是怎样得到属性的*/\n　　var cid = theCategories[i].getAttribute(''cid'');\n　　categories[cid] = theCategories[i].firstChild.nodeValue;\n　}\n　var theBooks = xml.getElementsByTagName(''book'');\n　for(var i = 0; i ＜ theBooks.length; i++) {\n　　var book = theBooks[i];\n　　/* 查找标题*/\n　　var title = book.getElementsByTagName(''title'')[0].firstChild.nodeValue;\n　　/* 查找作者-为简单起见，我们假定仅有一个作者*/\n　　var author = book.getElementsByTagName(''author'')[0].firstChild.nodeValue;\n　　/* 列出种类*/\n　　var bookCategories = book.getElementsByTagName(''category'');\n　　var catList = '''';\n　　for(var j = 0; j ＜ bookCategories.length; j++) {\n　　　catList += categories[bookCategories[j].firstChild.nodeValue] + ''， '';\n　　}\n　　catList = catList.substring(0， catList.length -2);\n　　document.open();\n　　document.write("＜h2＞" + title + "＜/h2＞");\n　　document.write("＜p＞＜b＞Author:＜/b＞: " + author + "＜/p＞");\n　　document.write("＜p＞＜b＞Categories: ＜/b＞: " + catList + "＜/p＞");\n　}\n　document.close();\n} \n\n　　六、 简单XML\n\n　　简单XML确实简单。它允许使用对象和数组存取方法来存取一个XML文档及其元素和属性。操作方式很简单：\n\n　　· 元素（Element）-这些被描述为SimpleXMLElement对象的单个属性。当有多个作为文档或元素的子元素存在时，每个元素能被使用数组索引标志加以存取。\n\n$xml-＞books;//返回元素"books"\n$xml-＞books-＞book[0];//返回在books元素中的第一本书 \n\n　　· 属性（Attribute）-元素的属性是通过关联数组标志来存取和设置的，此时每一个索引对应于一个属性名。\n\n$category[''cid''];//返回cid属性的值 \n\n　　· 元素数据（Element Data）-为了检索包含在一个元素内的文本数据，必须使用(string)显式地把它被转换为一个字符串或使用print或echo输出它。如果一个元素包含多个文本结点，那么它们将按被找到的顺序连接起来。\n\necho ($xml-＞books-＞book[0]-＞title);//显示第一本书的标题 \n\n　　下面是使用简单XML进行转换的原来的实例。为了装载XML文件，我们使用simplexml_load_file()函数，由它来分析该XML文件并且把它装载进一个SimpleXMLElement对象中：\n\n　　PHP:\n\n＜?php\n$xml = simplexml_load_file(''xml/library.xml'');\n/* 把一个列表的目录装载到一个数组中*/\n$categories = array();\nforeach($xml-＞categories-＞category as $category) {\n　$categories[(string) $category[''cid'']] = (string) $category;\n}\n?＞\n＜html＞\n＜head＞\n＜title＞XML Library＜/title＞\n＜/head＞\n＜body＞\n＜?php foreach($xml-＞books-＞book as $book):\n/* 列举目录*/\n$catList = '''';\nforeach($book-＞category as $category) {\n　$catList .= $categories[((string) $category)] . ''， '';\n}\n$catList = substr($catList， 0， -2); ?＞\n＜div＞\n＜h2＞＜?php echo($book-＞title) ?＞＜/h2＞\n＜p＞＜b＞Author:＜/b＞: ＜?php echo($book-＞author) ?＞＜/p＞\n＜p＞＜b＞Categories: ＜/b＞: ＜? php echo($catList) ?＞＜/p＞\n＜/div＞\n＜? php endforeach; ?＞\n＜/html＞ \n\n七、 修改XML\n\n　　尽管文本数据和属性值可以通过使用简单XML加以设置，但是不能新建这些对象。然而，SimpleXM的确提供了一种方法来实现DomElement对象和DomElement对象之间的转换。为此，我修改了addCategory()函数来说明如何使用simplexml_import_dom()函数以添加目录和把该文档转换回简单的XML格式：\n\n　　PHP:\n\nfunction addCategory(SimpleXMLElement &$sXML， $catID， $catName) {\n　$xml = new DOMDocument;\n　$xml-＞loadXML($sXML-＞asXML());\n　$catName = $xml-＞createTextNode($catName); //创建一个结点来存放该文本\n　$category = $xml-＞createElement(''category''); //创建一个目录元素\n　$category-＞appendChild($catName); //把文本添加到目录元素\n　$category-＞setAttribute(''cid''， $catID); //设置目录id\n　$XMLCategories = $xml-＞getElementsByTagName(''categories'')-＞item(0);\n　$XMLCategories-＞appendChild($category); //添加新目录\n　$sXML = simplexml_import_dom($xml);\n　return $sXML;\n} \n\n　　同样，SimpleXMLElement对象的asXML()函数可以用来检索XML字符串并把它保存回一个文件中。\n\n　　八、 xPath\n\n　　毫无疑问，Xpath是"XML蛋糕之上的樱桃"。XPath允许你使用象SQL一样的查询来查找一个XML文档中的特定信息。DOM和SimpleXML都有内置的对XPath的支持，如SQL，可以被用来提取你想从一XML文档中提取的任何内容。\n\n　　· //category-查找所有的在文档中出现的任何category。\n\n　　· /library/books-查找所有作为library的孩子出现的books\n\n　　· /library/categories/category[@cid]-查找所有作为library/categories的孩子出现且属性为cid的category。\n\n　　· /library/categories/category[@att=''2'']-查找所有作为library/categories的孩子且具有属性cid的值为2出现的category。\n\n　　· /library/books/book[title=''Apache 2'']-查找所有作为/library/books的孩子且其标题元素有一个值为Apache 2出现的book。\n\n　　其实，这仅是xPath冰山之一角。你可以使用xPath来创建大量复杂的查询以便从你的文档中提取几乎任何信息。我再次修改了示例代码来向你展示使用xPath是多么轻松愉快的事情。\n\n　　PHP:\n\n＜?php\n$xml = simplexml_load_file(''xml/library.xml'');\n?＞\n＜html＞\n＜head＞\n＜title＞XML Library＜/title＞\n＜/head＞\n＜body＞\n＜?php foreach(((array)$xml-＞xpath("/library/books/book")) as $book):\n/*列表目录*/\n$catList = '''';\nforeach($book-＞category as $category) {\n　/*得到具有这个ID的目录*/\n　$category = $xml-＞xpath("/library/categories/category[@cid=''$category'']");\n　$catList .= (string) $category[0] . ''， '';\n}\n$catList = substr($catList， 0， -2); ?＞\n＜div＞\n＜h2＞＜?php echo($book-＞title) ?＞＜/h2＞\n＜p＞＜b＞Author:＜/b＞: ＜?php echo($book-＞author) ?＞＜/p＞\n＜p＞＜b＞Categories: ＜/b＞: ＜?php echo($catList) ?＞＜/p＞\n＜/div＞\n＜?php endforeach; ?＞\n＜/html＞ \n\n　　九、 DOM和XPath\n\n　　在DOM中计算XPath查询需要创建一个DOMXPath对象，下面的evaluate()函数返回一个DOMElement数组。\n\n$xPath = new DOMXPath($xml);\n$xPath-＞evaluate("/library/books/book[title=''Apache 2'']"); \n\n　　十、 结论\n\n　　现在，我们学习了如何使用了PHP提供给我们的工具来与XML交互。至此，我们已经被"武装起来"并准备好深入钻研XML应用程序了。在下一篇文章中，我们将讨论AJAX及其如何应用于象Google这样的站点开发的。\n', '2011-07-07 09:00:00', 0, 1),
(14, 3, '在PHP5中使用DOM控制XML\r\n', 'admin', 'PHP5中增强了XML的支持，使用DOM扩展了XML操作的能耐。这些函数作为 PHP5 核心的一部分，无需被安装即可使用。\r\n\r\n', '<p>\n    <span class="t18">&nbsp;&nbsp;</span>\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    PHP5中增强了<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">XML</span></strong></span></a>的支持，使用<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">DOM</span></strong></span></a>扩展了XML操作的能耐。这些<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">函数</span></strong></span></a>作为 PHP5 核心的一部分，无需被<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">安装</span></strong></span></a>即可使用。\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    下面的例子简单的演示了DOM对XML的操作，详细解释请看<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">代码</span></strong></span></a>中的注释\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    &lt;?<br />\n    /************************************************<br />\n    **&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use XML in PHP5<br />\n    ** reference site:<br />\n    **<span class="Apple-converted-space">&nbsp;</span><a style="color:#333333; font-size:12px; text-decoration:none" href="http://cn.php.net/manual/zh/ref.dom.php">http://cn.php.net/manual/zh/ref.dom.php</a><br />\n    ** the follow codes need PHP5 support<br />\n    **<span class="Apple-converted-space">&nbsp;</span><a style="color:#333333; font-size:12px; text-decoration:none" href="http://www.knowsky.com/">www.knowsky.com</a><br />\n    *************************************************/\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    <br />\n    //首先要创建一个DOMDocument对象<br />\n    $dom = new DomDocument();<br />\n    //然后载入XML文件<br />\n    $dom -&gt; load(&quot;test.xml&quot;);\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //输出XML文件<br />\n    //header(&quot;Content-type: text/xml;charset=gb2312&quot;);<br />\n    //echo $dom -&gt; saveXML();\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //保存XML文件，返回值为int（文件大小，以字节为单位）<br />\n    //$dom -&gt; save(&quot;newfile.xml&quot;);\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    echo &quot;&lt;hr/&gt;取得所有的title元素:&lt;hr/&gt;&quot;;<br />\n    $titles = $dom -&gt; getElementsByTagName(&quot;title&quot;);<br />\n    foreach ($titles as $node){<br />\n    &nbsp;&nbsp;echo $node -&gt; textContent . &quot;&lt;br/&gt;&quot;;<br />\n    &nbsp;&nbsp;//这样也可以<br />\n    &nbsp;&nbsp;//echo $node-&gt;firstChild-&gt;data . &quot;&lt;br/&gt;&quot;;<br />\n    }\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    /*<br />\n    echo &quot;&lt;hr/&gt;从根结点遍历所有结点：&lt;br/&gt;&quot;;<br />\n    foreach ($dom-&gt;documentElement-&gt;childNodes as $items) {<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;//如果节点是一个元素(nodeType == 1)并且名字是item就继续循环<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;if ($items-&gt;nodeType == 1 &amp;&amp; $items-&gt;nodeName == &quot;item&quot;) {<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;foreach ($items-&gt;childNodes as $titles) {<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果节点是一个元素，并且名字是title就打印它.<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($titles-&gt;nodeType == 1 &amp;&amp; $titles-&gt;nodeName == &quot;title&quot;) {<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $titles-&gt;textContent . &quot;\\n&quot;;<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;&nbsp;&nbsp;}<span class="Apple-converted-space">&nbsp;</span><br />\n    &nbsp;&nbsp;}<span class="Apple-converted-space">&nbsp;</span><br />\n    }<span class="Apple-converted-space">&nbsp;</span><br />\n    */\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //使用XPath查询数据<br />\n    echo &quot;&lt;hr/&gt;使用XPath查询的title节点结果:&lt;hr/&gt;&quot;;<br />\n    $xpath = new domxpath($dom);<br />\n    $titles = $xpath-&gt;query(&quot;/rss/channel/item/title&quot;);<br />\n    foreach ($titles as $node){<br />\n    &nbsp;&nbsp;echo $node-&gt;textContent.&quot;&lt;br/&gt;&quot;;<br />\n    }<br />\n    /*<br />\n    这样和使用getElementsByTagName()<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">方法</span></strong></span></a>差不多，但是Xpath要强大的多<br />\n    深入一点可能是这样：<br />\n    /rss/channel/item[position() = 1]/title 返回第一个item元素的所有<span class="Apple-converted-space">&nbsp;</span><br />\n    /rss/channel/item/title[@id = &#39;23&#39;] 返回所有含有id属性并且值为23的title<span class="Apple-converted-space">&nbsp;</span><br />\n    /rss/channel/&amp;folder&amp;/title 返回所有articles元素下面的title(译者注：&amp;folder&amp;代表目录深度)<br />\n    */\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    <br />\n    //向DOM中写入新数据<br />\n    $item = $dom-&gt;createElement(&quot;item&quot;);<br />\n    $title = $dom-&gt;createElement(&quot;title&quot;);<br />\n    $titleText = $dom-&gt;createTextNode(&quot;title text&quot;);<br />\n    $title-&gt;appendChild($titleText);<br />\n    $item-&gt;appendChild($title);<br />\n    $dom-&gt;documentElement-&gt;getElementsByTagName(&#39;channel&#39;)-&gt;item(0)-&gt;appendChild($item);\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //从DOM中删除节点<br />\n    //$dom-&gt;documentElement-&gt;RemoveChild($dom-&gt;documentElement-&gt;getElementsByTagName(&quot;channel&quot;)-&gt;item(0));<br />\n    //或者使用xpath查询出节点再删除<br />\n    //$dom-&gt;documentElement-&gt;RemoveChild($xpath-&gt;query(&quot;/rss/channel&quot;)-&gt;item(0));<br />\n    //$dom-&gt;save(&quot;newfile.xml&quot;);\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //从DOM中修改节点数据<br />\n    //修改第一个title的文件<br />\n    //这个地方比较笨，新创建一个节点，然后替换旧的节点。如果哪位朋友有其他好的方法请一定要告诉我<br />\n    $firstTitle = $xpath-&gt;query(&quot;/rss/channel/item/title&quot;)-&gt;item(0);<br />\n    $newTitle = $dom-&gt;createElement(&quot;title&quot;);<br />\n    $newTitle-&gt;appendChild(new DOMText(&quot;This&#39;s the new title text!!!&quot;));<br />\n    $firstTitle-&gt;parentNode-&gt;replaceChild($newTitle, $firstTitle);<br />\n    //修改属性<br />\n    //$firstTitle = $xpath-&gt;query(&quot;/rss/channel/item/title&quot;)-&gt;item(0);<br />\n    //$firstTitle-&gt;setAttribute(&quot;orderby&quot;, &quot;4&quot;);<br />\n    $dom-&gt;save(&quot;newfile.xml&quot;);\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    echo &quot;&lt;hr/&gt;&lt;a href=\\&quot;newfile.xml\\&quot;&gt;查看newfile.xml&lt;/a&gt;&quot;;\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    //下面的代码获得并解析<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">php</span></strong></span></a>.net的首页，将返第一个title元素的内容。<br />\n    /*<br />\n    $dom-&gt;loadHTMLFile(&quot;<a style="color:#333333; font-size:12px; text-decoration:none" href="http://www.php.net/">http://www.php.net/</a>&quot;);<span class="Apple-converted-space">&nbsp;</span><br />\n    $title = $dom-&gt;getElementsByTagName(&quot;title&quot;);<span class="Apple-converted-space">&nbsp;</span><br />\n    print $title-&gt;item(0)-&gt;textContent;<br />\n    */<br />\n    ?&gt;\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    下面是test.xml文件代码：\n</p>\n<p style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; font-size:15px; padding-top:0px">\n    &lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;<br />\n    &lt;rss version=&quot;2.0&quot;&gt;<br />\n    &lt;channel&gt;<br />\n    &lt;title&gt;javascript&lt;/title&gt;<br />\n    &lt;link&gt;http://blog.csdn.net/zhongmao/category/29515.aspx&lt;/link&gt;<br />\n    &lt;description&gt;javascript&lt;/description&gt;<br />\n    &lt;language&gt;zh-chs&lt;/language&gt;<br />\n    &lt;generator&gt;.text version 0.958.2004.2001&lt;/generator&gt;<br />\n    &lt;item&gt;<br />\n    &lt;creator&gt;zhongmao&lt;/creator&gt;<br />\n    &lt;title orderby=&quot;1&quot;&gt;out put excel used javascript&lt;/title&gt;<br />\n    &lt;link&gt;http://blog.csdn.net/zhongmao/archive/2004/09/15/105385.aspx&lt;/link&gt;<br />\n    &lt;pubdate&gt;wed, 15 sep 2004 13:32:00 gmt&lt;/pubdate&gt;<br />\n    &lt;guid&gt;http://blog.csdn.net/zhongmao/archive/2004/09/15/105385.aspx&lt;/guid&gt;<br />\n    &lt;comment&gt;http://blog.csdn.net/zhongmao/comments/105385.aspx&lt;/comment&gt;<br />\n    &lt;comments&gt;http://blog.csdn.net/zhongmao/archive/2004/09/15/105385.aspx#feedback&lt;/comments&gt;<br />\n    &lt;comments&gt;2&lt;/comments&gt;<br />\n    &lt;commentrss&gt;http://blog.csdn.net/zhongmao/comments/commentrss/105385.aspx&lt;/commentrss&gt;<br />\n    &lt;ping&gt;http://blog.csdn.net/zhongmao/services/trackbacks/105385.aspx&lt;/ping&gt;<br />\n    &lt;description&gt;test description&lt;/description&gt;<br />\n    &lt;/item&gt;<br />\n    &lt;item&gt;<br />\n    &lt;creator&gt;zhongmao&lt;/creator&gt;<br />\n    &lt;title orderby=&quot;2&quot;&gt;out put word used javascript&lt;/title&gt;<br />\n    &lt;link&gt;http://blog.csdn.net/zhongmao/archive/2004/08/06/67161.aspx&lt;/link&gt;<br />\n    &lt;pubdate&gt;fri, 06 aug 2004 16:33:00 gmt&lt;/pubdate&gt;<br />\n    &lt;guid&gt;http://blog.csdn.net/zhongmao/archive/2004/08/06/67161.aspx&lt;/guid&gt;<br />\n    &lt;comment&gt;http://blog.csdn.net/zhongmao/comments/67161.aspx&lt;/comment&gt;<br />\n    &lt;comments&gt;http://blog.csdn.net/zhongmao/archive/2004/08/06/67161.aspx#feedback&lt;/comments&gt;<br />\n    &lt;comments&gt;0&lt;/comments&gt;<br />\n    &lt;commentrss&gt;http://blog.csdn.net/zhongmao/comments/commentrss/67161.aspx&lt;/commentrss&gt;<br />\n    &lt;ping&gt;http://blog.csdn.net/zhongmao/services/trackbacks/67161.aspx&lt;/ping&gt;<br />\n    &lt;description&gt;test word description&lt;/description&gt;<br />\n    &lt;/item&gt;<br />\n    &lt;item&gt;<br />\n    &lt;creator&gt;zhongmao&lt;/creator&gt;<br />\n    &lt;title orderby=&quot;3&quot;&gt;xmlhttp&lt;/title&gt;<br />\n    &lt;link&gt;http://blog.csdn.net/zhongmao/archive/2004/08/02/58417.aspx&lt;/link&gt;<br />\n    &lt;pubdate&gt;mon, 02 aug 2004 10:11:00 gmt&lt;/pubdate&gt;<br />\n    &lt;guid&gt;http://blog.csdn.net/zhongmao/archive/2004/08/02/58417.aspx&lt;/guid&gt;<br />\n    &lt;comment&gt;http://blog.csdn.net/zhongmao/comments/58417.aspx&lt;/comment&gt;<br />\n    &lt;comments&gt;http://blog.csdn.net/zhongmao/archive/2004/08/02/58417.aspx#feedback&lt;/comments&gt;<br />\n    &lt;comments&gt;0&lt;/comments&gt;<br />\n    &lt;commentrss&gt;http://blog.csdn.net/zhongmao/comments/commentrss/58417.aspx&lt;/commentrss&gt;<br />\n    &lt;ping&gt;http://blog.csdn.net/zhongmao/services/trackbacks/58417.aspx&lt;/ping&gt;<br />\n    &lt;description&gt;xmlhttpaaa asd bb cc dd&lt;/description&gt;<br />\n    &lt;/item&gt;<br />\n    &lt;/channel&gt;<br />\n    &lt;/rss&gt;\n</p>\n<p>\n    &nbsp;\n</p>', '2011-06-01 08:00:00', 0, 1);
INSERT INTO `news` (`newsId`, `parentId`, `title`, `author`, `desc`, `content`, `addtime`, `views`, `recommend`) VALUES
(15, 3, '用于MySQL的PHP XML类\r\n', 'admin', '摘要：本文中作者通过自己创建一个处理连接MySQL和使用PHP中的domxml功能来提供XML输出的类。这样就可以可以在PHP脚本的任何地方声明这个类并且在需要使用它的时候可以提供XML功能。\r\n\r\n', '<div id="article_body">\n    <div id="article" class="middle_font">\n        <p>\n            <span class="fa">摘要：</span>本文中作者通过自己创建一个处理连接<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">MySQL</span></strong></span></a>和使用<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">PHP</span></strong></span></a>中的domxml功能来提供<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">XML</span></strong></span></a>输出的类。这样就可以可以在PHP脚本的任何地方声明这个类并且在需要使用它的时候可以提供XML功能。\n        </p>\n        <p>\n            我假设人们使用PHP是原因是他的标价：免费。MySQL为需要向系统中增加<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">数据库</span></strong></span></a>功能的开发人员提供一个免费的数据库解决方案。这些解决方案的缺点是在设置和管理的时候有些复杂。\n        </p>\n        <p>\n            我在这篇文章中使用的PHP版本是PHP 4.3.4 for Win32，可以从The PHP Group下载。MySQL的版本是MySQL 4.0.16 for Win32，可以从MySQL.com得到。MySQL的<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">安装</span></strong></span></a>很容易——只要简单地按照其指令来就可以了。PHP稍微有一点复杂。\n        </p>\n        <p>\n            在PHP的下载页面有两个文件：一个ZIP文件和一个安装文件。因为我们需要添加ZIP文件中的扩展，所以这两个文件都要下载。下面是下载之后的所要做的一个简单步骤：\n        </p>\n        <p>\n            1. 使用安装文件安装PHP；\n        </p>\n        <p>\n            2. 解压iconv.dll，将其放到<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">Windows</span></strong></span></a>的系统文件夹中；\n        </p>\n        <p>\n            3. PHP安装目录下创建一个目录（默认为C:\\PHP）“extensions”；\n        </p>\n        <p>\n            4. 解压PHP_domxml.dll文件到这个目录；\n        </p>\n        <p>\n            5.&nbsp;&nbsp;在Windows文件夹下找到PHP.ini文件，然后使用记事本或其它文本编辑器打开。在这个文件中找到“extensions_dir=”，然后将其值修改为第3步设置的扩展文件夹的完整路径；\n        </p>\n        <p>\n            6. 找到“;extension=PHP_domxml.dll”，删除本行开头的分号；\n        </p>\n        <p>\n            7. 重新启动Web服务器。\n        </p>\n        <p>\n            然后在你的Web目录下使用下面的<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">代码</span></strong></span></a>创建一个PHP页面“test.PHP”。（这段代码在运行IIS 5.0的Windows 2000 SP3能够正常运行。）\n        </p>\n        <div align="left">\n            <pre>\n                run_sql_return_xml("SELECT * FROM users");\nclassCMySQLXML {\n    var $host;\n    var $user;\n    var $password;\n    var $db;\n    functionCMySQLXML($host, $user, $password, $db) {\n        $this-&gt;host = $host;\n        $this-&gt;user = $user;\n        $this-&gt;password = $password;\n        $this-&gt;db = $db;\n    }\n      functionrun_sql_return_xml($sql_string) {\n        $connection = MySQL_connect($this-&gt;host, $this-&gt;user, $this-&gt;password,\n$this-&gt;db);\n        MySQL_select_db($this-&gt;db);\n        $result = MySQL_query($sql_string);\n        $doc = domxml_open_mem("\n                <root>\n                    &quot;);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ($row = mysql_fetch_array($result, MySQL_ASSOC)) {\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_fields = MySQL_num_fields($result);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row_element = $doc-&gt;create_element(MySQL_field_table($result, 0));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$doc_root = $doc-&gt;document_element();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$row_element = $doc_root-&gt;append_child($row_element);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i = 0; $i &lt; $num_fields; $i++) {\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$field_name = MySQL_field_name($result, $i);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$col_element = $doc-&gt;create_element($field_name);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$col_element = $row_element-&gt;append_child($col_element);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$text_node = $doc-&gt;create_text_node($row[$field_name]);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$col_element-&gt;append_child($text_node);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MySQL_free_result($result);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MySQL_close($connection);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $doc-&gt;dump_mem(false);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;}\n                </root>\n            </pre>\n        </div>\n        <p>\n            这个例子要求你在MySQL上有一个数据库“test”，其中有一个表“users”。而且，你还需要为访问测试数据库上的数据创建一个用户。创建数据库、表等的步骤可以查看MySQL的文档。\n        </p>\n        <p>\n            如果你分析一下代码，你就会明白我创建了一个叫做CMySqlXML的类。CMySqlXML构造<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">函数</span></strong></span></a>接受四个参数：MySQL的主机名，一个合法的用户名，一个密码和一个数据库名字。构造函数使用这四个参数设置类的host、user、password和db成员变量。\n        </p>\n        <p>\n            该类提供的唯一的一个<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">方法</span></strong></span></a>是run_sql_return_xml()。它接受一个SQL查询字符串参数。当这个方法执行的时候，它创建一个到 MySQL数据库的连接并选择数据库。查询字符串被执行，结果存储到变量$result中。使用domxml_open_mem()函数创建一个新的 DOMDocument对象。然后，代码开始循环结果集中的所有记录。对于每一条记录，添加一个与结果集的表同名的行元素到DOMDocument文档元素中。然后为每个字段添加一个元素到行元素中，元素名为字段名。最后，一个文本节点被添加到每个字段节点，节点的值为该字段的值。\n        </p>\n        <p>\n            在循环所有行之后，代码释放结果集并关闭连接。产生的DOMDocument XML从函数中返回。\n        </p>\n        <p>\n            在PHP页面的开始处你会看到CMySQLXML对象被实例化，run_sql_return_xml()方法被调用。这个方法的返回值被返回给客户。domxml功能除了PHP函数命名约定之外都遵守DOM规范。\n        </p>\n        <p>\n            如果需要更多有关DOM规范的信息，可以访问W3C的站点。而更多domxml的信息则可以从The PHP Group找到，在这里你可以下载不同格式的文档。\n        </p>\n    </div>\n</div>\n<p>\n    &nbsp;\n</p>', '2011-06-05 09:00:00', 0, 1),
(16, 3, 'XML数据库 BaseX 6.0 版本正式发布\r\n', 'admin', 'BaseX 是一个XML数据库，用来存储紧缩的XML数据，提供了高效的 XPath 和 XQuery 的实现，还包括一个前端操作界面。\r\n\r\n', '<div id="article_body">\n    <div id="article" class="middle_font">\n        <p>\n            <a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">BaseX</span></strong></span></a>是一个<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">XML</span></strong></span></a><a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">数据</span></strong></span></a>库</strong></span></a>，用来存储紧缩的XML数据，提供了高效的 XPath 和 XQuery 的实现，还包括一个前端操作界面。\n        </p>\n        <p>\n            该版本实现了完整的 XQuery Update 规范、100%达到 W3C 的测试要求。引入一个增强的客户端<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">服务器</span></strong></span></a>的体系<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">架构</span></strong></span></a>，基于 ACID 安全事务、<a href="javascript:;" target="_self"><span style="text-decoration:underline"><strong><span style="color:#617b85">用户</span></strong></span></a>和密码管理、事务日志等。扩展了 XQuery 的全文特性、支持 TF/IDF 排名、停止词列表和模糊查询。使用固定内存来提升了索引创建过程，改进了索引的结构和迭代查询处理。\n        </p>\n        <p>\n            下载地址：<a href="http://www.inf.uni-konstanz.de/dbis/basex/download.php" target="_blank"><span style="color:#617b85">http://www.inf.uni-konstanz.de/dbis/basex/download.php</span></a>\n        </p>\n    </div>\n</div>\n<p>\n    &nbsp;\n</p>', '2011-05-07 08:00:00', 0, 1),
(17, 3, 'XML联合发明人布雷加盟Google Android开发团队\r\n', 'admin', '北京时间3月16日消息，据国外媒体报道，XML(可扩展标记语言)联合发明人蒂姆布雷(Tim Bray)发表博客文章称，他已经从甲骨文离职，当地时间周一正式加盟Google Android开发团队。\r\n\r\n', '北京时间3月16日消息，据国外媒体报道，XML(可扩展标记语言)联合发明人蒂姆布雷(Tim Bray)发表博客文章称，他已经从甲骨文离职，当地时间周一正式加盟Google Android开发团队。\n\n布雷表示，我拒绝了甲骨文的挽留。布雷曾任Sun的 Web技术主管。甲骨文是XML的支持者，其新一代Fusion中间件的各个组件利用XML共享信息。\n\n布雷披露了跳槽到Google的几个原因，其中大部分都与Android有关。布雷表示，开放源代码、API(应用编程接口)、与苹果 iPhone的竞争是他喜欢Android的原因，苹果的梦想是主宰移动互联网，应用开发者要看其脸色行事。\n\n甲骨文1月份完成了收购Sun的交易。\n\n', '2011-04-07 11:00:00', 0, 1),
(18, 4, '10 款基于 jQuery 的切换效果插件推荐\r\n', 'admin', '本文整理了 10 款非常好用的jQuery切换效果插件，包括平滑切换和重叠动画等，这些插件可以实现不同元素之间的动态切换。1. InnerFade这是一个基于jQuery的小插件，可以实现页面内的元素淡入淡出效果。源码/演...', '<p>\n    <span class="top11">&nbsp;&nbsp;</span>\n</p>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    本文整理了 10 款非常好用的jQuery切换效果插件，包括平滑切换和重叠动画等，这些插件可以实现不同元素之间的动态切换。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">1. InnerFade</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    这是一个基于jQuery的小插件，可以实现页面内的元素淡入淡出效果。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102929227.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://medienfreunde.com/lab/innerfade/" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">2. HighlightFade</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    该插件可以实现高亮、缩放等效果。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102929889.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://jquery.offput.ca/highlightFade/old.php" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">3. Dynamic Page / Replacing Content</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    使用按钮实现网页内容的动态切换。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102930211.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://css-tricks.com/6336-dynamic-page-replacing-content/" target="_blank">源码</a>&nbsp;/&nbsp;<a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://css-tricks.com/examples/DynamicPage/" target="_blank">演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">4. jqFancyTransitions</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    这是一个易于使用的插件，有多种切换效果来显示图片。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102930715.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://workshop.rs/projects/jqfancytransitions/" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">5. jQuery Cycle Plugin——浏览器效果</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    该插件应用于缩略图，是jQuery效果的扩展，截图展示了一部分效果。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102930395.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://www.malsup.com/jquery/cycle/browser.html" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">6. Image Cross Fade Transition</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    通过该插件使一张或多张图片产生渐隐/渐显的切换效果。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102930325.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://jqueryfordesigners.com/image-cross-fade-transition/" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">7. Creating a fading header</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    这是一个简单的插件，用jQuery 和 CSS 来创建出网页头部淡入淡出的效果，令网页内容更加生动。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102930524.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://www.swedishfika.com/2008/03/04/creating-a-fading-header/" target="_blank">源码</a>&nbsp;/&nbsp;<a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://bitsamppixels.com/fading-header/example1.html" target="_blank">演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">8. jQuery Cycle Plugin</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    该插件支持许多不同的切换效果，比如鼠标悬停暂停、自动停止、自动调整、开始和结束事件调用、点击触发等等。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102931912.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://www.malsup.com/jquery/cycle/" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">9. Flip</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    这个插件能让你用jQuery做到要用Flash才能实现的效果。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102931566.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://lab.smashup.it/flip/" target="_blank">源码/演示</a>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <strong style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px">10. 高级slider——jQuery XML slider</strong>&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    该插件能让你轻松地使用XML创建功能强大的滑块，也更容易设置和维护，还可以用HTML来进行设置。&nbsp;<br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    &nbsp;\n</p>\n<div style="text-align:center; padding-bottom:0px; line-height:24px; margin:0px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <img style="padding-bottom:0px; border-right-width:0px; margin:0px; padding-left:0px; padding-right:0px; max-width:600px; border-top-width:0px; border-bottom-width:0px; border-left-width:0px; padding-top:0px; border-image:initial" alt="\\" src="http://www.php100.com/uploadfile/2011/1216/20111216102931672.jpg" />\n</div>\n<p style="text-align:left; padding-bottom:0px; line-height:24px; text-indent:2em; margin:5px 0px 10px; padding-left:0px; padding-right:0px; font-family:verdana, simsun, sans-serif; white-space:normal; font-size:14px; padding-top:0px">\n    <br style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px" />\n    <a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://codecanyon.net/item/advanced-slider-jquery-xml-slider/132618?ref=bqworks" target="_blank">源码</a>&nbsp;/&nbsp;<a style="padding-bottom:0px; margin:0px; padding-left:0px; outline-width:0px; padding-right:0px; color:#3e62a6; padding-top:0px" href="http://codecanyon.net/item/advanced-slider-jquery-xml-slider/full_screen_preview/132618" target="_blank">演示</a>\n</p>\n<p>\n    &nbsp;\n</p>', '2011-04-08 04:00:00', 0, 1),
(19, 5, '数据库的模式\r\n', 'admin', '　学数据库这么久，这些概念还是很模糊，今天再提出来，希望不要忘记了　　三级模式结构：外模式、模式和内模式　　一、模式(Schema)　　定义：也称逻辑模式，是数据库中全体数据的逻辑结构和特征的描述，是所...', '学数据库这么久，这些概念还是很模糊，今天再提出来，希望不要忘记了\n\n　　三级模式结构：外模式、模式和内模式\n\n　　一、模式(Schema)\n\n　　定义：也称逻辑模式，是数据库中全体数据的逻辑结构和特征的描述，是所有用户的公共数据视图。\n\n　　理解：\n\n　　① 一个数据库只有一个模式;\n\n　　② 是数据库数据在逻辑级上的视图;\n\n　　③ 数据库模式以某一种数据模型为基础;\n\n　　④ 定义模式时不仅要定义数据的逻辑结构(如数据记录由哪些数据项构成，数据项的名字、类型、取值范围等)，而且要定义与数据有关的安全性、完整性要求，定义这些数据之间的联系。\n\n　　二、外模式(External Schema)\n\n　　定义：也称子模式(Subschema)或用户模式，是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述，是数据库用户的数据视图，是与某一应用有关的数据的逻辑表示。\n\n　　理解：\n\n　　① 一个数据库可以有多个外模式;\n\n　　② 外模式就是用户视图;\n\n　　③ 外模式是保证数据安全性的一个有力措施。\n\n　　三、内模式(Internal Schema)\n\n　　定义：也称存储模式(Storage Schema)，它是数据物理结构和存储方式的描述，是数据在数据库内部的表示方式(例如，记录的存储方式是顺序存储、按照B树结构存储还是按hash方法存储;索引按照什么方式组织;数据是否压缩存储，是否加密;数据的存储记录结构有何规定)。\n\n　　理解：\n\n　　① 一个数据库只有一个内模式;\n\n　　② 一个表可能由多个文件组成，如：数据文件、索引文件。\n\n　　它是数据库管理系统(DBMS)对数据库中数据进行有效组织和管理的方法\n\n　　其目的有：\n\n　　① 为了减少数据冗余，实现数据共享;\n\n　　② 为了提高存取效率，改善性能。\n\n　　1.概念模式(Conceptual Schema)\n\n　　概念模式是数据库系统中全局数据逻辑结构的描述，是全体用户(应用)公共数据视图，此种描述是一种抽象的描述，它不涉及具体的硬件环境与平台，也与具体的软件环境无关。\n\n　　概念模式主要描述数据的概念记录类型及数据以及它们间的关系，它还包括一些数据间的语义约束，对它的描述可用DBMS中的DDL语言定义。\n\n　　2.外模式(External Schema)\n\n　　外模式也称子模式(Subschema)或称用户模式(User’s schema)它是用户的数据视图，亦即是用户所见到的模式的一个部分，它由概念模式推导而出，概念模式给出了系统全局的数据描述而外模式则给出每个用户的局部描述。一个概念模式可以有若干个外模式，每个用户只关心与它有关的模式，这样可以屏蔽大量无关信息且有利于数据保护，因此对用户极为有利。在一般的DBMS中都提供有相关的外模式描述语言(外模式DDL)。\n\n　　3.内模式(Internal Schema)\n\n　　内模式又称物理模式(Physical Schema)，它给出了数据库物理存储结构与物理存取方法，如数据存储的文件结构、索引、集簇及hash等存取方式与存取路径，内模式的物理性主要体现在操作系统及文件级上，它还不深入到设备级上(如磁盘及磁盘操作)，但近年来有向设备级发展的趋势(如原始磁盘、磁盘分块技术等)，DBMS一般提供相关的内模式描述语言(内模式DDL)。\n\n　　数据模式给出了数据库的数据框架结构，而数据库中的数据才是真正的实体，但这些数据必须按框架所描述的结构组织，以概念模式为框架所组成的数据库叫概念数据库(Conceptual Database)，以外模式为框架所组成的数据库叫用户数据库(user’s Database)，以内模式为框架所组成的数据库叫物理数据库(Physical Database)，这三种数据库中只有物理数据库是真实存在于计算机外存中，其它两种数据库并不真正存在于计算机中，而是通过两种映射由物理数据库映射而成。\n\n　　模式的三个级别层次反映了模式的三个不同环境以及它们的不同要求，其中内模式处于最低层，它反映了数据在计算机物理结构中的实际存储形式，概念模式处于中层，它反映了设计者的数据全局逻辑要求，而外模式处于最外层，它反映了用户对数据的要求。\n\n　　数据库系统的三级模式是对数据的三个级别抽象，它把数据的具体物理实现留给物理模式，使用户与全局设计者能不必关心数据库的具体实现与物理背景，同时，它通过两级映射建立三级模式间的联系与转换，使得概念模式与外模式虽然并不具物理存在，但是也能通过映射而获得其存在的实体，同时两级映射也保证了数据库系统中数据的独立性，亦即数据的物理组织改变与逻辑概念级改变，并不影响用户外模式的改变，它只要调整映射方式而不必改变用户模式。\n\n　　1.概念模式到内模式的映射\n\n　　该映射给出了概念模式中数据的全局逻辑结构到数据的物理存储结构间的对应关系，此种映射一般由DBMS实现。\n\n　　2.外模式到概念模式的映射\n\n　　概念模式是一个全局模式而外模式则是用户的局部模式，一个概念模式中可以定义多个外模式，而每个外模式是概念模式的一个基本视图。外模式到概念模式的映射给出了外模式与概念模式的对应关系，这种映射一般由DBMS实现。\n', '2011-03-01 00:00:00', 0, 1),
(20, 6, 'Ubuntu 11.10 更新，全新的软件中心图标\r\n', 'admin', '今天是 Ubuntu 11.10 界面冻结的日子，Ubuntu 为我们带来全新的软件中心界面以及图标 最新的这个 Ubuntu 软件中心 5 将会是 Ubuntu 11.10 默认的外观，如下图所示： 其他方面的更新内容包括： 应用程序图标： 窗口按钮行为： Window button for maximised ap', '<p>\n    天是 Ubuntu 11.10 界面冻结的日子，Ubuntu 为我们带来全新的软件中心界面以及图标&nbsp;\n</p>\n<p>\n    　　最新的这个 Ubuntu 软件中心 5 将会是 Ubuntu 11.10 默认的外观，如下图所示：\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/10034552O-0.jpg" width="500" height="434" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　其他方面的更新内容包括：\n</p>\n<p>\n    　　应用程序图标：\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="software center new icon" src="http://www.php100.com/cms/uploads/allimg/110826/10034525U-1.png" width="128" height="128" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　窗口按钮行为：\n</p>\n<p>\n    　　Window button for maximised apps in Ubuntu 11.10 Unity have a new behaviour: they hide by default. A quick mouse over reveals them. This is a tidy and logical change – you only need the buttons when your mouse is in their vicinity anyway.\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/1003453160-2.jpg" width="500" height="208" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Dash\n</p>\n<p>\n    　　The Unity Dash now has some Window Controls of its own. Hitting ‘Maximise’ extends the Dash fullscreen; ‘Minimize’ reduces the Dash to half screen; and ‘Close’, well… you can guess!\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/100345N12-3.jpg" width="500" height="281" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Dash Button\n</p>\n<p>\n    　　Whilst we’re on the subject of Unity’s Dash – check out its new icon.\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/10034521I-4.png" width="170" height="148" />\n</center>\n<p>\n    It reminds me of those old curved-screen CRT monitors…\n</p>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Lenses\n</p>\n<p>\n    　　The filter buttons for refining a search in the File, Music and Application lenses have been touched up, and a ‘ratings’ filter has been also been added.\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/1003452145-5.jpg" width="500" height="284" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Thunderbird Slick\n</p>\n<p>\n    　　The default mail client – Mozilla Thunderbird – has received a visual polish, benefiting from an Ambiance-themed makeover: -\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/1003451126-6.png" width="500" height="150" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　菜单\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="Ubuntu 11.10 user menu adds avatars" src="http://www.php100.com/cms/uploads/allimg/110826/100345GN-7.png" width="290" height="303" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　修改主题变得更加容易\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/10034531A-8.jpg" width="500" height="487" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Alt+` = 多窗口快速切换\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/100345N31-9.jpg" width="500" height="232" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　Before you begin to panic because your keyboard has the ‘`’ key in a strange location, the switcher short-cuts are all customizable via the ‘Switcher’ tab in the Unity plugin in Compiz Configuration Settings Manager.\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110826/1003451591-10.jpg" width="500" height="198" />\n</center>\n<p>\n    &nbsp;\n</p>', '2011-02-03 01:00:00', 0, 1),
(21, 6, '5 个轻量级 Linux 发行版，让旧PC重生\r\n', 'admin', '有非常非常多的 Linux 发行版，比如我们可能会经常使用的 Ubuntu、CentOS、红帽、Debian Linux 等等，这些 Linux 系统几乎都是适合当前的硬件水平，而在一些老的 PC 上运行起来就非常吃力。本文向你介绍 5 个轻量级的 Linux 版本，让你的旧 PC 老树开花。 1.', '<p>\n    有非常非常多的 Linux 发行版，比如我们可能会经常使用的 Ubuntu、CentOS、红帽、Debian Linux 等等，这些 Linux 系统几乎都是适合当前的硬件水平，而在一些老的 PC 上运行起来就非常吃力。本文向你介绍 5 个轻量级的 Linux 版本，让你的旧 PC 老树开花。&nbsp;\n</p>\n<p>\n    　　<a href="http://www.oschina.net/p/crunchbang" target="_blank"><span style="color:#005a98">1. CrunchBang Linux</span></a>\n</p>\n<p>\n    　　CrunchBang Linux是一份基于Ubuntu的发行，其特色在于轻量级的Openbox窗口管理器和GTK+应用程序。该发行从一份最小的Ubuntu系统创建，并 被定制为可以提供速度和功能两方面的一个良好均衡。CrunchBang Linux目前可以一份自启动运行光盘获得，然而为获得其最佳性能建议还是安装到硬盘上使用。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110825/11221B602-0.jpg" width="575" height="337" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　<a href="http://www.oschina.net/p/zenix" target="_blank"><span style="color:#005a98">2. Zenix</span></a>\n</p>\n<p>\n    　　ZENIX GNU/Linux是一份基于<a href="http://www.oschina.net/p/linux+from+scratch" target="_blank"><span style="color:#005a98">Linux From Scratch</span></a>的发行。它是一份直接从无到有建立起来以面向可靠服务器场合的操作系统。ZENIX包括一套基本系统及一些附加软件包。这些单个的软件包提 供的是功能齐全的面向特定需求的服务器环境，例如域名解析服务器、web服务器及邮件服务器。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110825/11221B627-1.png" width="650" height="487" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　<a href="http://www.oschina.net/p/antix" target="_blank"><span style="color:#005a98">3. antiX</span></a>\n</p>\n<p>\n    　　antiX是快捷、轻量级、易于安装的Linux自启动运行光盘发行，它基于<a href="http://www.oschina.net/p/mepis+linux" target="_blank"><span style="color:#005a98">MEPIS</span></a>和<a href="http://www.oschina.net/p/debian_linux" target="_blank"><span style="color:#005a98">Debian</span></a>的测试分支，面向Intel/AMD x86兼容系统。\n</p>\n<p>\n    　　antiX以一套适用于老旧计算机的环境为用户提供MEPIS的魔力。antiX的目标是向Linux的新手和老手提供一份轻巧但功能完 整的、灵活的免费操作系统。它应运行在绝大多数计算机上——从64 MB内存但带有128 MB交换分区的PII系统到最新的高端机器。为antiX推荐的最低内存配置是128 MB RAM，而安装程序则需要至少1.2 GB的硬盘空间。antiX也可以当作一张快速启动应急光盘来使用。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110825/11221CU7-2.png" width="480" height="384" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　<a href="http://www.oschina.net/p/zenwalk" target="_blank"><span style="color:#005a98">4. Zenwalk</span></a>\n</p>\n<p>\n    　　Zenwalk Linux(以前叫做Minislack)是一份基于Slackware的GNU/Linux操作系统，其宗旨在于以每项任务只设置一个应用程序来保持精 简和快捷，它还着重于图形桌面及多媒体使用。Zenwalk的特色在于包含最新的Linux技术以及一整套编程环境和运行库，它能为应用程序开发人员提供 一份理想的平台。Zenwalk的模块化实现方法还提供了能将Zenwalk Linux转化为具有高度调节性的现代化服务器(如LAMP架构、通讯、文件共享)的简便方法。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110825/11221C110-3.png" width="480" height="384" />\n</center>\n<p>\n    &nbsp;\n</p>\n<p>\n    　　5.&nbsp;<a href="http://www.oschina.net/p/xubuntu" target="_blank"><span style="color:#005a98">Xubuntu</span></a>或者&nbsp;<a href="http://www.oschina.net/p/lubuntu" target="_blank"><span style="color:#005a98">Lubuntu</span></a>\n</p>\n<p>\n    　　Xubuntu是一份基于Ubuntu的Linux发行。然而与Ubuntu不同的是，Xubuntu采用轻量级的XFce桌面环境，并面向低端机器作了优化。该发行尽可能地只包含GTK+应用软件。\n</p>\n<p>\n    　　\n</p>\n<center>\n    <img alt="\\" src="http://www.php100.com/cms/uploads/allimg/110825/11221BM3-4.png" width="480" height="384" />\n</center>\n<p>\n    &nbsp;\n</p>', '2011-01-04 09:00:00', 0, 1);
INSERT INTO `news` (`newsId`, `parentId`, `title`, `author`, `desc`, `content`, `addtime`, `views`, `recommend`) VALUES
(22, 1, 'PHP飞信通知天气预报_API版', 'admin', 'PHP飞信通知天气预报_API版　　如果条件允许可以在服务器上用计划任务 每天在固定时间给自己或亲人发送天气预报　　采用飞信官方web接口　　有时可能由于服务器速度问题可能造成发送不成功.属于正常现象.　...', '<p>\r\n	PHP飞信通知天气预报_API版</p>\r\n<p>\r\n	　　如果条件允许可以在服务器上用计划任务 每天在固定时间给自己或亲人发送天气预报</p>\r\n<p>\r\n	　　采用飞信官方web接口</p>\r\n<p>\r\n	　　有时可能由于服务器速度问题可能造成发送不成功.属于正常现象.</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　<!--?php</p--></p>\r\n<p>\r\n	　　/***************************************************************************/</p>\r\n<p>\r\n	　　/******************* PHP飞信通知天气预报_API版 *******************************/</p>\r\n<p>\r\n	　　/*************************** 2011-12-5 ************************************/</p>\r\n<p>\r\n	　　/**************************作者：xiaogg*************************************/</p>\r\n<p>\r\n	　　/***************************版本：2.11**************************************/</p>\r\n<p>\r\n	　　/*********************http://www.bitefu.net********************************/</p>\r\n<p>\r\n	　　header(&quot;content-Type: text/html; charset=utf-8&quot;);</p>\r\n<p>\r\n	　　function curl_file_get_contents($durl){</p>\r\n<p>\r\n	　　if(function_exists(&#39;curl_setopt&#39;)){</p>\r\n<p>\r\n	　　$ch = curl_init();</p>\r\n<p>\r\n	　　curl_setopt($ch, CURLOPT_URL, $durl);</p>\r\n<p>\r\n	　　curl_setopt($ch, CURLOPT_TIMEOUT, 5);</p>\r\n<p>\r\n	　　curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);</p>\r\n<p>\r\n	　　curl_setopt($ch, CURLOPT_REFERER,_REFERER_);</p>\r\n<p>\r\n	　　curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);</p>\r\n<p>\r\n	　　$r = curl_exec($ch);</p>\r\n<p>\r\n	　　curl_close($ch);</p>\r\n<p>\r\n	　　}else if(function_exists(&#39;file_get_contents&#39;)){</p>\r\n<p>\r\n	　　$r=file_get_contents($durl);</p>\r\n<p>\r\n	　　}else if(function_exists(&#39;file&#39;)){</p>\r\n<p>\r\n	　　$r=file($durl);$r = implode(&#39;&#39;, $r);</p>\r\n<p>\r\n	　　}else{</p>\r\n<p>\r\n	　　$r=&quot;获取内容失败&quot;;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　return $r;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　//删除空格</p>\r\n<p>\r\n	　　function wtrimall($str,$type=0)</p>\r\n<p>\r\n	　　{</p>\r\n<p>\r\n	　　$str= str_replace(&quot; &quot;,&quot;*-*&quot;,$str);</p>\r\n<p>\r\n	　　$str= str_replace(&quot;　&quot;,&quot;*-*&quot;,$str);</p>\r\n<p>\r\n	　　$str= str_replace(&quot;\\t&quot;,&quot;*-*&quot;,$str);</p>\r\n<p>\r\n	　　$str_s= str_replace(&quot;\\n&quot;,&quot;*-*&quot;,$str);</p>\r\n<p>\r\n	　　$str= str_replace(&quot;*-*&quot;,&quot;&quot;,$str_s);</p>\r\n<p>\r\n	　　if($type==1)return $str_s;else return $str;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　//对数组进行键值排序</p>\r\n<p>\r\n	　　function wchangearray($str)</p>\r\n<p>\r\n	　　{</p>\r\n<p>\r\n	　　return array_values(array_filter($str));</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　function wtext($city,$weather_txt=&quot;weahter.txt&quot;)</p>\r\n<p>\r\n	　　{</p>\r\n<p>\r\n	　　$date=date(&quot;Y-m-d&quot;);$arr=array();$arr[&#39;date&#39;]=$date;</p>\r\n<p>\r\n	　　if(!file_exists($weather_txt)){file_put_contents($weather_txt,serialize($arr));}</p>\r\n<p>\r\n	　　$old=unserialize(file_get_contents($weather_txt));</p>\r\n<p>\r\n	　　if($old[&#39;date&#39;]!=$date){file_put_contents($weather_txt,serialize($arr));}</p>\r\n<p>\r\n	　　if($old[$city] &amp;&amp; strlen($old[$city])&gt;30){return $old[$city];}else{</p>\r\n<p>\r\n	　　switch($city)</p>\r\n<p>\r\n	　　{</p>\r\n<p>\r\n	　　case &quot;sjz&quot;: $url = &#39;http://www.weather.com.cn/weather/101090101.shtml&#39;;$text=&quot;石家庄&quot;;break;</p>\r\n<p>\r\n	　　case &quot;yt&quot;: $url = &#39;http://www.weather.com.cn/weather/101090508.shtml&#39;;$text=&quot;玉田&quot;;break;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　$lines_string = curl_file_get_contents($url);</p>\r\n<p>\r\n	　　$lines_string = explode(&quot;<!--day",$lines_string);</p>\r\n<p>　　$lines_string_3=explode("未来",$lines_string[3]);</p>\r\n<p>　　$lines_array =array(str_replace(''1-->&#39;,&#39;&#39;,$lines_string[1]),str_replace(&#39;2--&gt;&#39;,&#39;&#39;,$lines_string[2]),str_replace(&#39;3--&gt;&#39;,&#39;&#39;,$lines_string_3[0]));</p>\r\n<p>\r\n	　　for($i=0;$i&lt; count($lines_array); $i ++)</p>\r\n<p>\r\n	　　{</p>\r\n<p>\r\n	　　$nowarray=strip_tags($lines_array[$i]);</p>\r\n<p>\r\n	　　$datearray=explode(&quot;日&quot;,$nowarray);$nowdata=wtrimall($datearray[0]);//获取日期</p>\r\n<p>\r\n	　　$weather=explode(&quot;白天&quot;,$nowarray);$weather=explode(&quot;夜间&quot;,$weather[1]);</p>\r\n<p>\r\n	　　$weather_bai=wtrimall(str_replace(&quot;高温 &quot;,&quot;&quot;,$weather[0]));$weather_bai=str_replace(&quot;℃&quot;,&quot;度&quot;,$weather_bai);//白天天气</p>\r\n<p>\r\n	　　$weather_ye=wtrimall(str_replace(&quot;低温 &quot;,&quot;&quot;,$weather[1]));$weather_ye=str_replace(&quot;℃&quot;,&quot;度&quot;,$weather_ye);//夜间天气</p>\r\n<p>\r\n	　　$baiarr=wchangearray(explode(&quot;\\r&quot;,$weather_bai));$yearr=wchangearray(explode(&quot;\\r&quot;,$weather_ye));</p>\r\n<p>\r\n	　　$wtext[$i]=trim($nowdata).&quot;日&quot;;</p>\r\n<p>\r\n	　　if($baiarr[0]==$yearr[0]){$wtext[$i].=$baiarr[0];}else{$wtext[$i].=$baiarr[0].&quot;转&quot;.$yearr[0];}//将天气添加到返回值里</p>\r\n<p>\r\n	　　$wtext[$i].=$baiarr[1].&quot;到&quot;.$yearr[1];//将气温添加到返回值里</p>\r\n<p>\r\n	　　if($baiarr[2]==$yearr[2]){$wtext[$i].=$baiarr[2];}else{$wtext[$i].=str_replace(&quot;风&quot;,&quot;&quot;,$baiarr[2].&quot;转&quot;.$yearr[2]);$wtext[$i].=&quot;风&quot;;}//将风向添加到返回值里</p>\r\n<p>\r\n	　　if($baiarr[3]!=&quot;微风&quot;){$wtext[$i].=$baiarr[3];}//将风力添加到返回值里</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　$new=$text.implode(&quot;&quot;,$wtext);</p>\r\n<p>\r\n	　　if(strlen($new)&lt;30){$new=wtext($city);};</p>\r\n<p>\r\n	　　$newarr=array($city=&gt;$new);</p>\r\n<p>\r\n	　　file_put_contents($weather_txt,serialize(array_unique(array_merge($old,$newarr))));</p>\r\n<p>\r\n	　　return $new;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　//配置开始</p>\r\n<p>\r\n	　　$phone_num = &quot;150******&quot;;//在这修改为您的手机号码;</p>\r\n<p>\r\n	　　$password = &quot;******&quot; ;//在这修改为您的飞信密码</p>\r\n<p>\r\n	　　$phone=&quot;150******|yt;134******|yt;151******|sjz;150******|sjz&quot;;//在这修改为要发送的电话号码，多个发送用,分开。注：必须是您的飞信好友</p>\r\n<p>\r\n	　　//配置结束</p>\r\n<p>\r\n	　　$tophone=explode(&quot;;&quot;,$phone);</p>\r\n<p>\r\n	　　//发送短信</p>\r\n<p>\r\n	　　for($i=0;$i<count($tophone);$i++){< p=""> </count($tophone);$i++){<></p>\r\n<p>\r\n	　　$sys=explode(&quot;|&quot;,$tophone[$i]);</p>\r\n<p>\r\n	　　$url=&quot;http://www.bitefu.net/fetion/?&quot;;</p>\r\n<p>\r\n	　　$url.=&quot;phone=&quot;.$phone_num.&quot;&amp;pwd=&quot;.$password.&quot;&amp;to=&quot;.$sys[0].&quot;&amp;u=1&amp;msg=&quot;.wtext($sys[1]);//&amp;u=1这个参数是在发送的内容出现乱码时加上的,如果存在乱码问题可以去掉这个参数</p>\r\n<p>\r\n	　　file_get_contents($url);</p>\r\n<p>\r\n	　　}if($i==count($tophone)){sleep(100);</p>\r\n<p>\r\n	　　?&gt; &lt;script&gt;&lt;/script&gt;</p>\r\n', '2011-12-19 00:07:20', 0, 1),
(29, 1, 'php压缩HTML代码', 'admin', '<p>\r\n	　/**　　* 压缩html : 清除换行符,清除制表符,去掉注释标记　　* @param $string　　* @return 压缩后的$string　　* */　　function compress_html($string) {　　$string = str_replace(&quot;\\r\\n&quot;....　...</p>\r\n', '<p>\r\n	/**</p>\r\n<p>\r\n	　　* 压缩html : 清除换行符,清除制表符,去掉注释标记</p>\r\n<p>\r\n	　　* @param $string</p>\r\n<p>\r\n	　　* @return 压缩后的$string</p>\r\n<p>\r\n	　　* */</p>\r\n<p>\r\n	　　function compress_html($string) {</p>\r\n<p>\r\n	　　$string = str_replace(&quot;\\r\\n&quot;, &#39;&#39;, $string); //清除换行符</p>\r\n<p>\r\n	　　$string = str_replace(&quot;\\n&quot;, &#39;&#39;, $string); //清除换行符</p>\r\n<p>\r\n	　　$string = str_replace(&quot;\\t&quot;, &#39;&#39;, $string); //清除制表符</p>\r\n<p>\r\n	　　$pattern = array (</p>\r\n<p>\r\n	　　&quot;/&gt; *([^ ]*) *<!--", p 去掉注释标记<--></p>\r\n<p>\r\n	　　&quot;/[\\s]+/&quot;,</p>\r\n<p>\r\n	　　&quot;/{C}<!--[^!]*-->/&quot;,</p>\r\n<p>\r\n	　　&quot;/\\&quot; /&quot;,</p>\r\n<p>\r\n	　　&quot;/ \\&quot;/&quot;,</p>\r\n<p>\r\n	　　&quot;&#39;/\\*[^*]*\\*/&#39;&quot;</p>\r\n<p>\r\n	　　);</p>\r\n<p>\r\n	　　$replace = array (</p>\r\n<p>\r\n	　　&quot;&gt;\\\\1&lt;&quot;,</p>\r\n<p>\r\n	　　&quot; &quot;,</p>\r\n<p>\r\n	　　&quot;&quot;,</p>\r\n<p>\r\n	　　&quot;\\&quot;&quot;,</p>\r\n<p>\r\n	　　&quot;\\&quot;&quot;,</p>\r\n<p>\r\n	　　&quot;&quot;</p>\r\n<p>\r\n	　　);</p>\r\n<p>\r\n	　　return preg_replace($pattern, $replace, $string);</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	<!--内容关联投票--><!-- articleBody end --><!-- numpage start --></p>\r\n<div class="pages">\r\n	<div id="numpage">\r\n		&nbsp;</div>\r\n</div>\r\n<p>\r\n	&nbsp;</p>\r\n', '2011-12-19 00:23:34', 0, 1),
(30, 1, '加速PHP的echo', 'admin', '<p>\r\n	　　你也许注意到过, 在PHP中使用ECHO输出大段字符串的时候, 执行时间会明显的长, 也就会有朋友认为PHP的ECHO性能很差.　　之前网络中也有文章, 已经解释过了原因, 也希望能纠正PHP的ECHO性能差的这个误会....</p>\r\n', '<p>\r\n	你也许注意到过, 在PHP中使用ECHO输出大段字符串的时候, 执行时间会明显的长, 也就会有朋友认为PHP的ECHO性能很差.</p>\r\n<p>\r\n	　　之前网络中也有文章, 已经解释过了原因, 也希望能纠正&rdquo;PHP的ECHO性能差&rdquo;的这个误会.</p>\r\n<p>\r\n	　　然而之前的文章, 也仅仅是给出了原因, 并没有介绍如何避免这个问题, 在今天公司内的某个产品线(Apache with PHP)发现了一个问题, 有用户在短时间内大量发起下载请求, 导致http连接数和数据库连接数剧增,</p>\r\n<p>\r\n	　　而数据库连接数剧增的原因是因为数据库的连接是单列模式, 一直到请求处理结束, 才会释放数据库链接. 这样就有了一个问题, 如果请求处理时间过长, 就会造成大量的数据库链接存在.</p>\r\n<p>\r\n	　　而这个用户的网速很慢, 这也就意味着, ECHO的&rdquo;性能&rdquo;很差~, 下载时间很长~. 如下图所示:</p>\r\n<p>\r\n	　　</p>\r\n<center>\r\n	<img alt="\\" height="258" src="http://www.php100.com/uploadfile/2011/1205/20111205095532476.png" width="300" /></center>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　ECHO执行示意图</p>\r\n<p>\r\n	　　这也就引出了今天我要谈的这个问题, 如何让ECHO变快, 让PHP的请求处理过程, 尽快结束&hellip;</p>\r\n<p>\r\n	　　我们知道, 之所以ECHO慢, 是在等待&rdquo;写数据&rdquo;成功返回, 那么一个比较简单的办法, 就是打开输出缓存,</p>\r\n<p>\r\n	　　编辑php.ini</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　output_buffering = 4096 //bytes</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　当然, 你也可以在脚本中, 显示的调用ob_start():</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　ob_start();</p>\r\n<p>\r\n	　　echo $huge_string;</p>\r\n<p>\r\n	　　//其他的逻辑.</p>\r\n<p>\r\n	　　ob_end_flush();</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　这里, 有一个要注意的地方, ob_start将会开辟一块4096大小的buffer, 所以, 如果huge_string大于4096, 将不会起到加速的作用.</p>\r\n<p>\r\n	　　现在, 我们的ECHO就会&rdquo;立即&rdquo;执行成功, 返回. 因为数据暂时写到了我们的输出缓存当中. 如果buffer足够大, 那么内容会等到脚本的最后, 才一次性发送给客户端(严格来说, 是发送给WebServer).</p>\r\n<p>\r\n	　　但这样并不能解决我们今天遇到的这个问题, 因为这些数据到最后, 还是需要PHP去把它们发送给客户端(此时不考虑WebServer的Output buffer), 这个过程不结束, 请求不会关闭, PHP也不会执行DB的析构函数~</p>\r\n<p>\r\n	　　那么, 既然做梦, 那就再做大点, 我们可以使用Apache的输出缓存. 也就是改变成如下的执行流程:</p>\r\n<p>\r\n	　　</p>\r\n<center>\r\n	<img alt="\\" height="289" src="http://www.php100.com/uploadfile/2011/1205/20111205095532637.png" width="300" /></center>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　加速ECHO示意图</p>\r\n<p>\r\n	　　假设, 我们的PHP要输出100K的数据, 那么, 我们Apache的的输出缓存就必须大于100K, 否则当Apache的输出缓存满了以后, 就会真正的发送给客户端, 而这个过程中, 当时执行的ECHO就会阻塞等待.</p>\r\n<p>\r\n	　　那么, 如何修改Apache的输出缓存呢? 我们可以在apache的配置文件中, 使用SendBufferSize配置指令:</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　SendBufferSize 4096 //注意是byte</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　具体的SendBufferSize的说明, 参看http://httpd.apache.org/docs/2.0/en/mod/mpm_common.html#sendbuffersize</p>\r\n<p>\r\n	　　注: 其他的Webserver with php-cgi的模式, 请翻阅相关Webserver的手册, 寻找类似配置.</p>\r\n<p>\r\n	　　现在, PHP的ECHO, 将直接把内容交给Apache, PHP在执行完成后, 不再等待内容发送给客户端完成, 而直接退出. 而内容会在PHP处理完成以后, 由Apache发送给客户端. 从而加速了ECHO的执行效率.</p>\r\n<p>\r\n	　　废话一句: printf, print, file_put_contents(&ldquo;php://output&rdquo;)&hellip;等等, 和ECHO都是一样的.</p>\r\n<p>\r\n	<strong>　　最后要说明, 这样做, 只是把原来ECHO的等待时间, 转移给了Apache, 并没有真正的减少客户端获取到内容的时间. 它只是加速了PHP的处理过程, 提前了PHP的退出时机, 从而能减少PHP对资源的占用时间, 间接增加资源的占用率.</strong></p>\r\n<p>\r\n	<!--内容关联投票--><!-- articleBody end --><!-- numpage start --></p>\r\n<div class="pages">\r\n	<div id="numpage">\r\n		&nbsp;</div>\r\n</div>\r\n<p>\r\n	&nbsp;</p>\r\n', '2011-12-19 00:25:28', 0, 1),
(31, 1, 'PHP字符串截取', 'admin', '<p>\r\n	　/**　　* 字符截取 支持UTF8/GBK　　* @param $string　　* @param $length　　* @param $dot　　*/　　function str_cut($string, $length, $dot = &amp;#39;...&amp;#39;) {　　$strlen = strlen(....</p>\r\n', '<p>\r\n	　/**</p>\r\n<p>\r\n	　　* 字符截取 支持UTF8/GBK</p>\r\n<p>\r\n	　　* @param $string</p>\r\n<p>\r\n	　　* @param $length</p>\r\n<p>\r\n	　　* @param $dot</p>\r\n<p>\r\n	　　*/</p>\r\n<p>\r\n	　　function str_cut($string, $length, $dot = &#39;...&#39;) {</p>\r\n<p>\r\n	　　$strlen = strlen($string);</p>\r\n<p>\r\n	　　if($strlen &lt;= $length) return $string;</p>\r\n<p>\r\n	　　$string = str_replace(array(&#39; &#39;,&#39; &#39;, &#39;&amp;&#39;, &#39;&quot;&#39;, &#39;&#39;&#39;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;), array(&#39;∵&#39;,&#39; &#39;, &#39;&amp;&#39;, &#39;&quot;&#39;, &quot;&#39;&quot;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;), $string);</p>\r\n<p>\r\n	　　$strcut = &#39;&#39;;</p>\r\n<p>\r\n	　　if(strtolower(CHARSET) == &#39;utf-8&#39;) {</p>\r\n<p>\r\n	　　$length = intval($length-strlen($dot)-$length/3);</p>\r\n<p>\r\n	　　$n = $tn = $noc = 0;</p>\r\n<p>\r\n	　　while($n &lt; strlen($string)) {</p>\r\n<p>\r\n	　　$t = ord($string[$n]);</p>\r\n<p>\r\n	　　if($t == 9 || $t == 10 || (32 &lt;= $t &amp;&amp; $t &lt;= 126)) {</p>\r\n<p>\r\n	　　$tn = 1; $n++; $noc++;</p>\r\n<p>\r\n	　　} elseif(194 &lt;= $t &amp;&amp; $t &lt;= 223) {</p>\r\n<p>\r\n	　　$tn = 2; $n += 2; $noc += 2;</p>\r\n<p>\r\n	　　} elseif(224 &lt;= $t &amp;&amp; $t &lt;= 239) {</p>\r\n<p>\r\n	　　$tn = 3; $n += 3; $noc += 2;</p>\r\n<p>\r\n	　　} elseif(240 &lt;= $t &amp;&amp; $t &lt;= 247) {</p>\r\n<p>\r\n	　　$tn = 4; $n += 4; $noc += 2;</p>\r\n<p>\r\n	　　} elseif(248 &lt;= $t &amp;&amp; $t &lt;= 251) {</p>\r\n<p>\r\n	　　$tn = 5; $n += 5; $noc += 2;</p>\r\n<p>\r\n	　　} elseif($t == 252 || $t == 253) {</p>\r\n<p>\r\n	　　$tn = 6; $n += 6; $noc += 2;</p>\r\n<p>\r\n	　　} else {</p>\r\n<p>\r\n	　　$n++;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　if($noc &gt;= $length) {</p>\r\n<p>\r\n	　　break;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　if($noc &gt; $length) {</p>\r\n<p>\r\n	　　$n -= $tn;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　$strcut = substr($string, 0, $n);</p>\r\n<p>\r\n	　　$strcut = str_replace(array(&#39;∵&#39;, &#39;&amp;&#39;, &#39;&quot;&#39;, &quot;&#39;&quot;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;), array(&#39; &#39;, &#39;&amp;&#39;, &#39;&quot;&#39;, &#39;&#39;&#39;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;), $strcut);</p>\r\n<p>\r\n	　　} else {</p>\r\n<p>\r\n	　　$dotlen = strlen($dot);</p>\r\n<p>\r\n	　　$maxi = $length - $dotlen - 1;</p>\r\n<p>\r\n	　　$current_str = &#39;&#39;;</p>\r\n<p>\r\n	　　$search_arr = array(&#39;&amp;&#39;,&#39; &#39;, &#39;&quot;&#39;, &quot;&#39;&quot;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;,&#39;∵&#39;);</p>\r\n<p>\r\n	　　$replace_arr = array(&#39;&amp;&#39;,&#39; &#39;, &#39;&quot;&#39;, &#39;&#39;&#39;, &#39;&ldquo;&#39;, &#39;&rdquo;&#39;, &#39;&mdash;&#39;, &#39;&lt;&#39;, &#39;&gt;&#39;, &#39;&middot;&#39;, &#39;&hellip;&#39;,&#39; &#39;);</p>\r\n<p>\r\n	　　$search_flip = array_flip($search_arr);</p>\r\n<p>\r\n	　　for ($i = 0; $i &lt; $maxi; $i++) {</p>\r\n<p>\r\n	　　$current_str = ord($string[$i]) &gt; 127 ? $string[$i].$string[++$i] : $string[$i];</p>\r\n<p>\r\n	　　if (in_array($current_str, $search_arr)) {</p>\r\n<p>\r\n	　　$key = $search_flip[$current_str];</p>\r\n<p>\r\n	　　$current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　$strcut .= $current_str;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　return $strcut.$dot;</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-19 00:26:44', 0, 1),
(32, 1, 'PHP5.3之后的新特性', 'admin', '<p>\r\n	从PHP4到PHP5，实现了由个人开发语言到专业互联网的发展，见证着PHP从山寨走上正规大军的发展。PHP6还在酝酿中，相信PHP5会作为PHP6小试牛刀的场地。 PHP5.3是PHP5的一个里程碑，加入了大量新特性。PHP功能...</p>\r\n', '<p>\r\n	从PHP4到PHP5，实现了由个人开发语言到专业互联网的发展，见证着PHP从山寨走上正规大军的发展。PHP6还在酝酿中，相信PHP5会作为PHP6小试牛刀的场地。 PHP5.3是PHP5的一个里程碑，加入了大量新特性。PHP功能是越来越多了，但是PHP的语法却越来越丑陋，有时加入了新功能，而新功能又带来了新问题，为了修复问题又要加入新的语法来修复。没有PHP的基础的朋友也不用担心，先对PHP5.3有个基本的了解。等学完后面知识再回过头来看PHP5.3的新特性你会有个全新的理解和感悟。</p>\r\n<p>\r\n	　　1、首先对之前滥用的语法进行了规范</p>\r\n<p>\r\n	　　众所周知PHP在语言开发过程中有一个很好的容错性，导致在数组或全局变量中包含字符串不使用引号是可以不报错的，很多业余的开发者因为懒惰而产生的安全问题十分严重，之所以PHP5.3对所有基本的语法进行了重新整理和提高写作规范，其实对PHP开发者来讲写作上并没有太大的影响，只是让他们变的更加专业。</p>\r\n<p>\r\n	　　2、MySQL驱动Mysqli 提高效率</p>\r\n<p>\r\n	　　一直以来，php都是通过mysql客户端连接mysql，而现在mysql官方已经推出php版的mysql客户端，而这个mysqlind有效降低内存的使用以及提高性能</p>\r\n<p>\r\n	　　(1)编译php更方便了，不需要libmysql，已经内置在源码中</p>\r\n<p>\r\n	　　(2)使用php许可，避免版权问题</p>\r\n<p>\r\n	　　(3)使用php的内存管理，支持php内存限制(memory_limit)</p>\r\n<p>\r\n	　　(4)所有数据在内存只有一份，之前的libmysql有两份</p>\r\n<p>\r\n	　　(5)提供性能统计功能，帮助分析瓶颈</p>\r\n<p>\r\n	　　(6)在驱动层增加缓存机制</p>\r\n<p>\r\n	　　3、PHP5.3安全和性能的提升</p>\r\n<p>\r\n	　　如md5()大概提高了10%-15%的性能，更好的内存处理机制，提高软件性能的访问。解决了include(require)_once重复打开的问题，之前once都是用静态变量实现的，用gcc4编译的二进制文件将更小，整体性能提高了5%-15%</p>\r\n<p>\r\n	　　4、延迟静态绑定</p>\r\n<p>\r\n	　　PHP的静态是在预编译时就固定好的，所以在继承的时候，父类里的self指的是父类，而不是子类。而php5.3加入了新的语法static，可以在运行时候捕捉当前类</p>\r\n<p>\r\n	　　5、更多新特性</p>\r\n<p>\r\n	　　(1)名字空间,用来解决命名被污染</p>\r\n<p>\r\n	　　(2)新的魔法函数 __callStatic 原来 __call的静态模式</p>\r\n<p>\r\n	　　(3)支持变量调用静态，可以通过$someClass::$method()调用</p>\r\n<p>\r\n	　　(4)新增日期函数date_create_from_format</p>\r\n<p>\r\n	　　(5)新增了类似JavaScript中的匿名函数和闭包</p>\r\n<p>\r\n	　　(6)新魔法常量 __DIR__ 来解决路径问题</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-19 00:27:27', 0, 1),
(33, 1, 'PHP错误提示解析', 'admin', '<p>\r\n	　先说PHP的错误信息,来自PHP100论坛　　PHP的错误信息由一下几部分构成　　{错误类型}: {错误原因} in {错误文件} on {错误行数}　　说明了在哪个文件的哪一行中因何种原因出现了何种错误。　　常见的错...</p>\r\n', '<p>\r\n	先说PHP的错误信息,来自PHP100论坛</p>\r\n<p>\r\n	　　PHP的错误信息由一下几部分构成</p>\r\n<p>\r\n	<strong><span style="background-color: rgb(255,255,0)">　　{错误类型}: {错误原因} in {错误文件} on {错误行数}</span></strong></p>\r\n<p>\r\n	　　说明了在哪个文件的哪一行中因何种原因出现了何种错误。</p>\r\n<p>\r\n	　　常见的错误类型一般有下面几种：</p>\r\n<p>\r\n	　　Parse error(解析错误)一般都伴随着Syntax errors(句法错误) ，说明你的程序不符合PHP的语法。</p>\r\n<p>\r\n	　　它是级别最高的错误，整个脚本根本不会被执行。</p>\r\n<p>\r\n	　　一般都是由一个表达式缺少&quot;;&quot; 或各种括号引号不成对引起的。看详细的信息就能知道问题的所在。</p>\r\n<p>\r\n	　　一般句法错误都会给你提示一个解析器代号，告诉你出现的问题是在哪里。比如：</p>\r\n<p>\r\n	　　Parse error: syntax error, unexpected T_STRING in xxx.php on line 9</p>\r\n<p>\r\n	　　T_STRING 是一个解析器代号，顾名思义，它代表字符串，很多错误原因都会带解析器代号。通过它你可以更直接的了解到错误的原因。</p>\r\n<p>\r\n	　　unexpected意思是非预期的，换句话说也就是多余的。</p>\r\n<p>\r\n	　　更多解析器代号请参考：http://www.php.net/manual/zh/tokens.php 或php手册 英文版中叫:List of Parser Tokens 中文版中叫:解析器代号列表</p>\r\n<p>\r\n	　　上面的错误的意思是说你的第九行有一个非预期的字符串。</p>\r\n<p>\r\n	　　我的代码:</p>\r\n<p>\r\n	　　1-7: 略</p>\r\n<p>\r\n	　　8 : test(array(&#39;a&#39;))</p>\r\n<p>\r\n	　　9 : xxx();</p>\r\n<p>\r\n	　　10 : &gt;</p>\r\n<p>\r\n	　　这个问题如何解决呢?把第九行的xxx删掉，的确符合PHP语法了。</p>\r\n<p>\r\n	　　但是那不是我想要的，实际上是我的第8行缺少了一个&quot;;&quot;，解决办法是在第8行结尾加分号。</p>\r\n<p>\r\n	　　注意:这个例子还说明了一个问题，错误报告说是哪行，问题不一定就非在哪行，也可能是它的前面一行或几行造成的。最典型的例子是某程序提示出错行数在文件的最后一行，你去看，发现那行除了&ldquo;&gt;&rdquo;以外没有别的字符，这种情况一般是缺少引号导致的。你要往前面找不成对的引号或者别的什么标点。如果你非要抬杠，认准了行号不松口，那就不是php的问题了。</p>\r\n<p>\r\n	　　Fatal Error(致命错误)，仅次于Parsing Error的错误，执行到发生错误的行时，脚本会终止运行。</p>\r\n<p>\r\n	　　在程序符合PHP语法的基础上，使用了未定义的函数，或require一个不存在的文件，死循环导致程序执行超时，都会导致fatal error。</p>\r\n<p>\r\n	　　一般表现为：</p>\r\n<p>\r\n	　　Fatal Error: Call to undefined function func() in php100.php on line 某某</p>\r\n<p>\r\n	　　就是说在某某行你调用了一个未定义的func函数，这时候一般就是看你是否忘了包含该包含的文件，是否写错了函数名，是否写错了文件名。（PHP100.com）</p>\r\n<p>\r\n	　　Warning(警告)，比致命错误级别稍低，但程序不会因为脚本错误而终止。</p>\r\n<p>\r\n	　　一般出现在include一个不存在的文件，或者一个程序需要一个参数，但是你没传参数，并且你也没指定参数的默认值。</p>\r\n<p>\r\n	　　Warning视情况可以避免出现，实在没法避免，可以加@强行屏蔽。</p>\r\n<p>\r\n	　　Notice(通知)，级别最低，一般可以无视，不会影响到脚本的运行。多数发生在变量或数组下标未定义的情况。</p>\r\n<p>\r\n	　　注意：多数notice都可忽略，但是少数的notice也可能会反映出比较严重的问题。</p>\r\n<p>\r\n	　　比如 Notice: Undefined variable: sql in xxx.php on line xx</p>\r\n<p>\r\n	　　你看到有个变量&quot;sql&quot;未定义，这就可能很危险了，在register_globals=on的情况下，没准这个错误直接就成为了别人操作数据库的后门。</p>\r\n<p>\r\n	　　此外还有一些别的类型的错误，平时不常见，我就不多说了。</p>\r\n<p>\r\n	　　总结</p>\r\n<p>\r\n	　　综上所述，PHP的错误提示会告诉我们很多事情，为我们查找错误提供了极大的方便。好好利用它，会大大的提高我们的工作效率和工作质量。</p>\r\n<p>\r\n	　　不过，它带来好处的同时，也可能会透露服务器的敏感信息，容易让攻击者发现服务器的漏洞。</p>\r\n<p>\r\n	　　php开发环境一定要打开全部错误提示，打开错误显示。最大限度的减少事故的发生。</p>\r\n<p>\r\n	　　生产环境千万要把错误显示关闭，改用日志来记录错误。别给有心人以可乘之机。</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-19 00:28:13', 0, 1),
(50, 5, 'MySQL高可用性大杀器之MHA', 'admin', '<p>\r\n	　　提到MySQL高可用性，很多人会想到MySQL Cluster，亦或者Heartbeat+DRBD，不过这些方案的复杂性常常让人望而却步，与之相对，利用MySQL复制实现高可用性则显得容易很多，目前大致有MMM，PRM，MHA等方案可供选...</p>\r\n', '<p>\r\n	提到MySQL高可用性，很多人会想到MySQL Cluster，亦或者Heartbeat+DRBD，不过这些方案的复杂性常常让人望而却步，与之相对，利用MySQL复制实现高可用性则显得容易很多，目前大致有MMM，PRM，MHA等方案可供选择：MMM是最常见的方案，可惜它带来的问题往往比解决的问题还多(What&rsquo;s wrong with MMM?);至于PRM，它还是个新项目，暂时不推荐用于产品环境，不过作为Percona的作品，它值得期待;如此看来目前只能选MHA了，好在经过DeNA大规模的实践应用证明它是个靠谱的工具。</p>\r\n<p>\r\n	　　安装：</p>\r\n<p>\r\n	　　作为前提条件，应先配置MySQL复制，并设置SSH公钥免密码登录。下面以CentOS为例来说明，最好先安装EPEL，不然YUM可能找不到某些软件包。</p>\r\n<p>\r\n	　　MHA由Node和Manager组成，Node运行在每一台MySQL服务器上，也就是说，不管是MySQL主服务器，还是MySQL从服务器，都要安装Node，而Manager通常运行在独立的服务器上，但如果硬件资源吃紧，也可以用一台MySQL从服务器来兼职Manager的角色。</p>\r\n<p>\r\n	　　安装Node：</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　shell&gt; yum install perl-DBD-MySQL</p>\r\n<p>\r\n	　　shell&gt; rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　安装Manager：</p>\r\n<p>\r\n	　　shell&gt; yum install perl-DBD-MySQL</p>\r\n<p>\r\n	　　shell&gt; yum install perl-Config-Tiny</p>\r\n<p>\r\n	　　shell&gt; yum install perl-Log-Dispatch</p>\r\n<p>\r\n	　　shell&gt; yum install perl-Parallel-ForkManager</p>\r\n<p>\r\n	　　shell&gt; rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm</p>\r\n<p>\r\n	　　shell&gt; rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.52-0.noarch.rpm</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　配置：</p>\r\n<p>\r\n	　　配置全局设置：</p>\r\n<p>\r\n	　　shell&gt; cat /etc/masterha_default.cnf</p>\r\n<p>\r\n	　　[server default]</p>\r\n<p>\r\n	　　user=...</p>\r\n<p>\r\n	　　password=...</p>\r\n<p>\r\n	　　ssh_user=...</p>\r\n<p>\r\n	　　配置应用设置：</p>\r\n<p>\r\n	　　shell&gt; cat /etc/masterha_application.cnf</p>\r\n<p>\r\n	　　[server_1]</p>\r\n<p>\r\n	　　hostname=...</p>\r\n<p>\r\n	　　[server_2]</p>\r\n<p>\r\n	　　hostname=...</p>\r\n<p>\r\n	　　注：MHA配置文件中参数的详细介绍请参考官方文档。</p>\r\n<p>\r\n	　　检查</p>\r\n<p>\r\n	　　检查MySQL复制：</p>\r\n<p>\r\n	　　shell&gt; masterha_check_repl --conf=/etc/masterha_application.cnf</p>\r\n<p>\r\n	　　检查SSH公钥免密码登录：</p>\r\n<p>\r\n	　　shell&gt; masterha_check_ssh --conf=/etc/masterha_application.cnf</p>\r\n<p>\r\n	　　实战</p>\r\n<p>\r\n	　　首先启动MHA进程：</p>\r\n<p>\r\n	　　shell&gt; masterha_manager --conf=/etc/masterha_application.cnf</p>\r\n<p>\r\n	　　注：视配置情况而定，可能会提示read_only，relay_log_purge等警告信息。</p>\r\n<p>\r\n	　　然后检查MHA状态：</p>\r\n<p>\r\n	　　shell&gt; masterha_check_status --conf=/etc/masterha_application.cnf</p>\r\n<p>\r\n	　　注：如果正常，会显示『PING_OK』，否则会显示『NOT_RUNNING』。</p>\r\n<p>\r\n	　　到此为止，一个基本的MHA例子就能正常运转了，不过一旦当前的MySQL主服务器发生故障，MHA把某台MySQL从服务器提升为新的MySQL主服务器后，如何通知应用呢?这就需要在配置文件里加上如下两个参数：</p>\r\n<p>\r\n	　　master_ip_failover_script</p>\r\n<p>\r\n	　　master_ip_online_change_script</p>\r\n<p>\r\n	　　说到Failover，通常有两种方式：一种是虚拟IP地址，一种是全局配置文件。MHA并没有限定使用哪一种方式，而是让用户自己选择，虚拟IP地址的方式会牵扯到其它的软件，这里就不赘述了，以下简单说说全局配置文件，以PHP为实现语言，代码如下：</p>\r\n<p>\r\n	　　#!/usr/bin/env php</p>\r\n<p>\r\n	　　<!--?php</p--></p>\r\n<p>\r\n	　　$longopts = array(</p>\r\n<p>\r\n	　　&#39;command:&#39;,</p>\r\n<p>\r\n	　　&#39;ssh_user:&#39;,</p>\r\n<p>\r\n	　　&#39;orig_master_host:&#39;,</p>\r\n<p>\r\n	　　&#39;orig_master_ip:&#39;,</p>\r\n<p>\r\n	　　&#39;orig_master_port:&#39;,</p>\r\n<p>\r\n	　　&#39;new_master_host::&#39;,</p>\r\n<p>\r\n	　　&#39;new_master_ip::&#39;,</p>\r\n<p>\r\n	　　&#39;new_master_port::&#39;,</p>\r\n<p>\r\n	　　);</p>\r\n<p>\r\n	　　$options = getopt(null, $longopts);</p>\r\n<p>\r\n	　　if ($options[&#39;command&#39;] == &#39;start&#39;) {</p>\r\n<p>\r\n	　　$params = array(</p>\r\n<p>\r\n	　　&#39;ip&#39; =&gt; $options[&#39;new_master_ip&#39;],</p>\r\n<p>\r\n	　　&#39;port&#39; =&gt; $options[&#39;new_master_port&#39;],</p>\r\n<p>\r\n	　　);</p>\r\n<p>\r\n	　　$string = &#39;<!--?php return '' . var_export($params, true) . ''; ?-->&#39;;</p>\r\n<p>\r\n	　　file_put_contents(&#39;config.php&#39;, $string, LOCK_EX);</p>\r\n<p>\r\n	　　}</p>\r\n<p>\r\n	　　exit(0);</p>\r\n<p>\r\n	　　?&gt;</p>\r\n<p>\r\n	　　注：用其它语言实现这个脚本也是OK的，最后别忘了给脚本加上可执行属性。</p>\r\n<p>\r\n	　　如果要测试效果的话，可以kill掉当前的MySQL主服务器，稍等片刻，MHA就会把某台MySQL从服务器提升为新的MySQL主服务器，并调用master_ip_failover_script脚本，如上所示，我们在master_ip_failover_script脚本里可以把新的MySQL主服务器的ip和port信息持久化到配置文件里，这样应用就可以使用新的配置了。</p>\r\n<p>\r\n	　　有时候需要手动切换MySQL主服务器，可以使用masterha_master_switch命令，不过它调用的不是master_ip_failover_script脚本，而是master_ip_online_change_script脚本，但调用参数类似，脚本可以互用。</p>\r\n<p>\r\n	　　shell&gt; masterha_master_switch --conf=/etc/masterha_application.cnf --master_state=dead --dead_master_host=...</p>\r\n<p>\r\n	　　shell&gt; masterha_master_switch --conf=/etc/masterha_application.cnf --master_state=alive --new_master_host=...</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　注：针对原来的MySQL主服务器是否已经宕机，执行命令所需的参数有所不同。</p>\r\n<p>\r\n	　　需要说明的是，如果MHA检测到MySQL主服务器连续发生宕机，且两次宕机时间间隔不足八小时的话，则不会进行Failover，之所以这样限制是为了避免ping-pong效应。不过为了自动化，我们往往希望能取消这种限制，此时可以用如下方式启动Manager：</p>\r\n<p>\r\n	　　shell&gt; nohup masterha_manager --conf=/etc/masterha_application.cnf --ignore_last_failover --remove_dead_master_conf &amp;</p>\r\n<p>\r\n	&nbsp;</p>\r\n<p>\r\n	　　注：请确保Manager的运行用户对masterha_application.cnf有写权限。</p>\r\n<p>\r\n	　　&hellip;</p>\r\n<p>\r\n	　　本文只是MHA的一个简要介绍，至于详细说明，建议大家阅读官方文档。</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-20 00:40:50', 0, 1),
(35, 2, 'Apache HTTP 服务器 2010年高歌猛进！', 'admin', '<p>\r\n	全世界的Web服务都离不开Web服务器，而Apache占据这山头很长时间了。尽管近年Apache服务器的市场份额有所下滑，2010年她又回来了。 观察前5名Web服务器，你会发现，2010年，毫无疑问，是Apache的大年! 2010年Web增长 再分析各个Web服务器之前，我们先来看看2</p>\r\n', '<p>\r\n	全世界的Web服务都离不开Web服务器，而Apache占据这山头很长时间了。尽管近年Apache服务器的市场份额有所下滑，2010年她又回来了。</p>\r\n<p>\r\n	　　观察前5名Web服务器，你会发现，2010年，毫无疑问，是Apache的大年!</p>\r\n<p>\r\n	　　2010年Web增长</p>\r\n<p>\r\n	　　再分析各个Web服务器之前，我们先来看看2010年Web的变化，下面是来自Netcraft的几个关键的调查数据：</p>\r\n<p>\r\n	　　截止2010年底，互联网上有2.55亿站点;</p>\r\n<p>\r\n	　　对比2009年，增长了9%，增加了2140万个站点。</p>\r\n<p>\r\n	　　Web持续的快速增长，这将可能是个超过3000万或是更高的数字，如果不是去年的统计数据里面包括的QQ的博客。</p>\r\n<p>\r\n	　　2010年Web服务器增长</p>\r\n<p>\r\n	　　Web服务器的使用率的变化，如下：</p>\r\n<p>\r\n	　　Apache 2009年托管1.09亿个站点，而2010年数字变成了1.52亿。</p>\r\n<p>\r\n	　　Net result: 2010年，增加大约4300万新的Apache网站。</p>\r\n<p>\r\n	　　Microsoft IIS 2009年托管4900万个站点，2010年是5700万。</p>\r\n<p>\r\n	　　Net result: 2010年，大约新增800万个IIS网站。</p>\r\n<p>\r\n	　　Nginx 没有2009年风光了，从1620万，增加到2010年的1690万。</p>\r\n<p>\r\n	　　Google&rsquo;s web server (最初服务博客) 从1410万，增加到2010年的1490万。</p>\r\n<p>\r\n	　　Lighttpd 从84万，增加到130万。</p>\r\n<p>\r\n	　　2010年市场变化</p>\r\n<p>\r\n	　　根据上述数据，下面是2010年的市场份额变化：</p>\r\n<p>\r\n	　　Apache 从46.6%到59.4%，收获12.8%。</p>\r\n<p>\r\n	　　Microsoft IIS 从21.0%到22.2%，收获1.2%。</p>\r\n<p>\r\n	　　Nginx 从6.6%到7.0%。</p>\r\n<p>\r\n	　　Google&rsquo;s web server 从6.0%到5.9%。</p>\r\n<p>\r\n	　　Lighttpd 从0.4%到0.5%。</p>\r\n<p>\r\n	　　结论：Apache的成功，也是开源的成功，如无意外发生，Apache将继续独领风骚!</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-19 18:28:22', 0, 1),
(36, 2, '简单分享apache 封 IP 的方法', 'admin', '<div class="digest">\r\n	最简单的方法是从Apache里封(如果你是用Apache当服务器的话)。你既可以在httpd.conf配置文件里设置，又可以在.htaccess里设置。说明如下： 1. 在配置文件里设置： 打开httpd.conf编辑，将下列block如下编辑: [代码] httpd.conf Directory /var/www/html Opti</div>\r\n', '<p>\r\n	最简单的方法是从Apache里封(如果你是用Apache当服务器的话)。你既可以在httpd.conf配置文件里设置，又可以在.htaccess里设置。说明如下：</p>\r\n<p>\r\n	　　1. 在配置文件里设置：</p>\r\n<p>\r\n	　　打开httpd.conf编辑，将下列block如下编辑:</p>\r\n<p>\r\n	　　[代码] httpd.conf</p>\r\n<p>\r\n	&nbsp;</p>\r\n<pre>\r\n</pre>\r\n<ol class="dp-xml">\r\n	<li class="alt">\r\n		<span><span class="tag">&lt;</span><span class="tag-name">Directory</span><span>&nbsp;&ldquo;/var/www/html&rdquo;</span><span class="tag">&gt;</span><span>&nbsp;</span></span></li>\r\n	<li>\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;Options&nbsp;Indexes&nbsp;FollowSymLinks &nbsp;</span></li>\r\n	<li class="alt">\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;AllowOverride&nbsp;None &nbsp;</span></li>\r\n	<li>\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;Order&nbsp;allow,deny &nbsp;</span></li>\r\n	<li class="alt">\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;Allow&nbsp;from&nbsp;all &nbsp;</span></li>\r\n	<li>\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;Deny&nbsp;from&nbsp;124.114.0. &nbsp;</span></li>\r\n	<li class="alt">\r\n		<span>&nbsp;&nbsp;&nbsp;&nbsp;Deny&nbsp;from&nbsp;124.115.0. &nbsp;</span></li>\r\n	<li>\r\n		<span class="tag">&lt;/</span><span class="tag-name">Directory</span><span class="tag">&gt;</span><span>&nbsp;</span></li>\r\n</ol>\r\n<p>\r\n	　　[代码] .htaccess文件法(在网站根目录下建立或打开.htaccess文件，加入如下内容)</p>\r\n<p>\r\n	&nbsp;</p>\r\n<pre>\r\n</pre>\r\n<ol class="dp-xml">\r\n	<li class="alt">\r\n		<span><span>Order&nbsp;allow,deny &nbsp;</span></span></li>\r\n	<li>\r\n		<span>Allow&nbsp;from&nbsp;all &nbsp;</span></li>\r\n	<li class="alt">\r\n		<span>Deny&nbsp;from&nbsp;124.114.0. &nbsp;</span></li>\r\n	<li>\r\n		<span>Deny&nbsp;from&nbsp;124.115.0.&nbsp;</span></li>\r\n</ol>\r\n', '2011-12-19 18:30:59', 0, 1),
(37, 1, '谷歌发布apache加速模块 提速50%', 'admin', '<div class="digest">\r\n	大多人浏览网页如果超过3秒打不开就会离开,Google为此推出了一款Apache加速模块：mod_pagespeed，该模块可以有效将网页加载速度提高50%。网页提速的问题是一个复杂多样的问题，有很多解决方法,往往关系到网站系统程序，服务器硬件，网络传输速度等方面，而Go</div>\r\n', '<p>\r\n	大多人浏览网页如果超过3秒打不开就会离开,Google为此推出了一款Apache加速模块：mod_pagespeed，该模块可以有效将网页加载速度提高50%。网页提速的问题是一个复杂多样的问题，有很多解决方法,往往关系到网站系统程序，服务器硬件，网络传输速度等方面，而Google这款加速模块简单的解决了许多复情况的问题：</p>\r\n<p>\r\n	　　◆如果你的网站采用Apache构建服务器，不需要对网站CMS系统进行处理即可应用;</p>\r\n<p>\r\n	　　◆加速模块可以自行对网络传输的HTML字节优化及对图象,CSS进入压缩优化传输;</p>\r\n<p>\r\n	　　◆智能缓存是一大亮点，它可以自动智能缓存,加速下载。</p>\r\n<p>\r\n	　　下面介绍一下所有特点功能：</p>\r\n<p>\r\n	　　◆优化缓存</p>\r\n<p>\r\n	　　◆缓存扩展</p>\r\n<p>\r\n	　　◆压缩处理CSS</p>\r\n<p>\r\n	　　◆优化JavaScript最大限度的减少重复请求</p>\r\n<p>\r\n	　　◆自动缓存CSS</p>\r\n<p>\r\n	　　◆JavaScript内嵌技术</p>\r\n<p>\r\n	　　◆有效载荷尺寸最小化</p>\r\n<p>\r\n	　　◆压缩空白</p>\r\n<p>\r\n	　　◆合并头信息</p>\r\n<p>\r\n	　　◆附加属性</p>\r\n<p>\r\n	　　◆内建核心JavaScript</p>\r\n<p>\r\n	　　◆优化图像下载</p>\r\n<p>\r\n	　　◆跳地非法字符</p>\r\n<p>\r\n	　　◆重写优化CSS</p>\r\n<p>\r\n	　　Google官方文档说明：http://code.google.com/intl/zh-CN/speed/page-speed/docs/module.html</p>\r\n<p>\r\n	　　Google官方下载地址：http://code.google.com/intl/zh-CN/speed/page-speed/download.html</p>\r\n<p>\r\n	<!--内容关联投票--></p>\r\n', '2011-12-19 18:33:31', 0, 1);

-- --------------------------------------------------------

--
-- 表的结构 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `userId` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(20) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `ip` varchar(30) DEFAULT '',
  `times` int(11) NOT NULL DEFAULT '0',
  `lasttime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`userId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
