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

<channel>
	<title>奔向远方 &#187; Web技术</title>
	<atom:link href="http://www.tisswb.com/archives/category/web-technology/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tisswb.com</link>
	<description>结婚开始倒计时了，高兴~</description>
	<lastBuildDate>Tue, 19 Jul 2011 09:30:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>php编译参数的含义</title>
		<link>http://www.tisswb.com/archives/576.html</link>
		<comments>http://www.tisswb.com/archives/576.html#comments</comments>
		<pubDate>Sat, 31 Jul 2010 16:42:44 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=576</guid>
		<description><![CDATA[今天整理编译php的时候的参数，在网上搜集了一些关于configure参数的资料：
./configure
&#8211;prefix=/usr/local/php                                   php 安装目录
&#8211;with-apxs2=/usr/local/apache/bin/apxs
&#8211;with-config-file-path=/usr/local/php/etc               指定php.ini位置
&#8211;with-mysql=/usr/local/mysql                        mysql安装目录，对mysql的支持
&#8211;with-mysqli=/usr/local/mysql/bin/mysql_config            mysqli文件目录,优化支持
<span class="readmore"><a href="http://www.tisswb.com/archives/576.html" title="php编译参数的含义" target="_blank">阅读全文——共2772字</a></span>]]></description>
			<content:encoded><![CDATA[<p>今天整理编译php的时候的参数，在网上搜集了一些关于configure参数的资料：</p>
<p>./configure</p>
<p>&#8211;prefix=/usr/local/php                                   <a target="_self"><strong>php</strong> </a>安装目录<br />
&#8211;with-apxs2=/usr/local/apache/bin/apxs<br />
&#8211;with-config-file-path=/usr/local/php/etc               指定php.ini位置<br />
&#8211;with-mysql=/usr/local/mysql                        mysql安装目录，对mysql的支持<br />
&#8211;with-mysqli=/usr/local/mysql/bin/mysql_config            mysqli文件目录,优化支持<br />
&#8211;enable-safe-mode                              打开安全模式<br />
&#8211;enable-ftp                                 打开ftp的支持<br />
&#8211;enable-zip                                 打开对zip的支持<br />
&#8211;with-bz2                                    打开对bz2文件的支持                        <br />
&#8211;with-jpeg-dir                                 打开对jpeg图片的支持<br />
&#8211;with-png-dir                                 打开对png图片的支持<br />
&#8211;with-freetype-dir                              打开对freetype字体库的支持<br />
&#8211;without-iconv                                 关闭iconv函数，种字符集间的转换<br />
&#8211;with-libxml-dir                                 打开libxml2库的支持<br />
&#8211;with-xmlrpc                                 打开xml-rpc的c语言<br />
&#8211;with-zlib-dir                                 打开zlib库的支持<br />
&#8211;with-gd                                    打开gd库的支持<br />
&#8211;enable-gd-native-ttf                           支持TrueType字符串函数库<br />
&#8211;with-curl                                    打开curl浏览工具的支持<br />
&#8211;with-curlwrappers                              运用curl工具打开url流<br />
&#8211;with-ttf                                    打开freetype1.*的支持，可以不加了<br />
&#8211;with-xsl                                     打开XSLT 文件支持，扩展了libxml2库 ，需要libxslt软件<br />
&#8211;with-gettext                                 打开gnu 的gettext 支持，编码库用到<br />
&#8211;with-pear                      打开pear命令的支持，php扩展用的<br />
&#8211;enable-calendar                  打开日历扩展功能<br />
&#8211;enable-mbstring                  多字节，字符串的支持<br />
&#8211;enable-bcmath                  打开图片大小调整,用到zabbix监控的时候用到了这个模块<br />
&#8211;enable-sockets                  打开 sockets 支持<br />
&#8211;enable-exif                      图片的元数据支持<br />
&#8211;enable-magic-quotes               魔术引用的支持<br />
&#8211;disable-rpath                     关闭额外的运行库文件<br />
&#8211;disable-debug                  关闭调试模式<br />
&#8211;with-mime-magic=/usr/share/file/magic.mime      魔术头文件位置</p>
<p>cgi方式安装才用的<a target="_self"><strong>参数</strong> </a><br />
&#8211;enable-fpm                     打上php-fpm 补丁后才有这个参数，cgi方式安装的启动程序<br />
&#8211;enable-fastcgi                  支持fastcgi方式启动php<br />
&#8211;enable-force-cgi-redirect             同上 ,帮助里没有解释<br />
&#8211;with-ncurses                     支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库<br />
&#8211;enable-pcntl                     freeTDS需要用到的，可能是链接mssql 才用到</p>
<p>mhash和mcrypt算法的扩展<br />
&#8211;with-mcrypt                     算法<br />
&#8211;with-mhash                     算法</p>
<p>&#8211;with-gmp<br />
&#8211;enable-inline-optimization<br />
&#8211;with-openssl                     openssl的支持，加密传输时用到的<br />
&#8211;enable-dbase<br />
&#8211;with-pcre-dir=/usr/local/bin/pcre-config      perl的正则库案安装位置<br />
&#8211;disable-dmalloc<br />
&#8211;with-gdbm                     dba的gdbm支持<br />
&#8211;enable-sigchild<br />
&#8211;enable-sysvsem<br />
&#8211;enable-sysvshm<br />
&#8211;enable-zend-multibyte               支持zend的多字节<br />
&#8211;enable-mbregex<br />
&#8211;enable-wddx<br />
&#8211;enable-shmop<br />
&#8211;enable-soap</p>
<p>来源：<a href="http://nedvedheqing.javaeye.com/blog/545632">http://nedvedheqing.javaeye.com/blog/545632</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/576.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP中$_SERVER的详细参数与说明</title>
		<link>http://www.tisswb.com/archives/560.html</link>
		<comments>http://www.tisswb.com/archives/560.html#comments</comments>
		<pubDate>Thu, 27 May 2010 13:54:51 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=560</guid>
		<description><![CDATA[最近经常用到PHP的$_SERVER常量，都是零零碎碎的随用随查，今天整理一下，并且把$_SERVER的详细参数及说明整理一下：
$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名，与 document root相关。
$_SERVER['argv'] #传递给该脚本的参数。
$_SERVER['argc'] #包含传递给程序的命令行参数的个数（如果运行在命令行模式）。
$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如，“CGI/1.1”。
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。
$_SERVER['SERVER_SOFTWARE'] #服务器标识的字串，在响应请求时的头部中给出。
$_SERVER['SERVER_PROTOCOL'] #请求页面时通信协议的名称和版本。例如，“HTTP/1.0”。
<span class="readmore"><a href="http://www.tisswb.com/archives/560.html" title="PHP中$_SERVER的详细参数与说明" target="_blank">阅读全文——共1706字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近经常用到PHP的$_SERVER常量，都是零零碎碎的随用随查，今天整理一下，并且把$_SERVER的详细参数及说明整理一下：</p>
<p><code>$_SERVER['PHP_SELF'] #当前正在执行脚本的文件名，与 document root相关。<br />
$_SERVER['argv'] #传递给该脚本的参数。<br />
$_SERVER['argc'] #包含传递给程序的命令行参数的个数（如果运行在命令行模式）。<br />
$_SERVER['GATEWAY_INTERFACE'] #服务器使用的 CGI 规范的版本。例如，“CGI/1.1”。<br />
$_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称。<br />
$_SERVER['SERVER_SOFTWARE'] #服务器标识的字串，在响应请求时的头部中给出。<br />
$_SERVER['SERVER_PROTOCOL'] #请求页面时通信协议的名称和版本。例如，“HTTP/1.0”。<br />
$_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如：“GET”、“HEAD”，“POST”，“PUT”。<br />
$_SERVER['QUERY_STRING'] #查询(query)的字符串。<br />
$_SERVER['DOCUMENT_ROOT'] #当前运行脚本所在的文档根目录。在服务器配置文件中定义。<br />
$_SERVER['HTTP_ACCEPT'] #当前请求的 Accept: 头部的内容。<br />
$_SERVER['HTTP_ACCEPT_CHARSET'] #当前请求的 Accept-Charset: 头部的内容。例如：“iso-8859-1,*,utf-8”。<br />
$_SERVER['HTTP_ACCEPT_ENCODING'] #当前请求的 Accept-Encoding: 头部的内容。例如：“gzip”。<br />
$_SERVER['HTTP_ACCEPT_LANGUAGE']#当前请求的 Accept-Language: 头部的内容。例如：“en”。<br />
$_SERVER['HTTP_CONNECTION'] #当前请求的 Connection: 头部的内容。例如：“Keep-Alive”。<br />
$_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容。<br />
$_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址。<br />
$_SERVER['HTTP_USER_AGENT'] #当前请求的 User_Agent: 头部的内容。<br />
$_SERVER['HTTPS'] — 如果通过https访问,则被设为一个非空的值(on)，否则返回off<br />
$_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址。<br />
$_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名。<br />
$_SERVER['REMOTE_PORT'] #用户连接到服务器时所使用的端口。<br />
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。<br />
$_SERVER['SERVER_ADMIN'] #管理员信息<br />
$_SERVER['SERVER_PORT'] #服务器所使用的端口<br />
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。<br />
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统（不是文档根目录）的基本路径。<br />
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。<br />
$_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如，“/index.html”。<br />
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的用户名。<br />
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的密码。<br />
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是认证的类型。</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/560.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>centos中mysql重置密码</title>
		<link>http://www.tisswb.com/archives/552.html</link>
		<comments>http://www.tisswb.com/archives/552.html#comments</comments>
		<pubDate>Wed, 10 Feb 2010 04:26:33 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[CentOS]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=552</guid>
		<description><![CDATA[mysql YUM 安装路径rpm -ql mysql (usr/bin)
方法：
# /etc/init.d/mysqld stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &#38;
# mysql -u root mysql
mysql&#62; UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
mysql&#62; FLUSH PRIVILEGES;
mysql&#62; quit
# /etc/init.d/mysqld restart
# mysql -uroot -p
]]></description>
			<content:encoded><![CDATA[<p>mysql YUM 安装路径rpm -ql mysql (usr/bin)</p>
<h3 title="转载">方法：</h3>
<p><code># /etc/init.d/mysqld stop<br />
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &amp;<br />
# mysql -u root mysql<br />
mysql&gt; UPDATE user SET Password=PASSWORD('newpassword') where USER='root';<br />
mysql&gt; FLUSH PRIVILEGES;<br />
mysql&gt; quit<br />
# /etc/init.d/mysqld restart<br />
# mysql -uroot -p</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/552.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql中int、bigint、smallint 和 tinyint的区别</title>
		<link>http://www.tisswb.com/archives/550.html</link>
		<comments>http://www.tisswb.com/archives/550.html#comments</comments>
		<pubDate>Mon, 08 Feb 2010 14:11:11 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web技术]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=550</guid>
		<description><![CDATA[最近使用mysql数据库的时候遇到了多种数字的类型，主要有int,bigint,smallint和tinyint。其中比较迷惑的是int和smallint的差别。今天就在网上仔细找了找，找到如下内容，留档做个总结：
使用整数数据的精确数字数据类型。
bigint
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据（所有数字）。存储大小为 8 个字节。
int
从 -2^31 (-2,147,483,648) 到 2^31 &#8211; 1 (2,147,483,647) 的整型数据（所有数字）。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。
smallint
从 -2^15 (-32,768) 到 2^15 &#8211; 1 (32,767) 的整型数据。存储大小为 2 个字节。
<span class="readmore"><a href="http://www.tisswb.com/archives/550.html" title="mysql中int、bigint、smallint 和 tinyint的区别" target="_blank">阅读全文——共609字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近使用mysql数据库的时候遇到了多种数字的类型，主要有int,bigint,smallint和tinyint。其中比较迷惑的是int和smallint的差别。今天就在网上仔细找了找，找到如下内容，留档做个总结：</p>
<p>使用整数数据的精确数字数据类型。</p>
<p><strong>bigint</strong></p>
<p>从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据（所有数字）。存储大小为 8 个字节。</p>
<p><strong>int</strong></p>
<p>从 -2^31 (-2,147,483,648) 到 2^31 &#8211; 1 (2,147,483,647) 的整型数据（所有数字）。存储大小为 4 个字节。<strong>int </strong>的 SQL-92 同义字为 <strong>integer</strong>。</p>
<p><strong>smallint</strong></p>
<p>从 -2^15 (-32,768) 到 2^15 &#8211; 1 (32,767) 的整型数据。存储大小为 2 个字节。</p>
<p><strong>tinyint</strong></p>
<p>从 0 到 255 的整型数据。存储大小为 1 字节。</p>
<h5>注释</h5>
<p>在支持整数值的地方支持 <strong>bigint</strong> 数据类型。但是，<strong>bigint</strong> 用于某些特殊的情况，当整数值超过 <strong>int</strong> 数据类型支持的范围时，就可以采用 <strong>bigint</strong>。在 SQL Server 中，<strong>int</strong> 数据类型是主要的整数数据类型。</p>
<p>在数据类型优先次序表中，<strong>bigint</strong> 位于 <strong>smallmoney</strong> 和 <strong>int</strong> 之间。</p>
<p>只有当参数表达式是 <strong>bigint</strong> 数据类型时，函数才返回 <strong>bigint</strong>。SQL Server 不会自动将其它整数数据类型（<strong>tinyint</strong>、<strong>smallint</strong> 和 <strong>int</strong>）提升为 <strong>bigint</strong>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/550.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用例子说明inner join,left join,right join,full join的区别</title>
		<link>http://www.tisswb.com/archives/545.html</link>
		<comments>http://www.tisswb.com/archives/545.html#comments</comments>
		<pubDate>Mon, 28 Dec 2009 07:54:36 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[SQL优化]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=545</guid>
		<description><![CDATA[最近论坛的数据超过了1600万了，时不时的出现访问速度超慢的情况，虽然不是出现频率很多，但也很影响论坛的正常运行。今天终于抽出一些时间来优化一下，经过分析，发现主要是在一个更新主贴回帖数的语句上出现了问题，因为我们的论坛是从dvbbs转过来的，所以当时这个语句做过调整，原来的语句是
SELECT count(*) FROM cdb_posts AS p LEFT JOIN cdb_members AS m ON p.authorid = m.uid WHERE p.tid = '1213675' AND p.invisible = '0' AND p.fid NOT IN (444,92) AND m.uid IS NOT NULL
发现效率真的很差，经常要执行10秒左右，于是现学现卖，抓紧学知识，首先是加索引，效果不错问题解决了。但是我还是想优化一下这个语句。因为这里面的left join一直以来概念模糊，只知道人家用我也用。今天到网上仔细找了找资料学习了一番，把这个语句改成了
<span class="readmore"><a href="http://www.tisswb.com/archives/545.html" title="用例子说明inner join,left join,right join,full join的区别" target="_blank">阅读全文——共1414字</a></span>]]></description>
			<content:encoded><![CDATA[<p>最近论坛的数据超过了1600万了，时不时的出现访问速度超慢的情况，虽然不是出现频率很多，但也很影响论坛的正常运行。今天终于抽出一些时间来优化一下，经过分析，发现主要是在一个更新主贴回帖数的语句上出现了问题，因为我们的论坛是从dvbbs转过来的，所以当时这个语句做过调整，原来的语句是</p>
<p><code>SELECT count(*) FROM cdb_posts AS p LEFT JOIN cdb_members AS m ON p.authorid = m.uid WHERE p.tid = '1213675' AND p.invisible = '0' AND p.fid NOT IN (444,92) AND m.uid IS NOT NULL</code></p>
<p>发现效率真的很差，经常要执行10秒左右，于是现学现卖，抓紧学知识，首先是加索引，效果不错问题解决了。但是我还是想优化一下这个语句。因为这里面的left join一直以来概念模糊，只知道人家用我也用。今天到网上仔细找了找资料学习了一番，把这个语句改成了</p>
<p><code>SELECT count(*) FROM cdb_posts AS p INNER JOIN cdb_members AS m ON p.authorid = m.uid WHERE p.tid = '1213675' AND p.invisible = '0' AND p.fid NOT IN (444,92)</code></p>
<p>下面总结一下inner join,left join,right join,full join的区别</p>
<p>[TEST@ORA1] SQL&gt;select * from a;</p>
<p>编号 姓名<br />
&#8212;- &#8212;&#8212;&#8212;-<br />
1000 张三<br />
2000 李四<br />
3000 王五</p>
<p>[TEST@ORA1] SQL&gt;select * from b;</p>
<p>编号 商品<br />
&#8212;- &#8212;&#8212;&#8212;-<br />
1000 电视机<br />
2000 录像机<br />
4000 自行车</p>
<p>[TEST@ORA1] SQL&gt;set null 空值&#8211;这里为了显示方面我把NULL定义成了[空值]</p>
<p>[TEST@ORA1] SQL&gt;select a.*,b.* from a inner join b on a.编号=b.编号;</p>
<p>编号 姓名       编号 商品<br />
&#8212;- &#8212;&#8212;&#8212;- &#8212;- &#8212;&#8212;&#8212;-<br />
1000 张三       1000 电视机<br />
2000 李四       2000 录像机</p>
<p>[TEST@ORA1] SQL&gt;select a.*,b.* from a left join b on a.编号=b.编号;</p>
<p>编号 姓名       编号 商品<br />
&#8212;- &#8212;&#8212;&#8212;- &#8212;- &#8212;&#8212;&#8212;-<br />
1000 张三       1000 电视机<br />
2000 李四       2000 录像机<br />
3000 王五       空值 空值</p>
<p>[TEST@ORA1] SQL&gt;select a.*,b.* from a right join b on a.编号=b.编号;</p>
<p>编号 姓名       编号 商品<br />
&#8212;- &#8212;&#8212;&#8212;- &#8212;- &#8212;&#8212;&#8212;-<br />
1000 张三       1000 电视机<br />
2000 李四       2000 录像机<br />
空值 空值       4000 自行车</p>
<p>[TEST@ORA1] SQL&gt;select a.*,b.* from a full join b on a.编号=b.编号;</p>
<p>编号 姓名       编号 商品<br />
&#8212;- &#8212;&#8212;&#8212;- &#8212;- &#8212;&#8212;&#8212;-<br />
1000 张三       1000 电视机<br />
2000 李四       2000 录像机<br />
3000 王五       空值 空值<br />
空值 空值       4000 自行车</p>
<p>================================</p>
<p>看例子就一目了然啦。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/545.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在ubuntu9.04下安装ZendStudio7.0详解</title>
		<link>http://www.tisswb.com/archives/517.html</link>
		<comments>http://www.tisswb.com/archives/517.html#comments</comments>
		<pubDate>Sun, 16 Aug 2009 14:31:39 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[Linux/Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[服务器]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[ZendStudio]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=517</guid>
		<description><![CDATA[ZendStudio7绝对是php编辑的神器，最近一段时间使用的是不亦乐乎。但是最近工作环境转移到了Ubuntu上了，还是相当希望能够使用ZS7。当然，zend公司还是给我们提供了linux下的安装文件了，由于是初次在linux下面安装ZendStudio7，下面记录一下安装步骤细节，以备以后查阅：
1.下载zendstudio的linux版本，我下载的地址是：http://downloads.zend.com/studio-eclipse/7.0.0/ZendStudio-7.0.0.tar.gz
2.安装支持环境，zendstudio7需要jre支持，所以需要安装一下
sudo apt-get instll sun-java6-jre sun-java6-jdk
3.解压缩ZendStudio7的压缩包，把内容解压缩到个人的home目录中，解压缩出来的文件是一个叫ZendStudio7_0_0.bin的文件
<span class="readmore"><a href="http://www.tisswb.com/archives/517.html" title="在ubuntu9.04下安装ZendStudio7.0详解" target="_blank">阅读全文——共511字</a></span>]]></description>
			<content:encoded><![CDATA[<p>ZendStudio7绝对是php编辑的神器，最近一段时间使用的是不亦乐乎。但是最近工作环境转移到了Ubuntu上了，还是相当希望能够使用ZS7。当然，zend公司还是给我们提供了linux下的安装文件了，由于是初次在linux下面安装ZendStudio7，下面记录一下安装步骤细节，以备以后查阅：</p>
<p>1.下载zendstudio的linux版本，我下载的地址是：<a title="zendstudio7的官方下载地址" href="http://downloads.zend.com/studio-eclipse/7.0.0/ZendStudio-7.0.0.tar.gz">http://downloads.zend.com/studio-eclipse/7.0.0/ZendStudio-7.0.0.tar.gz</a></p>
<p>2.安装支持环境，zendstudio7需要jre支持，所以需要安装一下<br />
<code>sudo apt-get instll sun-java6-jre sun-java6-jd</code>k</p>
<p>3.解压缩ZendStudio7的压缩包，把内容解压缩到个人的home目录中，解压缩出来的文件是一个叫ZendStudio7_0_0.bin的文件</p>
<p>4.使用如下命令安装这个bin文件<br />
<code>./ZendStudio7_0_0.bin</code></p>
<p>5.再往后的安装步骤就跟在window下面安装一样了，一直点下一步就可以了</p>
<p>安装完成后的配置也跟windows下面的一样了，这里我就不多说了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/517.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Discuz7和jQuery冲突的解决方法</title>
		<link>http://www.tisswb.com/archives/511.html</link>
		<comments>http://www.tisswb.com/archives/511.html#comments</comments>
		<pubDate>Sun, 28 Jun 2009 03:32:33 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=511</guid>
		<description><![CDATA[discuz是个好程序，但是与其他好东西的兼容性就有点差了，最近开发disczu7的辅助功能组件的时候，想用jquery，就遇到了大问题了，有时候能用，有时候不能用，我就纳闷了，于是查了一上午，发现是jquery与discuz的common.js存在兼容性冲突，头疼啊，在网上找了个解决方法，还是不错的原文如下：
Discuz和jQuery的冲突有两点，在/include/javascript/common.js文件的57~64之间有如下代码：
Array.prototype.push = function(value) {
    this[this.length] = value;
    return this.length;
}
function $(id) {
    return document.getElementById(id);
}
Discuz为了兼容低版本的IE，重写了Array对象的push方法，但在重写之前没有做任何判断，有点太XX了~，改为一下形式：
<span class="readmore"><a href="http://www.tisswb.com/archives/511.html" title="Discuz7和jQuery冲突的解决方法" target="_blank">阅读全文——共912字</a></span>]]></description>
			<content:encoded><![CDATA[<p>discuz是个好程序，但是与其他好东西的兼容性就有点差了，最近开发disczu7的辅助功能组件的时候，想用jquery，就遇到了大问题了，有时候能用，有时候不能用，我就纳闷了，于是查了一上午，发现是jquery与discuz的common.js存在兼容性冲突，头疼啊，在网上找了个解决方法，还是不错的原文如下：</p>
<p>Discuz和jQuery的冲突有两点，在/include/javascript/common.js文件的57~64之间有如下代码：</p>
<p>Array.prototype.push = function(value) {<br />
    this[this.length] = value;<br />
    return this.length;<br />
}</p>
<p>function $(id) {<br />
    return document.getElementById(id);<br />
}</p>
<p>Discuz为了兼容低版本的IE，重写了Array对象的push方法，但在重写之前没有做任何判断，有点太XX了~，改为一下形式：</p>
<p>if(typeof Array.prototype.push === &#8216;undefined&#8217;) {<br />
    Array.prototype.push = function(value) {<br />
        this[this.length] = value;<br />
        return this.length;<br />
    }<br />
}</p>
<p>第二点就是Discuz也有$()函数，就只是为了实现getElementById？功能没有人家强大就别学人家用美元符号嘛，占用符号资源。应该学学百度，人家就用一个字符G，多低调不和别人争美元。<br />
关于$()函数的冲突，jQuery中给出了解决方法，jQuery.noConflict()，把美元让给你（看看人家多大肚）。</p>
<p>我们的jQuery代码可以这样写：</p>
<p>var jq = jQuery.noConflict(); //把$让给第一个实现它的库，用jq代替<br />
jq(function()<br />
{<br />
//**********************<br />
}<br />
);</p>
<p>这样就完美解决了两者的冲突</p>
<p>原文：<a href="http://hi.baidu.com/mimimo/blog/item/2840768dd7048915b31bbadb.html">http://hi.baidu.com/mimimo/blog/item/2840768dd7048915b31bbadb.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/511.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php单引号和双引号的区别</title>
		<link>http://www.tisswb.com/archives/505.html</link>
		<comments>http://www.tisswb.com/archives/505.html#comments</comments>
		<pubDate>Tue, 26 May 2009 06:39:03 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=505</guid>
		<description><![CDATA[平时很少注意到这个细节，一直以为PHP中单引号和双引号是互通的，直到有一天，发现单引号和双引号确实存在区别的时候，就仔细研究了一下，有了下面这段文字。
&#8221; &#8221; 双引号里面的字段会经过编译器解释，然后再当作HTML代码输出。
&#8216; &#8216; 单引号里面的不进行解释，直接输出。
从字面意思上就可以看出，单引号比双引号要快了。
例如：
$abc=&#8217;my name is tome&#8217;;
echo $abc //结果是:my name is tom
echo &#8216;$abc&#8217; //结果是:$abc
echo &#8220;$abc&#8221; //结果是:my name is tom
特别在使用MYSQL语句的时候，双引号和单引号的用法让新手不知所措，在这里，举个例子，来进行说明。
<span class="readmore"><a href="http://www.tisswb.com/archives/505.html" title="php单引号和双引号的区别" target="_blank">阅读全文——共957字</a></span>]]></description>
			<content:encoded><![CDATA[<p>平时很少注意到这个细节，一直以为PHP中单引号和双引号是互通的，直到有一天，发现单引号和双引号确实存在区别的时候，就仔细研究了一下，有了下面这段文字。</p>
<p>&#8221; &#8221; 双引号里面的字段会经过编译器解释，然后再当作HTML代码输出。</p>
<p>&#8216; &#8216; 单引号里面的不进行解释，直接输出。</p>
<p>从字面意思上就可以看出，单引号比双引号要快了。</p>
<p>例如：<br />
$abc=&#8217;my name is tome&#8217;;<br />
echo $abc //结果是:my name is tom<br />
echo &#8216;$abc&#8217; //结果是:$abc<br />
echo &#8220;$abc&#8221; //结果是:my name is tom</p>
<p>特别在使用MYSQL语句的时候，双引号和单引号的用法让新手不知所措，在这里，举个例子，来进行说明。</p>
<p>假设查询条件中使用的是常量，例如：</p>
<p>select    *    from    abc_table where user_name=&#8217;abc&#8217;;</p>
<p>SQL语句可以写成:</p>
<p>SQLstr = &#8220;select    *    from abc_table where user _name= &#8216;abc&#8217;&#8221; ;</p>
<p>假设查询条件中使用的是变量，例如：</p>
<p>$user_name = $_REQUEST['user_name']; //字符串变量</p>
<p>或</p>
<p>$user=array (&#8220;name&#8221;=&gt; $_REQUEST['user_name‘,"age"=&gt;$_REQUEST['age'];//数组变量</p>
<p>SQL语句就可以写成：</p>
<p>SQLstr = &#8220;select    *    from abc_table where user_name = &#8216; &#8221; . $user_name . &#8221; &#8216; &#8220;;</p>
<p>SQLstr = &#8220;select * from abc_table where user_name = &#8216; &#8221; . $user["name"] . &#8221; &#8216; &#8220;;</p>
<p>对比一下:</p>
<p>SQLstr=&#8221;select * from abc_table where user_name = &#8216; abc &#8216; &#8221; ;</p>
<p>SQLstr=&#8221;select * from abc_table where user_name =&#8217; &#8221; . $user _name . &#8221; &#8216; &#8220;;</p>
<p>SQLstr=&#8221;select * from abc_table where user_name =&#8217; &#8221; . $user["name"] . &#8221; &#8216; &#8220;;</p>
<p>SQLstr可以分解为以下3个部分:<br />
1：&#8221;select * from table where user_name = &#8216; &#8221; //固定SQL语句<br />
2：$user //变量<br />
3：&#8221; &#8216; &#8221;<br />
1,2,3部分字符串之间用&#8221;.&#8221; 来连接</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/505.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中file_get_contents函数超时的几种解决方法</title>
		<link>http://www.tisswb.com/archives/498.html</link>
		<comments>http://www.tisswb.com/archives/498.html#comments</comments>
		<pubDate>Sun, 24 May 2009 17:33:01 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=498</guid>
		<description><![CDATA[在使用file_get_contents函数的时候，经常会出现超时的情况，在这里要通过查看一下错误提示，看看是哪种错误，比较常见的是读取超时，这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种：
一、增加超时的时间限制
这里需要注意：set_time_limit只是设置你的PHP程序的超时时间，而不是file_get_contents函数读取URL的超时时间。
我一开始以为set_time_limit也能影响到file_get_contents，后来经测试，是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数：
$opts = array(
'http'=>array(
'method'=>"GET",
'timeout'=>60,
)
); 
<span class="readmore"><a href="http://www.tisswb.com/archives/498.html" title="PHP中file_get_contents函数超时的几种解决方法" target="_blank">阅读全文——共683字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在使用file_get_contents函数的时候，经常会出现超时的情况，在这里要通过查看一下错误提示，看看是哪种错误，比较常见的是读取超时，这种情况大家可以通过一些方法来尽量的避免或者解决。这里就简单介绍两种：</p>
<p>一、增加超时的时间限制</p>
<p>这里需要注意：set_time_limit只是设置你的PHP程序的超时时间，而不是file_get_contents函数读取URL的超时时间。<br />
我一开始以为set_time_limit也能影响到file_get_contents，后来经测试，是无效的。真正的修改file_get_contents延时可以用resource $context的timeout参数：</p>
<p><code>$opts = array(<br />
'http'=>array(<br />
'method'=>"GET",<br />
'timeout'=>60,<br />
)<br />
); </p>
<p>$context = stream_context_create($opts); </p>
<p>$html =file_get_contents('http://www.example.com', false, $context);<br />
fpassthru($fp);<br />
</code></p>
<p>二、一次有延时的话那就多试几次</p>
<p>有时候失败是因为网络等因素造成，没有解决办法，但是可以修改程序，失败时重试几次，仍然失败就放弃，因为file_get_contents()如果失败将返回 FALSE，所以可以下面这样编写代码：</p>
<p><code>$cnt=0;<br />
while($cnt < 3 &#038;&#038; ($str=@file_get_contents('http...'))===FALSE) $cnt++; </code></p>
<p>以上只是我搜集整理的一些小技巧，希望能找到更好的技巧。</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/498.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>my.cnf详解及详细翻译</title>
		<link>http://www.tisswb.com/archives/489.html</link>
		<comments>http://www.tisswb.com/archives/489.html#comments</comments>
		<pubDate>Mon, 13 Apr 2009 05:55:29 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web技术]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=489</guid>
		<description><![CDATA[配置详解：
mysqld程序&#8211;目录和文件
basedir = path  使用给定目录作为根目录(安装目录)。
character-sets-dir = path  给出存放着字符集的目录。
datadir = path  从给定目录读取数据库文件。
pid-file = filename  为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。
socket = filename  为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。
在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，&#8211;sock选项给出的将是该命名管道的名字(默认设置是MySQL)。
<span class="readmore"><a href="http://www.tisswb.com/archives/489.html" title="my.cnf详解及详细翻译" target="_blank">阅读全文——共17353字</a></span>]]></description>
			<content:encoded><![CDATA[<h2><strong>配置详解：</strong></h2>
<p><span style="font-size: 10pt;">mysqld程序&#8211;目录和文件<br />
basedir = path  使用给定目录作为根目录(安装目录)。<br />
character-sets-dir = path  给出存放着字符集的目录。<br />
datadir = path  从给定目录读取数据库文件。<br />
pid-file = filename  为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。<br />
socket = filename  为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。<br />
在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，&#8211;sock选项给出的将是该命名管道的名字(默认设置是MySQL)。<br />
lower_case_table_name = 1/0  新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。</p>
<p>mysqld程序&#8211;语言设置<br />
character-sets-server = name  新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容，这个字符集也可以用&#8211;default-character-set选项给出; 但这个选项已经显得有点过时了。<br />
collation-server = name  新数据库或数据表的默认排序方式。<br />
lanuage = name  用指定的语言显示出错信息。</p>
<p>mysqld程序&#8211;通信、网络、信息安全<br />
enable-named-pipes  允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL，但可以用&#8211;socket选项来改变。<br />
local-infile [=0]  允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。<br />
myisam-recover [=opt1, opt2, ...]  在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。<br />
old-passwords  使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。<br />
port = n  为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。<br />
safe-user-create  只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。<br />
shared-memory  允许使用内存(shared memory)进行通信(仅适用于Windows)。<br />
shared-memory-base-name = name  给共享内存块起一个名字(默认的名字是MySQL)。<br />
skip-grant-tables  不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。<br />
skip-host-cache  不使用高速缓存区来存放主机名和IP地址的对应关系。<br />
skip-name-resovle  不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。<br />
skip-networking  只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接，不允许ICP/IP连接; 这提高了安全性，但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。<br />
user = name  mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用&#8211;user=mysql选项来启动mysqld程序。</p>
<p>mysqld程序&#8211;内存管理、优化、查询缓存区<br />
bulk_insert_buffer_size = n  为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。<br />
key_buffer_size = n  用来存放索引区块的RMA值(默认设置是8M)。<br />
join_buffer_size = n  在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。<br />
max_heap_table_size = n  HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。<br />
max_connections = n  MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。<br />
query_cache_limit = n  允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。<br />
query_cache_size = n  查询缓存区的最大长度(默认设置是0，不开辟查询缓存区)。<br />
query_cache_type = 0/1/2  查询缓存区的工作模式:0, 禁用查询缓存区; 1，启用查询缓存区(默认设置); 2，&#8221;按需分配&#8221;模式，只响应SELECT SQL_CACHE命令。<br />
read_buffer_size = n  为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。<br />
read_rnd_buffer_size = n  类似于read_buffer_size选项，但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。<br />
sore_buffer = n  为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小，则必须创建一个临时文件来进行排序。<br />
table_cache = n  同时打开的数据表的数量(默认设置是64)。<br />
tmp_table_size = n  临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。</p>
<p>mysqld程序&#8211;日志<br />
log [= file]  把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。<br />
log-slow-queries [= file]  把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名)。<br />
long_query_time = n  慢查询的执行用时上限(默认设置是10s)。<br />
long_queries_not_using_indexs  把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同&#8211;log-slow-queries选项)。<br />
log-bin [= filename]  把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志，binary update log)。这种日志的文件名是filename.n或默认的hostname.n，其中n是一个6位数字的整数(日志文件按顺序编号)。<br />
log-bin-index = filename  二进制日志功能的索引文件名。在默认情况下，这个索引文件与二进制日志文件的名字相同，但后缀名是.index而不是.nnnnnn。<br />
max_binlog_size = n  二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前，MySQL服务器会自动提供一个新的二进制日志文件接续上。<br />
binlog-do-db = dbname  只把给定数据库里的变化情况记入二进制日志文件，其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况，就必须在配置文件使用多个本选项来设置，每个数据库一行。<br />
binlog-ignore-db = dbname  不把给定数据库里的变化情况记入二进制日志文件。<br />
sync_binlog = n  每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法，但效率最低。默认设置是n=0，意思是由操作系统来负责二进制日志文件的同步工作。<br />
log-update [= file]  记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数，MySQL会使用hostname.err作为种日志文件的名字。</p>
<p>mysqld程序&#8211;镜像(主控镜像服务器)<br />
server-id = n  给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。<br />
log-bin = name  启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n，其中的n是一个6位数字的整数(日志文件顺序编号)。<br />
binlog-do/ignore-db = dbname  只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。</p>
<p>mysqld程序&#8211;镜像(从属镜像服务器)<br />
server-id = n  给服务器分配一个唯一的ID编号<br />
log-slave-updates  启用从属服务器上的日志功能，使这台计算机可以用来构成一个镜像链(A-&gt;B-&gt;C)。<br />
master-host = hostname  主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件)，它将忽略此选项。<br />
master-user = replicusername  从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />
master-password = passwd  从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />
master-port = n  从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。<br />
master-connect-retry = n  如果与主控服务器的连接没有成功，则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件，<br />
它将忽略此选项。<br />
master-ssl-xxx = xxx  对主、从服务器之间的SSL通信进行配置。<br />
read-only = 0/1  0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。<br />
read-log-purge = 0/1  1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。<br />
replicate-do-table = dbname.tablename  与&#8211;replicate-do-table选项的含义和用法相同，但数据库和数据库表名字里允许出现通配符&#8221;%&#8221;<br />
(例如: test%.%&#8211;对名字以&#8221;test&#8221;开头的所有数据库里的所以数据库表进行镜像处理)。<br />
replicate-do-db = name  只对这个数据库进行镜像处理。<br />
replicate-ignore-table = dbname.tablename  不对这个数据表进行镜像处理。<br />
replicate-wild-ignore-table = dbn.tablen  不对这些数据表进行镜像处理。<br />
replicate-ignore-db = dbname  不对这个数据库进行镜像处理。<br />
replicate-rewrite-db = db1name &gt; db2name  把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。<br />
report-host = hostname  从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关&#8211;主控服务器可以用这条命令生成一份从属服务器的名单。<br />
slave-compressed-protocol = 1  主、从服务器使用压缩格式进行通信&#8211;如果它们都支持这么做的话。<br />
slave-skip-errors = n1, n2, &#8230;或all  即使发生出错代码为n1、n2等的错误，镜像处理工作也继续进行(即不管发生什么错误，镜像处理工作也继续进行)。<br />
如果配置得当，从属服务器不应该在执行SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用<br />
slave-skip-errors选项，从属服务器上的镜像工作就可能国为发生错误而中断，中断后需要有人工参与才能继续进行。</p>
<p>mysqld&#8211;InnoDB&#8211;基本设置、表空间文件<br />
skip-innodb  不加载InnoDB数据表驱动程序&#8211;如果用不着InnoDB数据表，可以用这个选项节省一些内存。<br />
innodb-file-per-table  为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。<br />
innodb-open-file = n  InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多<br />
数据表的话，这个数字很可能需要加大。<br />
innodb_data_home_dir = p  InnoDB主目录，所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下，这个主目录就是MySQL的数据目录。<br />
innodb_data_file_path = ts  用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或<br />
千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。<br />
例如，ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB，ibdata2的最大长度也是1G，但允许它扩充到2GB。<br />
除文件名外，还可以用硬盘分区的设置名来定义表空间，此时必须给表空间的最大初始长度值加上newraw关键字做后缀，给表空间的最大扩充长度值加上<br />
raw关键字做后缀(例如/dev/hdb1:20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。<br />
innodb_autoextend_increment = n  带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件，那些文件的<br />
增大速度相对是比较小的。<br />
innodb_lock_wait_timeout = n  如果某个事务在等待n秒(s)后还没有获得所需要的资源，就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被<br />
InnoDB数据表驱动程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。<br />
innodb_fast_shutdown 0/1  是否以最快的速度关闭InnoDB，默认设置是1，意思是不把缓存在INSERT缓存区的数据写入数据表，那些数据将在MySQL服务器下次<br />
启动时再写入(这么做没有什么风险，因为INSERT缓存区是表空间的一个组成部分，数据不会丢失)。把这个选项设置为0反面危险，因为在计算机关闭时，<br />
InnoDB驱动程序很可能没有足够的时间完成它的数据同步工作，操作系统也许会在它完成数据同步工作之前强行结束InnoDB，而这会导致数据不完整。</p>
<p>mysqld程序&#8211;InnoDB&#8211;日志<br />
innodb_log_group_home_dir = p  用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下，InnoDB驱动程序将使用MySQL数据目<br />
录作为自己保存日志文件的位置。<br />
innodb_log_files_in_group = n  使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后，<br />
之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单位进行设置。<br />
innodb_flush_log_at_trx_commit = 0/1/2  这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为&#8221;同步&#8221;)到硬盘上。<br />
设置值0的意思是每隔一秒写一次日志并进行同步，这可以减少硬盘写操作次数，但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT<br />
命令就写一次日志并进行同步，这可以防止数据丢失，但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法，即每执行完一条COMMIT命令写一次日志，<br />
每隔一秒进行一次同步。<br />
innodb_flush_method = x  InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync，用fsync()函数进行同步; O_DSYNC，<br />
用O_SYNC()函数进行同步。<br />
innodb_log_archive = 1  启用InnoDB驱动程序的archive(档案)日志功能，把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与MySQL一起使用时没有<br />
多大意义(启用MySQL服务器的二进制日志功能就足够用了)。</p>
<p>mysqld程序&#8211;InnoDB&#8211;缓存区的设置和优化<br />
innodb_log_buffer_pool_size = n  为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响，如果计算机上只运行有<br />
MySQL/InnoDB数据库服务器，就应该把全部内存的80%用于这个用途。<br />
innodb_log_buffer_size = n  事务日志文件写操作缓存区的最大长度(默认设置是1MB)。<br />
innodb_additional_men_pool_size = n  为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。<br />
innodb_file_io_threads = n  I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。<br />
innodb_thread_concurrency = n  InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。</p>
<p>mysqld程序&#8211;其它选项<br />
bind-address = ipaddr  MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址，这个选项将非常重要。<br />
default-storage-engine = type  新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过&#8211;default-table-type选项来设置。<br />
default-timezone = name  为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。<br />
ft_min_word_len = n  全文索引的最小单词长度工。这个选项的默认设置是4，意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。<br />
Max-allowed-packet = n  客户与服务器之间交换的数据包的最大长度，这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。<br />
Sql-mode = model1, mode2, &#8230;  MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括<br />
ansi、db2、oracle、no_zero_date、pipes_as_concat。</p>
<p>注意：如果在配置文件里给出的某个选项是mysqld无法识别的(如，因为犯了一个愚蠢的打字错误)，MySQL服务器将不启动。</span></p>
<h2><strong>详细翻译：</strong></h2>
<div id="articleBody" class="articleContent">#BEGIN CONFIG INFO<br />
#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大<br />
#TYPE: SYSTEM<br />
#END CONFIG INFO</p>
<p>#<br />
# 此mysql配置文件例子针对4G内存，并在<a href="http://www.bt285.cn/"><span style="color: #006600;">www.bt285.cn</span></a> bt下载与 <a href="http://www.5a520.cn/"><span style="color: #006600;">www.5a520.cn</span></a> 小说520，这两个日ip 2w ,pv 20w  测试过的。<br />
# 主要使用INNODB<br />
#处理复杂队列并且连接数量较少的mysql服务器<br />
#<br />
# 将此文件复制到/etc/my.cnf 作为全局设置,<br />
# mysql-data-dir/my.cnf 作为服务器指定设置<br />
# (@localstatedir@ for this installation) 或者放入<br />
# ~/.my.cnf 作为用户设置.<br />
#<br />
# 在此配置文件中, 你可以使用所有程序支持的长选项.<br />
# 如果想获悉程序支持的所有选项<br />
# 请在程序后加上&#8221;&#8211;help&#8221;参数运行程序.<br />
#<br />
# 关于独立选项更多的细节信息可以在手册内找到<br />
#</p>
<p>#<br />
# 以下选项会被MySQL客户端应用读取.<br />
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.<br />
# 如果你想你自己的MySQL应用程序获取这些值<br />
# 需要在MySQL客户端库初始化的时候指定这些选项</p>
<p>#<br />
[client]<br />
#password = [your_password]<br />
port = @MYSQL_TCP_PORT@<br />
socket = @MYSQL_UNIX_ADDR@</p>
<p># *** 应用定制选项 ***</p>
<p>#<br />
#  MySQL 服务端<br />
#<br />
[mysqld]</p>
<p># 一般配置选项<br />
port = @MYSQL_TCP_PORT@<br />
socket = @MYSQL_UNIX_ADDR@</p>
<p># back_log 是操作系统在监听队列中所能保持的连接数,<br />
# 队列保存了在MySQL连接管理器线程处理之前的连接.<br />
# 如果你有非常高的连接率并且出现&#8221;connection refused&#8221; 报错,<br />
# 你就应该增加此处的值.<br />
# 检查你的操作系统文档来获取这个变量的最大值.<br />
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果<br />
back_log = 50</p>
<p># 不在TCP/IP端口上进行监听.<br />
# 如果所有的进程都是在同一台服务器连接到本地的mysqld,<br />
# 这样设置将是增强安全的方法<br />
# 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.<br />
# 注意在windows下如果没有打开命名管道选项而只是用此项<br />
# (通过 &#8220;enable-named-pipe&#8221; 选项) 将会导致mysql服务没有任何作用!<br />
#skip-networking</p>
<p># MySQL 服务所允许的同时会话数的上限<br />
# 其中一个连接将被SUPER权限保留作为管理员登录.<br />
# 即便已经达到了连接数的上限.<br />
max_connections = 100<br />
一般像在我这个<a href="http://www.bt285.cn/"><span style="color: #006600;">www.bt285.cn</span></a> pv 10w   max_connections=30 就够了。但是如果页面都像<a href="http://www.bt285.cn/content.php?id=1196863"><span style="color: #006600;">http://www.bt285.cn/content.php?id=1196863</span></a> 这个甜性涩爱页面一样，max_connections=30是不够的。<br />
# 每个客户端连接最大的错误允许数量,如果达到了此限制.<br />
# 这个客户端将会被MySQL服务阻止直到执行了&#8221;FLUSH HOSTS&#8221; 或者服务重启<br />
# 非法的密码以及其他在链接时的错误会增加此值.<br />
# 查看 &#8220;Aborted_connects&#8221; 状态来获取全局计数器.<br />
max_connect_errors = 10</p>
<p># 所有线程所打开表的数量.<br />
# 增加此值就增加了mysqld所需要的文件描述符的数量<br />
# 这样你需要确认在[mysqld_safe]中 &#8220;open-files-limit&#8221; 变量设置打开文件数量允许至少4096<br />
table_cache = 2048</p>
<p># 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响<br />
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)<br />
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表<br />
#external-locking</p>
<p># 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)<br />
# 每个连接独立的大小.大小动态增加<br />
max_allowed_packet = 16M</p>
<p># 在一个事务中binlog为了记录SQL状态所持有的cache大小<br />
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.<br />
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中<br />
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.<br />
# 此缓冲在每个连接的事务第一次更新状态时被创建<br />
binlog_cache_size = 1M</p>
<p># 独立的内存表所允许的最大容量.<br />
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.<br />
max_heap_table_size = 64M</p>
<p># 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序<br />
# 如果排序后的数据无法放入排序缓冲,<br />
# 一个用来替代的基于磁盘的合并分类会被使用<br />
# 查看 &#8220;Sort_merge_passes&#8221; 状态变量.<br />
# 在排序发生时由每个线程分配<br />
sort_buffer_size = 8M</p>
<p># 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).<br />
# 类似的联合在极大多数情况下有非常糟糕的性能表现,<br />
# 但是将此值设大能够减轻性能影响.<br />
# 通过 &#8220;Select_full_join&#8221; 状态变量查看全联合的数量<br />
# 当全联合发生时,在每个线程中分配<br />
join_buffer_size = 8M</p>
<p># 我们在cache中保留多少线程用于重用<br />
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,<br />
# 则客户端线程被放入cache中.<br />
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销<br />
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)<br />
thread_cache_size = 8</p>
<p># 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.<br />
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).<br />
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值<br />
thread_concurrency = 8</p>
<p># 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.<br />
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.<br />
# 查看 &#8220;Qcache_lowmem_prunes&#8221; 状态变量来检查是否当前值对于你的负载来说是否足够高.<br />
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,<br />
# 查询缓冲也许引起性能下降而不是性能提升.<br />
query_cache_size = 64M</p>
<p># 只有小于此设定值的结果才会被缓冲<br />
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.<br />
query_cache_limit = 2M</p>
<p># 被全文检索索引的最小的字长.<br />
# 你也许希望减少它,如果你需要搜索更短字的时候.<br />
# 注意在你修改此值之后,<br />
# 你需要重建你的 FULLTEXT 索引<br />
ft_min_word_len = 4</p>
<p># 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out<br />
# 此选项对于性能有益<br />
#memlock</p>
<p># 当创建新表时作为默认使用的表类型,<br />
# 如果在创建表示没有特别执行表类型,将会使用此值<br />
default_table_type = MYISAM</p>
<p># 线程使用的堆大小. 此容量的内存在每次连接时被预留.<br />
# MySQL 本身常不会需要超过64K的内存<br />
# 如果你使用你自己的需要大量堆的UDF函数<br />
# 或者你的操作系统对于某些操作需要更多的堆,<br />
# 你也许需要将其设置的更高一点.<br />
thread_stack = 192K</p>
<p># 设定默认的事务隔离级别.可用的级别如下:<br />
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE<br />
transaction_isolation = REPEATABLE-READ</p>
<p># 内部(内存中)临时表的最大大小<br />
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.<br />
# 此限制是针对单个表的,而不是总和.<br />
tmp_table_size = 64M</p>
<p># 打开二进制日志功能.<br />
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项<br />
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.<br />
log-bin=mysql-bin</p>
<p># 如果你在使用链式从服务器结构的复制模式 (A-&gt;B-&gt;C),<br />
# 你需要在服务器B上打开此项.<br />
# 此选项打开在从线程上重做过的更新的日志,<br />
# 并将其写入从服务器的二进制日志.<br />
#log_slave_updates</p>
<p># 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)<br />
# 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.<br />
#log</p>
<p># 将警告打印输出到错误log文件.  如果你对于MySQL有任何问题<br />
# 你应该打开警告log并且仔细审查错误日志,查出可能的原因.<br />
#log_warnings</p>
<p># 记录慢速查询. 慢速查询是指消耗了比 &#8220;long_query_time&#8221; 定义的更多时间的查询.<br />
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.<br />
# 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,<br />
log_slow_queries</p>
<p># 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.<br />
# 不要在这里使用&#8221;1&#8243;, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).<br />
long_query_time = 2</p>
<p># 在慢速日志中记录更多的信息.<br />
# 一般此项最好打开.<br />
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里<br />
log_long_format</p>
<p># 此目录被MySQL用来保存临时文件.例如,<br />
# 它被用来处理基于磁盘的大型排序,和内部排序一样.<br />
# 以及简单的临时表.<br />
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好<br />
# 另一种选择是你也可以将其放置在独立的磁盘上.<br />
# 你可以使用&#8221;;&#8221;来放置多个路径<br />
# 他们会按照roud-robin方法被轮询使用.<br />
#tmpdir = /tmp</p>
<p># ***  复制有关的设置</p>
<p># 唯一的服务辨识号,数值位于 1 到 2^32-1之间.<br />
# 此值在master和slave上都需要设置.<br />
# 如果 &#8220;master-host&#8221; 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.<br />
server-id = 1</p>
<p># 复制的Slave (去掉master段的注释来使其生效)<br />
#<br />
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:<br />
#<br />
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -<br />
#    语法如下:<br />
#<br />
#    CHANGE MASTER TO MASTER_HOST=&lt;host&gt;, MASTER_PORT=&lt;port&gt;,<br />
#    MASTER_USER=&lt;user&gt;, MASTER_PASSWORD=&lt;password&gt; ;<br />
#<br />
#    你需要替换掉 &lt;host&gt;, &lt;user&gt;, &lt;password&gt; 等被尖括号包围的字段以及使用master的端口号替换&lt;port&gt; (默认3306).<br />
#<br />
#    例子:<br />
#<br />
#    CHANGE MASTER TO MASTER_HOST=&#8217;125.564.12.1&#8242;, MASTER_PORT=3306,<br />
#    MASTER_USER=&#8217;joe&#8217;, MASTER_PASSWORD=&#8217;secret&#8217;;<br />
#<br />
# 或者<br />
#<br />
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,<br />
#     例如如果你输入错密码在master-password字段并且slave无法连接),<br />
#    slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略<br />
#    并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.<br />
#    由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替<br />
#<br />
# 所需要的唯一id号位于 2 和 2^32 &#8211; 1之间<br />
# (并且和master不同)<br />
# 如果master-host被设置了.则默认值是2<br />
# 但是如果省略,则不会生效<br />
#server-id = 2<br />
#<br />
# 复制结构中的master &#8211; 必须<br />
#master-host = &lt;hostname&gt;<br />
#<br />
# 当连接到master上时slave所用来认证的用户名 &#8211; 必须<br />
#master-user = &lt;username&gt;<br />
#<br />
# 当连接到master上时slave所用来认证的密码 &#8211; 必须<br />
#master-password = &lt;password&gt;<br />
#<br />
# master监听的端口.<br />
# 可选 &#8211; 默认是3306<br />
#master-port = &lt;port&gt;</p>
<p># 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.<br />
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据<br />
#read_only</p>
<p>#*** MyISAM 相关选项</p>
<p># 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.<br />
# 不要将其设置大于你可用内存的30%,<br />
# 因为一部分内存同样被OS用来缓冲行数据<br />
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.<br />
key_buffer_size = 32M</p>
<p># 用来做MyISAM表全表扫描的缓冲大小.<br />
# 当全表扫描需要时,在对应线程中分配.<br />
read_buffer_size = 2M</p>
<p># 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.<br />
# 如果你增高此值,可以提高很多ORDER BY的性能.<br />
# 当需要时由每个线程分配<br />
read_rnd_buffer_size = 16M</p>
<p># MyISAM 使用特殊的类似树的cache来使得突发插入<br />
# (这些插入是,INSERT &#8230; SELECT, INSERT &#8230; VALUES (&#8230;), (&#8230;), &#8230;, 以及 LOAD DATA<br />
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.<br />
# 设置为 0 会关闭此优化.<br />
# 为了最优化不要将此值设置大于 &#8220;key_buffer_size&#8221;.<br />
# 当突发插入被检测到时此缓冲将被分配.<br />
bulk_insert_buffer_size = 64M</p>
<p># 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.<br />
# 这在每个线程中被分配.所以在设置大值时需要小心.<br />
myisam_sort_buffer_size = 128M</p>
<p># MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).<br />
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)<br />
myisam_max_sort_file_size = 10G</p>
<p># 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.<br />
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.<br />
myisam_max_extra_sort_file_size = 10G</p>
<p># 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.<br />
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.<br />
myisam_repair_threads = 1</p>
<p># 自动检查和修复没有适当关闭的 MyISAM 表.<br />
myisam_recover</p>
<p># 默认关闭 Federated<br />
skip-federated</p>
<p># *** BDB 相关选项 ***</p>
<p># 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.<br />
skip-bdb</p>
<p># *** INNODB 相关选项 ***</p>
<p># 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,<br />
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分<br />
#skip-innodb</p>
<p># 附加的内存池被InnoDB用来保存 metadata 信息<br />
# 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.<br />
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.<br />
# SHOW INNODB STATUS 命令会显示当先使用的数量.<br />
innodb_additional_mem_pool_size = 16M</p>
<p># InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.<br />
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.<br />
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%<br />
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.<br />
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,<br />
# 所以不要设置的太高.<br />
innodb_buffer_pool_size = 2G</p>
<p># InnoDB 将数据保存在一个或者多个数据文件中成为表空间.<br />
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.<br />
# 其他情况下.每个设备一个文件一般都是个好的选择.<br />
# 你也可以配置InnoDB来使用裸盘分区 &#8211; 请参考手册来获取更多相关内容<br />
innodb_data_file_path = ibdata1:10M:autoextend</p>
<p># 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.<br />
# 默认保存在MySQL的datadir中.<br />
#innodb_data_home_dir = &lt;directory&gt;</p>
<p># 用来同步IO操作的IO线程的数量. This value is<br />
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.<br />
innodb_file_io_threads = 4</p>
<p># 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.<br />
# 从1开始并且增加此值知道你能够成功的导出表.<br />
#innodb_force_recovery=1</p>
<p># 在InnoDb核心内的允许线程数量.<br />
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.<br />
# 过高的值可能导致线程的互斥颠簸.<br />
innodb_thread_concurrency = 16</p>
<p># 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,<br />
# 这提供了完整的ACID行为.<br />
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O<br />
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.<br />
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.<br />
innodb_flush_log_at_trx_commit = 1</p>
<p># 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.<br />
# 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.<br />
#innodb_fast_shutdown</p>
<p># 用来缓冲日志数据的缓冲区的大小.<br />
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.<br />
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)</p>
<p>innodb_log_buffer_size = 8M</p>
<p># 在日志组中每个日志文件的大小.<br />
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%<br />
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.<br />
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.<br />
innodb_log_file_size = 256M</p>
<p># 在日志组中的文件总数.<br />
# 通常来说2~3是比较好的.<br />
innodb_log_files_in_group = 3</p>
<p># InnoDB的日志文件所在位置. 默认是MySQL的datadir.<br />
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能<br />
#innodb_log_group_home_dir</p>
<p># 在InnoDB缓冲池中最大允许的脏页面的比例.<br />
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.<br />
# 这是一个软限制,不被保证绝对执行.<br />
innodb_max_dirty_pages_pct = 90</p>
<p># InnoDB用来刷新日志的方法.<br />
# 表空间总是使用双重写入刷新方法<br />
# 默认值是 &#8220;fdatasync&#8221;, 另一个是 &#8220;O_DSYNC&#8221;.<br />
#innodb_flush_method=O_DSYNC</p>
<p># 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.<br />
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.<br />
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎<br />
# 那么一个死锁可能发生而InnoDB无法注意到.<br />
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.<br />
innodb_lock_wait_timeout = 120</p>
<p>[mysqldump]<br />
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项<br />
quick</p>
<p>max_allowed_packet = 16M</p>
<p>[mysql]<br />
no-auto-rehash</p>
<p># 仅仅允许使用键值的 UPDATEs 和 DELETEs .<br />
#safe-updates</p>
<p>[isamchk]<br />
key_buffer = 512M<br />
sort_buffer_size = 512M<br />
read_buffer = 8M<br />
write_buffer = 8M</p>
<p>[myisamchk]<br />
key_buffer = 512M<br />
sort_buffer_size = 512M<br />
read_buffer = 8M<br />
write_buffer = 8M</p>
<p>[mysqlhotcopy]<br />
interactive-timeout</p>
<p>[mysqld_safe]<br />
# 增加每个进程的可打开文件数量.<br />
# 警告: 确认你已经将全系统限制设定的足够高!<br />
# 打开大量表需要将此值设高 j<br />
open-files-limit = 8192</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/489.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE6、IE7、FF兼容性的详细CSS HACK介绍</title>
		<link>http://www.tisswb.com/archives/477.html</link>
		<comments>http://www.tisswb.com/archives/477.html#comments</comments>
		<pubDate>Thu, 09 Apr 2009 02:29:54 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[网站开发]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=477</guid>
		<description><![CDATA[现在我大部分都是用!important来hack，对于ie6和firefox测试可以正常显示，但是ie7对! important可以正确解释，会导致页面没按要求显示！搜索了一下，找到一个针对IE7不错的hack方式就是使用“*+html”，现在用IE7浏 览一下，应该没有问题了。
现在写一个CSS可以这样：
#example { color: #333; } /* Moz */
* html #example { color: #666; } /* IE6 */
*+html #example { color: #999; } /* IE7 */
那么在firefox下字体颜色显示为#333，IE6下字体颜色显示为#666，IE7下字体颜色显示为#999，他们都互不干扰。我真希望那个IE6快点退休&#8230;&#8230;
css Hacks，css样式表补丁.用于修正XHTML编码设计的网页模板布局,某些层的溢出问题,HACKS出处:www.webdevout.net，这个CSS补丁(hacks)很简单，在样式表中单独为ie7设置某个元素，id或者class前面这样写:
<span class="readmore"><a href="http://www.tisswb.com/archives/477.html" title="IE6、IE7、FF兼容性的详细CSS HACK介绍" target="_blank">阅读全文——共3413字</a></span>]]></description>
			<content:encoded><![CDATA[<p>现在我大部分都是用!important来hack，对于ie6和firefox测试可以正常显示，但是ie7对! important可以正确解释，会导致页面没按要求显示！搜索了一下，找到一个针对IE7不错的hack方式就是使用“*+html”，现在用IE7浏 览一下，应该没有问题了。</p>
<p>现在写一个CSS可以这样：<br />
#example { color: #333; } /* Moz */<br />
* html #example { color: #666; } /* IE6 */<br />
*+html #example { color: #999; } /* IE7 */</p>
<p>那么在firefox下字体颜色显示为#333，IE6下字体颜色显示为#666，IE7下字体颜色显示为#999，他们都互不干扰。我真希望那个IE6快点退休&#8230;&#8230;</p>
<p>css Hacks，css样式表补丁.用于修正XHTML编码设计的网页模板布局,某些层的溢出问题,HACKS出处:www.webdevout.net，这个CSS补丁(hacks)很简单，在样式表中单独为ie7设置某个元素，id或者class前面这样写:</p>
<p>*:first-child+html #ID{}</p>
<p>或者</p>
<p>*:first-child+html .class{}<br />
别忘掉了前面的*,这个hacks使得DIV+CSS网页模板在ie5+,ie6,ie7,firefox 1.5,firefox 2的浏览器中都可以完美体现原始布局,而不会出现层溢出等问题.</p>
<p>IE7 修复了很多 bug，也增加了对一些选择符的支持，所以现在诸如 *html {} 和 html&gt;body {} 等针对 IE 隐藏或显示的 hack 都会在 IE7 中失效。虽然 CSS Hack 不推荐使用，条件注释才是万无一失的过滤器，但是条件注释只能出现在 HTML 中，CSS Hack 还是有用武之地的。Nanobot 发现了一些针对 IE7 的 CSS Hack，具体就是：</p>
<p>&gt;body<br />
html*<br />
*+html</p>
<p>这 三种写法，其中前两种都是不合法的 CSS 写法，在标准兼容浏览器中被被忽略，但是 IE7 却不这么认为。对于 &gt;body ，它会将缺失的选择符用全局选择符 * 代替，也就是将其处理成了 *&gt;body，而且不光对于 &gt; 选择符，+,~ 选择符中这个现象也存在。对于 html* ，由于 html 和 * 之间没有空格，所以也是一种 CSS 语法错误，但 IE7 不会忽略，而是错误地认为这里有一个空格。对于第三种 *+html，IE7 认为 html 前面的 DTD 声明也是一个元素，所以 html 会被选中，这三种方法中只有这一种方法是合法的 CSS 写法，也就是说可以通过校验器的验证，因此也是作者推荐的 hack 用法。</p>
<p>最后作者给出了最佳方式：</p>
<p>IE 6 and below<br />
Use * html {} to select the html element.<br />
IE 7 and below<br />
Use *+html, * html {} to select the html element.<br />
IE 7 only<br />
Use *+html {} to select the html element.<br />
IE 7 and modern browsers only<br />
Use html&gt;body {} to select the body element.<br />
Modern browsers only (not IE 7)<br />
Use html&gt;/**/body {} to select the body element.</p>
<p>The IE7 CSS Hack(!important在ie7.0的hack方法)</p>
<p>由 于ie对!important识别存在bug,而现在大部分网页标准设计师又通过这个bug来兼容ie和ff,但是ie7.0把这个bug给修复了,所以 问题又出现了,怎么兼容ie.7.0的同时又能兼容ie6.0和ff?正所谓&#8221;上有政策,下有对策&#8221;,国外的网页标准设计师通过使用css filter的办法(并不是css hack)来兼容ie7.0,ie6.0和ff,以下为作者从国外网站的翻译.</p>
<p>新建一个css样式如下：<br />
插入代码：<br />
#item {<br />
width: 200px;<br />
height: 200px;<br />
background: red;<br />
}<br />
新建一个div,并使用前面定义的css的样式：<br />
插入代码：<br />
some text here<br />
在body表现这里加入lang属性,中文为zh：<br />
插入代码：</p>
<p>现在对div元素再定义一个样式：<br />
插入代码：<br />
[/code]<br />
*:lang(en) #item{<br />
background:green !important;<br />
}<br />
[/code]<br />
这样做是为了用!important覆盖原来的css样式,由于:lang选择器ie7.0并不支持,所以对这句话不会有任何作用,于是也达到了ie6.0下同样的效果,但是很不幸地的是,safari同样不支持此属性,所以需要加入以下css样式：<br />
插入代码：<br />
#item:empty {<br />
background: green !important<br />
}<br />
:empty选择器为css3的规范,尽管safari并不支持此规范,但是还是会选择此元素,不管是否此元素存在,现在绿色会现在在除ie各版本以外的浏览器上,并在以下浏览器和操作系统下通过测试：<br />
ie7 beta 2 preview/win<br />
ie5.01+/win<br />
firefox 1.5/win<br />
opera 8.5/win &amp; linux<br />
netscape 7.01, 8/win<br />
mozilla 1.7.12/win &amp; linux<br />
safari 2/mac<br />
firefox 1.0.4/linux<br />
epiphany 1.4.8/linux<br />
galeon 1.3.20/linux</p>
<p>Screenshot of the IE7 css hack in IE7<br />
Screenshot of the IE7 css hack in Firefox 1.5</p>
<p>按照远作者的说法其实这不能算是一种hack,应该属于filter,不过这似乎并不是最重要的,因为通过这个办法,我们又一次了解决IE6.0,IE7.0和其他浏览器之间的兼容性问题,而且使用:lang-filter这办法,在今后的一段时间内都会有用.<br />
firefox,ie7,ie6兼容性问题，和css解决方案<br />
注：IE都能识别*;标准浏览器(如Firefox,Opera,Netscape)不能识别*；IE6能识别*，但不能识别 !important,IE7能识别*，也能识别!important;FF不能识别*，但能识别!important;</p>
<p>写两句代码来控制一个属性，区别Firefox与IE6：<br />
background:orange;*background:blue;</p>
<p>//这一句代码写出来时，你用firefox或其它非IE浏览时，会发现，写了该代码的区域背景是橙色的，如果用IE浏览，却是蓝色的，这是因为IE都能识别*;标准浏览器(如Firefox,Opera,Netscape)不能识别*；<br />
写两句代码来控制一个属性，区别IE7与IE6：<br />
background:green !important;background:blue;</p>
<p>//这一句代码写出来时，你用IE7浏览，会发现，写了该代码的区域背景是绿色的，如果用IE6浏览，却是蓝色的，这是因为IE7能识别! important*，一但识别了，就执行，忽略了后面的那一句，但IE6却不能识别!important，所以前面部分跳过，直接执行了后半部份。<br />
写两句代码来控制一个属性，区别Firefox与IE：<br />
background:orange; *background:green;</p>
<p>//这一句代码写出来时，你用Firefox浏览，会发现背景是橙色的，而IE里却是绿色的，很简单，因为Firefox不能识别*，而IE6，IE7都可以识*<br />
写三句代码来控制一个属性，区别Firefox，IE7，IE6：<br />
background:orange;*background:green !important;*background:blue;</p>
<p>//这一句会使在Firefox在，背景呈橙色，IE7中为绿色，IE6中为蓝色，道理和前面一样，Firefox不能识别*，所以后面两句都不执 行，直 接执行第一句，IE7当然也能执行第一行代码，但是因为第二句，他也能识别，所以就执行了第二句代码，把前面的效果给过滤了，而最后一句，IE7是不能识 别的。IE6不能识别!imprtant，本来运行了第一句代码了，第二句不能识别，那就理所当然的执行了最后一句。</p>
<p>来源：<a href="http://tanliping192.blog.163.com/blog/static/1792149820089872386/" target="_blank">http://tanliping192.blog.163.com/blog/static/1792149820089872386/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/477.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E7、IE6和火狐兼容性问题解决方案</title>
		<link>http://www.tisswb.com/archives/474.html</link>
		<comments>http://www.tisswb.com/archives/474.html#comments</comments>
		<pubDate>Thu, 09 Apr 2009 02:25:50 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[网站开发]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=474</guid>
		<description><![CDATA[一、CSS HACK
以下两种方法几乎能解决现今所有HACK。
1、!important
随着IE7对!important的支持，!important 方法现在只针对IE6的HACK。
（注意写法.记得该声明位置需要提前）
程序代码&#60;style&#62;
#wrapper
{
width: 100px!important; /* IE7+FF */
width: 80px; /* IE6 */
<span class="readmore"><a href="http://www.tisswb.com/archives/474.html" title="E7、IE6和火狐兼容性问题解决方案" target="_blank">阅读全文——共2612字</a></span>]]></description>
			<content:encoded><![CDATA[<p><strong>一、CSS HACK</strong></p>
<p>以下两种方法几乎能解决现今所有HACK。<br />
<strong>1、!important</strong><br />
随着IE7对!important的支持，!important 方法现在只针对IE6的HACK。<br />
（注意写法.记得该声明位置需要提前）<br />
程序代码&lt;style&gt;<br />
#wrapper<br />
{<br />
width: 100px!important; /* IE7+FF */<br />
width: 80px; /* IE6 */<br />
}<br />
&lt;/style&gt;</p>
<p><strong>2、IE6/IE77对FireFox</strong><br />
*+html 与 *html 是IE特有的标签，firefox 暂不支持。<br />
而*+html 又为 IE7特有标签。<br />
程序代码&lt;style&gt;<br />
#wrapper<br />
{<br />
#wrapper { width: 120px; } /* FireFox */<br />
*html #wrapper { width: 80px;} /* ie6 fixed */<br />
*+html #wrapper { width: 60px;} /* ie7 fixed, 注意顺序 */<br />
}<br />
&lt;/style&gt;注意，*+html 对IE7的HACK 必须保证HTML顶部有如下声明：<br />
程序代码&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.01 Transitional//EN&#8221;　&#8221;http://www.w3.org/TR/html4/loose.dtd&#8221;&gt;<br />
<strong>二、万能 float 闭合（非常重要）</strong></p>
<p>关于 clear float 的原理可参见 [How To Clear Floats Without Structural Markup]<br />
将以下代码加入Global CSS 中，给需要闭合的div加上 class=&#8221;clearfix&#8221; 即可，屡试不爽。<br />
程序代码&lt;style&gt;<br />
/* Clear Fix */</p>
<p>.clearfix:after<br />
{<br />
content:&#8221;.&#8221;;<br />
display:block;<br />
height:0;<br />
clear:both;<br />
visibility:hidden;<br />
}<br />
.clearfix<br />
{<br />
display:inline-block;<br />
}<br />
/* Hide from IE Mac \*/<br />
.clearfix {display:block;}<br />
/* End hide from IE Mac */<br />
/* end of clearfix */<br />
&lt;/style&gt;</p>
<p><strong>三、其他兼容技巧（再次啰嗦）</strong></p>
<p>1、FF下给 div 设置 padding 后会导致 width 和 height 增加，但IE不会。（可用!important解决）<br />
2、居中问题。<br />
1) 垂直居中。将 line-height 设置为 当前 div 相同的高度，再通过 vertical-align: middle. （注意内容不要换行）<br />
2) 水平居中。 margin: 0 auto; （当然不是万能）<br />
3、若需给 a 标签内内容加上 样式，需要设置 display: block; （常见于导航标签）<br />
4、FF 和 IE 对 BOX 理解的差异导致相差 2px 的还有设为 float 的 div 在 ie 下 margin 加倍等问题。<br />
5、ul 标签在 FF 下面默认有 list-style 和 padding 。最好事先声明，以避免不必要的麻烦。（常见于导航标签和内容列表）<br />
6、作为外部 wrapper 的 div 不要定死高度，最好还加上 overflow: hidden ，以达到高度自适应。<br />
7、关于手形光标。 cursor: pointer ，而 hand 只适用于 IE。<br />
8、至于IE5以及其他浏览器就没有必要兼顾了，在这上面花时间不值得。</p>
<p>下面这段可执行的码可以很形象的说明问题&#8230;当然前提是你有IE6 IE7和火狐浏览器&#8230;<br />
不过我还是没有研究透&#8230;需要注意的是&#8230;在&lt;body&gt;标签里加了 lang=&#8221;zh&#8221; 的定义&#8230;<br />
&lt;!DOCTYPE html PUBLIC &#8220;-//W3C//DTD XHTML 1.0 Transitional//EN&#8221; &#8220;&lt;a href=&#8221;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#8221; target=&#8221;_blank&#8221;&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;&#8221;&gt;<br />
&lt;html xmlns=&#8221;&lt;a href=&#8221;http://www.w3.org/1999/xhtml&#8221; target=&#8221;_blank&#8221;&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243; /&gt;<br />
&lt;title&gt;通过CSS Hack 区分 FX/IE7/IE6/IE5.5/IE5&lt;/title&gt;<br />
&lt;style type=&#8221;text/css&#8221;&gt;<br />
&lt;!&#8211;</p>
<p>#fx {<br />
display: none;<br />
border: 3px double #999;<br />
width:300px;<br />
height:200px;<br />
padding:10px;<br />
}<br />
#ie6{<br />
display:none !important;<br />
display:none;/*ie5*/<br />
font-size:54px;<br />
border:10px solid #CCC;<br />
padding:100px;<br />
}<br />
#ie6/**/{<br />
display:block;<br />
display /*ie5.5*/:none;<br />
}<br />
#ie7 {<br />
display:block !important;<br />
display:none;/*ie5 &amp; ie6*/<br />
background-color:#69f;<br />
border:1px dashed #63c;<br />
padding:50px;<br />
width:200px;<br />
height:150px;</p>
<p>}<br />
*:lang(zh) #ie7{<br />
display:none !important;<br />
}<br />
*:lang(zh) #fx{<br />
display:block !important;<br />
}</p>
<p>&#8211;&gt;</p>
<p>#example{color:red ;}<br />
* html #example{color:blue;}<br />
*+html #example{color:green;}<br />
&lt;/style&gt;<br />
&lt;/head&gt;</p>
<p>&lt;body lang=&#8221;zh&#8221;&gt;<br />
&lt;div id=&#8221;fx&#8221;&gt;这是在 FireFox 或者 Opera 下面的效果&lt;/div&gt;<br />
&lt;div id=&#8221;ie6&#8243;&gt;这是在 IE 6 下面的效果&lt;/div&gt;<br />
&lt;div id=&#8221;ie7&#8243;&gt;这是在 IE 7 下面的效果&lt;/div&gt;</p>
<p>&lt;div&gt;以下为简单区分FF/IE6/IE7示例&lt;/div&gt;<br />
&lt;div id=&#8221;example&#8221;&gt;这行文字在FF下应为红色，在IE6下应为蓝色，在IE7下应为绿色。&lt;/div&gt;<br />
&lt;/body&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/474.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE6,IE7,FF等浏览器CSS不兼容原因及解决办法</title>
		<link>http://www.tisswb.com/archives/472.html</link>
		<comments>http://www.tisswb.com/archives/472.html#comments</comments>
		<pubDate>Thu, 09 Apr 2009 02:22:45 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[网站开发]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=472</guid>
		<description><![CDATA[做网站的前端开发有多痛苦？看看浏览器的兼容性调整就可以知道了，人人深恶痛绝，可惜各大浏览器依然故我，把永远的痛通通给了我们。为了解决浏览器不兼容的情况，不知有多少人苦苦冥思哈。浏览器的不兼容，大家肯定都是深恶痛绝的，往往我们只是去做修补，却忘了更重要的事情，那就是追溯根源，避免类似的不兼容再次出现。在下不才，归纳几点html编码要素，望能指点各位：
1.文字本身的大小不兼容。同样是font-size:14px的宋体文字，在不同浏览器下占的空间是不一样的，ie下实际占高16px，下留白3px，ff下实际占高17px，上留白1px，下留白3px，opera下就更不一样了。解决方案：给文字设定 line-height 。确保所有文字都有默认的 line-height 值。这点很重要，在高度上我们不能容忍1px 的差异。
2.ff下容器高度限定，即容器定义了height之后，容器边框的外形就确定了，不会被内容撑大，而ie下是会被内容撑大，高度限定失效。所以不要轻易给容器定义height。
<span class="readmore"><a href="http://www.tisswb.com/archives/472.html" title="IE6,IE7,FF等浏览器CSS不兼容原因及解决办法" target="_blank">阅读全文——共4225字</a></span>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">做网站的前端开发有多痛苦？看看浏览器的兼容性调整就可以知道了，人人深恶痛绝，可惜各大浏览器依然故我，把永远的痛通通给了我们。为了解决浏览器不兼容的情况，不知有多少人苦苦冥思哈。浏览器的不兼容，大家肯定都是深恶痛绝的，往往我们只是去做修补，却忘了更重要的事情，那就是追溯根源，避免类似的不兼容再次出现。在下不才，归纳几点html编码要素，望能指点各位：</p>
<p style="text-align: justify;">1.文字本身的大小不兼容。同样是font-size:14px的宋体文字，在不同浏览器下占的空间是不一样的，ie下实际占高16px，下留白3px，ff下实际占高17px，上留白1px，下留白3px，opera下就更不一样了。解决方案：<span style="color: #ff0000;">给文字设定 line-height 。确保所有文字都有默认的 line-height 值。</span>这点很重要，在高度上我们不能容忍1px 的差异。</p>
<p style="text-align: justify;">2.ff下容器高度限定，即容器定义了height之后，容器边框的外形就确定了，不会被内容撑大，而ie下是会被内容撑大，高度限定失效。所以<span style="color: #ff0000;">不要轻易给容器定义height</span>。</p>
<p style="text-align: justify;">3.还讨论内容撑破容器问题，横向上的。如果float 容器未定义宽度，ff下内容会尽可能撑开容器宽度，ie下则会优先考虑内容折行。故，<span style="color: #ff0000;">内容可能撑破的浮动容器需要定义width</span>。</p>
<p style="text-align: justify;">小实验：有兴趣大家可以看看这段实验。在不同浏览器下分别测试以下各项代码。<br />
a.&lt;div style=&#8221;border:1px solid red;height:10px&#8221;&gt;&lt;/div&gt;  b.&lt;div style=&#8221;border:1px solid red;width:10px&#8221;&gt;&lt;/div&gt;
</p>
<p style="text-align: justify;">c.&lt;div style=&#8221;border:1px solid red;float:left&#8221;&gt;&lt;/div&gt;        d.&lt;div style=&#8221;border:1px solid red;overflow:hidden&#8221;&gt;&lt;/div&gt;</p>
<p style="text-align: justify;">上面的代码在不同浏览器中是不一样的，实验起源于对小height 值div 的运用，&lt;div style=&#8221;height:10px;overflow:hidden&#8221;&gt;&lt;/div&gt;，小height 值要配合overflow:hidden一起使用。实验好玩而已，想说明的是，浏览器对容器的边界解释是大不相同的，容器内容的影响结果各不相同。</p>
<p style="text-align: justify;">4.浮动的清除，<span style="color: #ff0000;">ff下不清除浮动是不行的</span>。</p>
<p style="text-align: justify;">纠正大家一个误区，遇到不兼容就说ff烂是不对的，其实更多时候是ie的奇怪表现让我们无所适从。以下列出ie6的种种劣迹。</p>
<p style="text-align: justify;">5.最被痛恨的，<span style="color: #ff0000;">double-margin bug</span>。ie6下给浮动容器定义margin-left 或者margin-right 实际效果是数值的2倍。解决方案，<span style="color: #ff0000;">给浮动容器定义display:inline</span>。</p>
<p style="text-align: justify;">6.mirrormargin bug，当外层元素内有float元素时，外层元素如定义margin-top:14px，将自动生成margin-bottom:14px。 padding也会出现类似问题，都是ie6下的特产，该类bug 出现的情况较为复杂，远不只这一种出现条件，还没系统整理。解决方案：<span style="color: #ff0000;">外层元素设定border 或 设定float。</span></p>
<p style="text-align: justify;">引申：ff 和ie 下对容器的margin-bottom，padding-bottom的解释有时不一致，似乎与之相关。</p>
<p style="text-align: justify;">7.吞吃现象，限于篇幅，我就不展开了。还是ie6，上下两个div，上面的div设置背景，却发现下面没有设置背景的div 也有了背景，这就是吞吃现象。对应上面的<span style="color: #ff0000;">背景吞吃现象，还有滚动下边框缺失的现象</span>。解决方案：<span style="color: #ff0000;">使用zoom:1。</span>这个zoom好象是专门为解决ie6 bug而生的。</p>
<p style="text-align: justify;">8.<span style="color: #ff0000;">注释也能产生bug</span>~~~&#8221;多出来的一只猪。&#8221;这是前人总结这个bug使用的文案，ie6的这个bug 下，大家会在页面看到猪字出现两遍，重复的内容量因注释的多少而变。解决方案：<span style="color: #ff0000;">用&#8221;&lt;!-[if !IE]&gt; picRotate start &lt;![endif]-&gt;&#8221;方法写注释。</span></p>
<p style="text-align: justify;">9.<span style="color: #ff0000;">&lt;li/&gt;里加 float &lt;div/&gt;</span>，这是一个典型的，棘手的兼容问题，希望引起大家正视，<span style="color: #ff0000;">给li 不同的属性会有不同的解释效果</span>，ff下的解释稍可理解，ie6下的解释会让你摸不着头脑，由于问题的复杂性，将另起一文专门讨论该问题。在《ul使用心得》一文里有相关成果，却没给出问题解决的过程。</p>
<p style="text-align: justify;">10.<span style="color: #ff0000;">使用了&#8221;float:left;display:inline&#8221;的ul的奇怪表现。</span>可以看出这句css是针对ie6下的double margin bug 而加上的display:inline，这也是我的css体系里的重要一环，在《ul使用心得》一文中有相关阐述。而这句css用在ul上会让你痛苦不堪。点到为止，这里不能多说哈。</p>
<p style="text-align: justify;">11.<span style="color: #ff0000;">img下的留白</span>，大家看这段代码有啥问题：</p>
<p style="text-align: justify;">&lt;div&gt;<br />
&lt;img src=&#8221;" mce_src=&#8221;" /&gt;<br />
&lt;/div&gt;
</p>
<p style="text-align: justify;">把div的border打开，你发现图片底部不是紧贴着容器底部的，是img后面的空白字符造成，要消除必须这样写</p>
<p style="text-align: justify;">&lt;div&gt;<br />
&lt;img src=&#8221;" mce_src=&#8221;" /&gt;&lt;/div&gt;
</p>
<p style="text-align: justify;"><span style="color: #ff0000;">后面两个标签要紧挨着</span>。ie7下这个bug 依然存在。解决方案：<span style="color: #ff0000;">给img设定 display:block。</span></p>
<p style="text-align: justify;">12.<span style="color: #ff0000;">失去line-height。</span>&lt;div style=&#8221;line-height:20px&#8221;&gt;&lt;img /&gt;文字&lt;/div&gt;，很遗憾，在ie6下单行文字 line-height 效果消失了。。。，原因是&lt;img /&gt;这个inline-block元素和inline元素写在一起了。解决方案：<span style="color: #ff0000;">让img 和文字都 float起来。</span></p>
<p style="text-align: justify;">引申：大家知道img 的align 有 text-top，middle，absmiddle啊什么的，你可以尝试去调整img 和文字让他们在ie和ff下能一致，你会发现怎么调都不会让你满意。<span style="color: #ff0000;">索性让img 和文字都 float起来，用margin 调整。</span></p>
<p style="text-align: justify;">13.<span style="color: #ff0000;">链接的hover状态</span>。a:hover img{width:300px} 我们想让鼠标hover时，链接里包含的图片宽度变化，可惜在<span style="color: #ff0000;">ie6下无效，ie7、ff下有效。</span></p>
<p style="text-align: justify;">14.<span style="color: #ff0000;">非链接的hover状态。</span>div:hover{} 这样的样式<span style="color: #ff0000;">ie6是不认的，在ie7、ff下才有效果</span>。</p>
<p style="text-align: justify;">15.<span style="color: #ff0000;">block化的a链接，其内套absolute层，absolute层内放置img，ie下，鼠标点击img不会有链接效果，ff、op下正常。</span></p>
<p style="text-align: justify;">想不出来了，以后想到再加吧。上面的诸多问题如果你掌握了其中奥妙，90%的不兼容问题不需要另起css hack的。</p>
<p style="text-align: justify;">16.<span style="color: #ff0000;">无法彻底清除的float。</span>如果让ul下的li具有了float属性，如何clear浮动的li 呢？&lt;ul&gt;&lt;li class=&#8221;c&#8221;&gt;&lt;/li&gt;&lt;/ul&gt; 或者 &lt;ul&gt;&lt;li&gt;&lt;div class=&#8221;c&#8221;&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt; 或者 &lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;div&gt;class=&#8221;c&#8221;&gt;&lt;/div&gt;&lt;/ul&gt; 或者 &lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;class=&#8221;c&#8221;&gt;&lt;/div&gt; 或者上述的组合？这个问题，我无法给出解答。下面有个例子与此相关</p>
<p style="text-align: justify;">&lt;!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&gt;</p>
<p style="text-align: justify;">&lt;style type=text/css&gt;<br />
.c{clear:both;overflow:hidden;+overflow:visible}<br />
.bd{border:1px solid red}</p>
<p style="text-align: justify;">ul.ex{list-style:none;}<br />
ul.ex li{float:left;border:1px solid green;}<br />
&lt;/style&gt;<br />
&lt;ul class=ex&gt;<br />
&lt;li&gt;sfsdfsfdf&lt;/li&gt;<br />
&lt;li&gt;sfsdfsfdf&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;div class=c&gt;&lt;/div&gt;<br />
&lt;div class=bd style=margin-top:19px&gt;sfsdfsfdf&lt;/div&gt;
</p>
<p style="text-align: justify;">请在ie下 测试，仅仅将 margin-top:19px 改为margin-top:20px 你发现什么了？要素：doctype必须有，ie6、ie7下margin-top:19px还好好的，margin-top:20px 就出问题了，无法解释。。。大家还可以将 clear 层换不同的位置测试。</p>
<p style="text-align: justify;">解决方案：给ul 属性zoom:1 （给li 加zoom:1 没用）</p>
<p style="text-align: justify;">引申：<span style="color: #ff0000;">clear层应该单独使用。</span>也许你为了节省代码把clear属性直接放到下面的一个内容层，这样有问题，不仅仅是ff和op下失去margin效果，ie下某些margin值也会失效<br />
&lt;div style=&#8221;background:red;float:left;&#8221;&gt;dd&lt;/div&gt;<br />
&lt;div style=&#8221;clear:both;margin-top:18px;background:green&#8221;&gt;ff&lt;/div&gt;
</p>
<p style="text-align: justify;">17.ie下overflow:hidden对其下的绝对层position:absolute或者相对层 position:relative无效。解决方案：<span style="color: #ff0000;">给overflow:hidden加position:relative或者 position:absolute。另，ie6支持overflow-x或者overflow-y的特性，ie7、ff不支持。</span></p>
<p style="text-align: justify;">18.ie6下严重的bug，float元素如没定义宽度，内部如有div定义了height或zoom:1，这个div就会占满一整行，即使你给了宽度。<span style="color: #ff0000;">float元素如果作为布局用或复杂的容器，都要给个宽度的。</span></p>
<p style="text-align: justify;">19.ie6下的bug，绝对定位的div下包含相对定位的div，如果给内层相对定位的div高度height具体值，内层相对层将具有100%的width值，外层绝对层将被撑大。解决方案<span style="color: #ff0000;">给内层相对层float属性。</span></p>
<p style="text-align: justify;">20.ie6下的bug，&lt;head&gt;&lt;/head&gt;内有&lt;base target=&#8221;_blank&#8221;/&gt;的情况下，position:relative层下的float层内文字无法选中。这个bug迫使我修公用样式库。</p>
<p style="text-align: justify;">21.终于来了个ff的缺点。width:100%这个东西在ie里用很方便，会向上逐层搜索width值，忽视浮动层的影响，<span style="color: #ff0000;">ff下搜索至浮动层结束，如此，只能给中间的所有浮动层加width:100%才行</span>，累啊。opera这点倒学乖了跟了ie。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/472.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>惊奇CSS：25 个高级CSS技巧</title>
		<link>http://www.tisswb.com/archives/453.html</link>
		<comments>http://www.tisswb.com/archives/453.html#comments</comments>
		<pubDate>Sun, 29 Mar 2009 16:39:21 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[div]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=453</guid>
		<description><![CDATA[CSS是一个为网友文档添加诸如字体、颜色和间隔等属性的机制。我喜欢使用CSS，胜于JavaScript 和 jQuery，如果相同的功能可以通过CSS和JavaScript实现时，那么建议使用CSS。或许有些设计师会表达不同意见——CSS缺少动态特性。真是这样吗？我们来看看CSS的高级技巧吧。
1. CSS 实现文字和背景渐变 

 
转自：http://www.kooxo.com/tutorial/webdesign/css/200903/28-92.html

难道通过CSS实现背景的渐变不比通过图片实现更好吗？因为这能使网页更快地加载。

使用纯CSS实现 渐变 
使用 CSS 实现背景的渐变
<span class="readmore"><a href="http://www.tisswb.com/archives/453.html" title="惊奇CSS：25 个高级CSS技巧" target="_blank">阅读全文——共2451字</a></span>]]></description>
			<content:encoded><![CDATA[<p>CSS是一个为网友文档添加诸如字体、颜色和间隔等属性的机制。我喜欢使用CSS，胜于JavaScript 和 jQuery，如果相同的功能可以通过CSS和JavaScript实现时，那么建议使用CSS。或许有些设计师会表达不同意见——CSS缺少动态特性。真是这样吗？我们来看看CSS的高级技巧吧。</p>
<h3><span style="TEXT-DECORATION: underline">1. CSS 实现文字和背景渐变 </span></h3>
<p style="TEXT-ALIGN: center" align="center"><span style="TEXT-DECORATION: underline"><a href="http://www.kooxo.com/uploads/allimg/090328/2307540.jpg"><img class="aligncenter size-full wp-image-1771" title="css_gradient" src="http://www.kooxo.com/uploads/allimg/090328/2307540.jpg" alt="css_gradient" width="500" height="411" /></a></span></p>
<p style="TEXT-ALIGN: center"><span style="TEXT-DECORATION: underline"></span> </p>
<p>转自：<a href="http://www.kooxo.com/tutorial/webdesign/css/200903/28-92.html">http://www.kooxo.com/tutorial/webdesign/css/200903/28-92.html</a>
</p>
<p align="left">难道通过CSS实现背景的渐变不比通过图片实现更好吗？因为这能使网页更快地加载。</p>
<ul>
<li><a href="http://www.designdetector.com/2005/09/css-gradients-demo.php" target="_blank">使用纯CSS实现 渐变</a> </li>
<li><a href="http://www.tankedup-imaging.com/css_dev/css-gradient.html" target="_blank">使用 CSS 实现背景的渐变</a></li>
</ul>
<p>文字的渐变又如何实现呢？</p>
<p style="TEXT-ALIGN: center" align="center"><a href="http://www.kooxo.com/uploads/allimg/090328/2307541.jpg"><img class="aligncenter size-full wp-image-1660" title="gradient_text" src="http://www.kooxo.com/uploads/allimg/090328/2307541.jpg" alt="gradient_text" width="379" height="132" /></a></p>
<ul>
<li><a href="http://www.webdesignerwall.com/tutorials/css-gradient-text-effect/" target="_blank">CSS 文字渐变特效</a></li>
<li><a href="http://cssglobe.com/lab/textgradient/" target="_blank">纯CSS实现文字渐变 </a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">2.使用Z-index实现图像层叠</span></h2>
<p style="TEXT-ALIGN: center" align="center"><span style="TEXT-DECORATION: underline"><a href="http://www.kooxo.com/uploads/allimg/090328/2307542.jpg"><img class="aligncenter size-full wp-image-1662" title="z-index" src="http://www.kooxo.com/uploads/allimg/090328/2307542.jpg" alt="z-index" width="270" height="177" /></a></span></p>
<p>使用z-index 属性来设置一批元素的层叠次序，你可以设置一张图像显示在另一张图像或文本之上。</p>
<ul>
<li><a href="http://www.tjkdesign.com/articles/z-index/teach_yourself_how_elements_stack.asp" target="_blank">认识  Z-Index </a></li>
<li><a href="http://www.quackit.com/css/properties/css_z-index.cfm" target="_blank">CSS Z-index</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">3. 使用CSS创建特殊边框 </p>
<p></span></h2>
<p style="TEXT-ALIGN: center" align="center"><img class="aligncenter size-full wp-image-1664" title="border" src="http://www.kooxo.com/uploads/allimg/090328/2307543.jpg" alt="border" width="400" height="120" /></p>
<ul>
<li><a href="http://www.copysense.co.uk/border.php" target="_blank">CSS Box Border test</a> : This utility enables the sampling of Cascading Style Sheet (CSS) border styles, and creates the corresponding CSS code for implementation.</li>
<li><a href="http://www.css3.info/preview/border-image/" target="_blank">Border-image CSS3</a> only.</li>
<li><a href="http://pmob.co.uk/pob/side-borders.htm" target="_blank">CSS Side Border</a> Image Using CSS.</li>
</ul>
<p align="center"><img class="aligncenter size-full wp-image-1704" title="star" src="http://www.kooxo.com/uploads/allimg/090328/2307544.jpg" alt="star" width="256" height="236" /></p>
<ul>
<li><a href="http://phoenity.com/newtedge/scalable_star/" target="_self">Create a Scalable Star using using CSS border</a></li>
<li><a href="http://infimum.dk/HTML/slantinfo.html" target="_blank">Border Slants </a></li>
</ul>
<h2 class="title"><span style="TEXT-DECORATION: underline">4. A Cool CSS Effect &#8211; Dashboard </span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1666" title="osx" src="http://www.kooxo.com/uploads/allimg/090328/2307545.jpg" alt="osx" width="450" height="387" /></p>
<ul>
<li>Create a<a href="http://dbachrach.com/blog/2006/10/09/a-cool-css-effect-dashboard/" target="_blank"> Dashboard</a> like effect using CSS.</li>
</ul>
<h2>5. 使用CSS创建<span style="TEXT-DECORATION: underline"> 2D/3D 按钮</span></h2>
<table border="0" align="center">
<tbody>
<tr>
<td><img class="aligncenter size-full wp-image-1667" title="css_button" src="http://www.kooxo.com/uploads/allimg/090328/2307546.jpg" alt="css_button" width="221" height="103" /></td>
<td>
<p align="center"><img class="aligncenter size-full wp-image-1668" title="css_button2" src="http://www.kooxo.com/uploads/allimg/090328/2307547.jpg" alt="css_button2" width="325" height="67" /></p>
</td>
</tr>
</tbody>
</table>
<p>Create some cool looking buttons using CSS only.</p>
<ul>
<li><a href="http://cssglobe.com/post/1614/4-uber-cool-css-techniques-for-links" target="_blank">3D Rollover Button using CSS</a></li>
<li><a href="http://www.oscaralexander.com/tutorials/how-to-make-sexy-buttons-with-css.html" target="_blank">How to make sexy buttons with CSS</a></li>
<li><a href="http://www.webcredible.co.uk/user-friendly-resources/css/rollover-buttons.shtml" target="_blank">CSS rollover buttons</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">6. 用CSS实现文本的浮雕和阴影特效</span></h2>
<p>Using this technique you can create iPhone like embossed Text</p>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1674" title="CSS_emboss" src="http://www.kooxo.com/uploads/allimg/090328/2307548.png" alt="CSS_emboss" width="299" height="75" /></span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="http://desizntech.info/2009/03/discover-the-cool-of-css-25-advanced-css-techniques/#">view plain</a><a onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://desizntech.info/2009/03/discover-the-cool-of-css-25-advanced-css-techniques/#">copy to clipboard</a><a onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="http://desizntech.info/2009/03/discover-the-cool-of-css-25-advanced-css-techniques/#">print</a><a onclick="dp.sh.Toolbar.Command('About',this);return false;" href="http://desizntech.info/2009/03/discover-the-cool-of-css-25-advanced-css-techniques/#">?</a></div>
</div>
<ol class="dp-css">
<li class="alt"><span><span class="value">1</span><span>. </span><span class="keyword">text-shadow</span><span>: </span><span class="value">0px</span><span> </span><span class="value">1px</span><span> </span><span class="value">0px</span><span> </span><span class="value">#e5e5ee</span><span>;  </span></span></li>
</ol>
</div>
<pre class="css" style="DISPLAY: none">   1. text-shadow: 0px 1px 0px #e5e5ee;</pre>
<ul>
<li><a href="http://www.reynoldsftw.com/2009/03/text-embossing-technique-with-css/" target="_blank">Text Embossing</a></li>
<li><a href="http://www.designmeme.com/articles/dropshadows/" target="_blank">CSS Text Drop Shadows</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">7. 使用 CSS 为文本链接添加图标</span></h2>
<p><span style="TEXT-DECORATION: underline"> </p>
<p align="center"><img class="aligncenter size-full wp-image-1678" title="icon_text" src="http://www.kooxo.com/uploads/allimg/090328/2307549.jpg" alt="icon_text" width="333" height="102" /></p>
<p> </p>
<p></span></p>
<ul>
<li><a href="http://pooliestudios.com/projects/iconize/">Add icon to the hyperlink.</a></li>
<li><a href="http://pooliestudios.com/projects/iconize/" target="_blank">Iconize Textlinks with CSS</a></li>
</ul>
<h2>8. <span style="TEXT-DECORATION: underline">CSS 格式化引用内容</span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1686" title="qoutes" src="http://www.kooxo.com/uploads/allimg/090328/23075410.jpg" alt="qoutes" width="500" height="135" /></p>
<ul>
<li><a href="http://www.designmeme.com/articles/csscurlyquotes/" target="_blank">Curly Quotes with Pure CSS</a></li>
<li><a rel="bookmark" href="http://24ways.org/2005/swooshy-curly-quotes-without-images">Swooshy Curly Quotes Without Images</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">9. 使用CSS透明属性实现超酷特效 </span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1688" title="css_opacity_menu" src="http://www.kooxo.com/uploads/allimg/090328/23075411.jpg" alt="css_opacity_menu" width="500" height="168" /></span></p>
<ul>
<li><a href="http://www.cssplay.co.uk/menus/flyout_horizontal.html" target="_blank">A CSS only fly-out menu with transparency</a></li>
<li><a href="http://www.tankedup-imaging.com/css_dev/menu2.html" target="_blank">CSS Menu using CSS opacity property</a></li>
<li><a href="http://www.mandarindesign.com/opacityblending.html" target="_blank"><strong>Opacity Background Blending Effects</strong></a>
<p align="center"><img class="aligncenter size-full wp-image-1690" title="css_watermark" src="http://www.kooxo.com/uploads/allimg/090328/23075412.jpg" alt="css_watermark" width="400" height="143" /></p>
</li>
<li><a href="http://www.freecssmenus.co.uk/menu_opacity.php" target="_blank">Transparency Menu Watermark on an image</a></li>
</ul>
<h2>10. 模糊的背景特效</h2>
<p align="center"><img class="aligncenter size-full wp-image-1693" title="blurry_bg" src="http://www.kooxo.com/uploads/allimg/090328/23075413.jpg" alt="blurry_bg" width="500" height="267" /></p>
<ul>
<li>CSS Guru Chris Coyier explains<a href="http://css-tricks.com/blurry-background-effect/" target="_blank"> h</a><a href="http://css-tricks.com/blurry-background-effect/" target="_blank">ow to create a blurry background using CSS</a></li>
</ul>
<h2>11. CSS视差特效</h2>
<p align="center"><img class="aligncenter size-full wp-image-1695" title="parallax" src="http://www.kooxo.com/uploads/allimg/090328/23075414.jpg" alt="parallax" width="497" height="180" /></p>
<ul>
<li><a href="http://forthelose.org/examples-of-and-how-to-do-the-css-parallax-effect" target="_blank">Examples of and How to Create the CSS Parallax Effect</a></li>
<li><a href="http://demo.marcofolio.net/a_parallax_illusion_with_css/" target="_blank">A parallax illusion with CSS: The Horse in Motion </a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">12.仅使用CSS创建 Lightbox 图像特效</span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1697" title="css_lightbox" src="http://www.kooxo.com/uploads/allimg/090328/23075415.jpg" alt="css_lightbox" width="400" height="213" /></span></p>
<ul>
<li>Here is another useful  <a href="http://www.emanueleferonato.com/2007/08/22/create-a-lightbox-effect-only-with-css-no-javascript-needed/" target="_blank">technique </a>that is using CSS and a little Javascript to create the lightbox effect.</li>
</ul>
<h2><span style="TEXT-DECORATION: underline">13. 纯CSS实现折叠特效</span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1699" title="css_accordian" src="http://www.kooxo.com/uploads/allimg/090328/23075416.jpg" alt="css_accordian" width="367" height="300" /></span></p>
<ul>
<li>This post explains how to <a href="http://www.cssnewbie.com/css-only-accordion/" target="_blank">create Accordion using CSS</a><span style="TEXT-DECORATION: underline"><br />
</span></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">14. <span class="taggedlink">使用简单CSS 实现文本修饰效果 </span></span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><span class="taggedlink"><a href="http://www.jankoatwarpspeed.com/post/2008/08/09/Add-grunge-effect-to-text-using-simple-CSS.aspx" target="_blank"><img class="aligncenter size-full wp-image-1701" title="grunge1" src="http://www.kooxo.com/uploads/allimg/090328/23075417.jpg" alt="grunge1" width="294" height="72" /></a></span></span></p>
<ul>
<li>In this short <a href="http://www.jankoatwarpspeed.com/post/2008/08/09/Add-grunge-effect-to-text-using-simple-CSS.aspx" target="_blank">tutorial </a>you will see how to add grunge effect to your text using just CSS and one image.</li>
</ul>
<h2><span style="TEXT-DECORATION: underline"><span class="taggedlink">15.</span>创建区块或元素悬停效果</span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1707" title="block_hover" src="http://www.kooxo.com/uploads/allimg/090328/23075418.jpg" alt="block_hover" width="430" height="283" /></span></p>
<ul>
<li><a href="http://www.smileycat.com/miaow/archives/000230.php" target="_blank">Learn how to create a block hover effect for a list of links</a></li>
<li><a href="http://phoenity.com/newtedge/element_hover/" target="_blank">CSS element hover effect.</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">16. 使用CSS实现抖动效果</span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1709" title="dither" src="http://www.kooxo.com/uploads/allimg/090328/23075419.jpg" alt="dither" width="500" height="168" /></p>
<ul>
<li>Dezinerfolio shows how to create a <a href="http://www.dezinerfolio.com/2008/11/24/simple-dither-effect-using-css/" target="_blank">dither effect using</a> CSS .</li>
</ul>
<h2><span style="TEXT-DECORATION: underline">17. 创建一个类似 liDock 的按钮效果</span></h2>
<h2><img class="aligncenter size-full wp-image-1711" title="css_dock" src="http://www.kooxo.com/uploads/allimg/090328/23075420.jpg" alt="css_dock" width="500" height="155" /></h2>
<ul>
<li><a title="Permanent Link: Horizontal Menus That Grow on You" rel="bookmark" href="http://csshowto.com/menus/horizontal-menus-that-grow-on-you/">Horizontal Menus That Grow on You</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">18. CSS 悬停翻转特效</span></h2>
<h2><img class="aligncenter size-full wp-image-1713" title="hover_swap" src="http://www.kooxo.com/uploads/allimg/090328/23075421.jpg" alt="hover_swap" width="500" height="160" /></h2>
<ul>
<li>
<p class="postTitle"><a href="http://min.frexy.com/article/css_swap_hover_effect/" target="_blank">CSS swap hover effect</a></p>
</li>
</ul>
<h2><span style="TEXT-DECORATION: underline">19. CSS实现偏振光滤镜特效</span></h2>
<p style="TEXT-ALIGN: center" align="center"><span style="TEXT-DECORATION: underline"><a href="http://www.kooxo.com/uploads/allimg/090328/23075422.jpg"><img class="aligncenter size-full wp-image-1725" title="polaroid-css" src="http://www.kooxo.com/uploads/allimg/090328/23075422.jpg" alt="polaroid-css" width="500" height="227" /></a></span></p>
<ul class="maglist">
<li>Do you like Polaroid pictures? Well using this <a href="http://www.vasudevaservice.com/blog/archive/2006/10/02/polaroid-effect-using-css-and-rest" target="_blank">technique</a> you can make the pictures on website look like Polaroid.</li>
<li><a href="http://jcornelius.com/articles/polaroidizing-photos-with-css/" target="_blank">Polaroid-izing photos with CSS and one Image.</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">20. CSS 实现杂志风格布局</span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1727" title="magazine" src="http://www.kooxo.com/uploads/allimg/090328/23075423.jpg" alt="magazine" width="500" height="314" /></p>
<ul>
<li><a href="http://www.mandarindesign.com/2004/09/magazine-style-css.html" target="_blank">Create a Magazine Type layout Using CSS</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">21. CSS 悬停框菜单</span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1731" title="Hoverbox" src="http://www.kooxo.com/uploads/allimg/090328/23075424.jpg" alt="Hoverbox" width="500" height="137" /></p>
<p align="center">A really <a href="http://www.designmeme.com/articles/hoverboxmenu/" target="_blank">cool CSS Menu</a> using Images and CSS</p>
<h2><span style="TEXT-DECORATION: underline">22. 纯CSS 实现Tab 效果 </span></h2>
<p align="center"><span style="TEXT-DECORATION: underline"><img class="aligncenter size-full wp-image-1733" title="css_tab" src="http://www.kooxo.com/uploads/allimg/090328/23075425.jpg" alt="css_tab" width="500" height="202" /></span></p>
<ul>
<li>Using CSS only <a href="http://www.3point7designs.com/blog/2007/09/12/css-tabs-css-only-dom-tabs/" target="_blank">Create a Tabbed content</a>. No jquery or Javascript at all.</li>
</ul>
<h2><span style="TEXT-DECORATION: underline">23.CSS 实现固定的背景</span></h2>
<p align="center"><a href="http://www.askthecssguy.com/examples/fixedBackgroundImages/example01.html" target="_blank"><img class="aligncenter size-full wp-image-1736" title="css_magic" src="http://www.kooxo.com/uploads/allimg/090328/23075426.jpg" alt="css_magic" width="499" height="324" /></a></p>
<ul>
<li>Ask the CSS Guy <a href="http://www.askthecssguy.com/2009/01/mike_asks_the_css_guy_about_a.html" target="_blank">shows a trick that reveals a magic </a>as you scroll.</li>
</ul>
<h2><span style="TEXT-DECORATION: underline">24.CSS提示信息</span></h2>
<p align="center"><img class="aligncenter size-full wp-image-1739" title="tool_tips" src="http://www.kooxo.com/uploads/allimg/090328/23075427.jpg" alt="tool_tips" width="500" height="178" /></p>
<ul>
<li><a href="http://lixlpixel.org/css_tooltip/" target="_blank">Show a message when hovering over the links.</a></li>
</ul>
<h2><span style="TEXT-DECORATION: underline">25. 纯CSS装载图 </span></h2>
<h2><a href="http://www.kooxo.com/uploads/allimg/090328/23075428.jpg"><img class="aligncenter size-full wp-image-1756" title="css_loader" src="http://www.kooxo.com/uploads/allimg/090328/23075428.jpg" alt="css_loader" width="500" height="239" /></a></h2>
<ul>
<li><a href="http://www.dynamixlabs.com/2008/01/17/a-quick-look-add-a-loading-icon-to-your-larger-images/" target="_blank">Add a “loading” icon to your larger images</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/453.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php采集利器——模拟浏览器类snoopy应用</title>
		<link>http://www.tisswb.com/archives/299.html</link>
		<comments>http://www.tisswb.com/archives/299.html#comments</comments>
		<pubDate>Sun, 15 Mar 2009 17:20:15 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=299</guid>
		<description><![CDATA[研究php页面数据采集的时候，无意中发现了snoopy这个类，snoopy是用php写的用以模拟浏览器功能的php类，它可以模拟访问，提交表单到你需要登录的web服务器端，同时提供了筛选信息的功能，让你可以根据需要取得自己想要的信息。
snoopy的官方网站：http://sourceforge.net/projects/snoopy/
Snoopy是一个php类，用来模拟浏览器的功能，可以获取网页内容，发送表单。
Snoopy 正确运行需要你的服务器的 PHP 版本在 4 以上，并且支持 PCRE（Perl Compatible Regular Expressions），基本的 LAMP 服务都支持。
下载snoopy
Snoopy的一些特点:
1抓取网页的内容 fetch
2 抓取网页的文本内容 (去除HTML标签) fetchtext
3抓取网页的链接，表单 fetchlinks fetchform
<span class="readmore"><a href="http://www.tisswb.com/archives/299.html" title="php采集利器——模拟浏览器类snoopy应用" target="_blank">阅读全文——共5360字</a></span>]]></description>
			<content:encoded><![CDATA[<p>研究php页面数据采集的时候，无意中发现了snoopy这个类，snoopy是用php写的用以模拟浏览器功能的php类，它可以模拟访问，提交表单到你需要登录的web服务器端，同时提供了筛选信息的功能，让你可以根据需要取得自己想要的信息。</p>
<p>snoopy的官方网站：<a href="http://sourceforge.net/projects/snoopy/" target="_blank">http://sourceforge.net/projects/snoopy/</a></p>
<p>Snoopy是一个php类，用来模拟浏览器的功能，可以获取网页内容，发送表单。</p>
<p>Snoopy 正确运行需要你的服务器的 PHP 版本在 4 以上，并且支持 PCRE（Perl Compatible Regular Expressions），基本的 LAMP 服务都支持。<br />
下载<a href="http://sourceforge.net/projects/snoopy/" target="_blank"><strong>snoopy</strong></a></p>
<p>Snoopy的一些特点:</p>
<p>1抓取网页的内容 fetch<br />
2 抓取网页的文本内容 (去除HTML标签) fetchtext<br />
3抓取网页的链接，表单 fetchlinks fetchform<br />
4 支持代理主机<br />
5支持基本的用户名/密码验证<br />
6 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)<br />
7支持浏览器重定向，并能控制重定向深度<br />
8能把网页中的链接扩展成高质量的url(默认)<br />
9提交数据并且获取返回值<br />
10 支持跟踪HTML框架<br />
11支持重定向的时候传递cookies<br />
要求php4以上就可以了 由于本身是php一个类 无需扩支持 服务器不支持curl时候的最好选择，</p>
<p>类方法:</p>
<p>fetch($URI)<br />
———–</p>
<p>这是为了抓取网页的内容而使用的方法。<br />
$URI参数是被抓取网页的URL地址。<br />
抓取的结果被存储在 $this-&gt;results 中。<br />
如果你正在抓取的是一个框架，Snoopy将会将每个框架追踪后存入数组中，然后存入 $this-&gt;results。</p>
<p>fetchtext($URI)<br />
—————</p>
<p>本方法类似于fetch()，唯一不同的就是本方法会去除HTML标签和其他的无关数据，只返回网页中的文字内容。</p>
<p>fetchform($URI)<br />
—————</p>
<p>本方法类似于fetch()，唯一不同的就是本方法会去除HTML标签和其他的无关数据，只返回网页中表单内容(form)。</p>
<p>fetchlinks($URI)<br />
—————-</p>
<p>本方法类似于fetch()，唯一不同的就是本方法会去除HTML标签和其他的无关数据，只返回网页中链接(link)。<br />
默认情况下，相对链接将自动补全，转换成完整的URL。</p>
<p>submit($URI,$formvars)<br />
———————-</p>
<p>本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。</p>
<p>submittext($URI,$formvars)<br />
————————–</p>
<p>本方法类似于submit()，唯一不同的就是本方法会去除HTML标签和其他的无关数据，只返回登陆后网页中的文字内容。</p>
<p>submitlinks($URI)<br />
—————-</p>
<p>本方法类似于submit()，唯一不同的就是本方法会去除HTML标签和其他的无关数据，只返回网页中链接(link)。<br />
默认情况下，相对链接将自动补全，转换成完整的URL。</p>
<p>类属性: (缺省值在括号里)</p>
<p>$host 连接的主机<br />
$port 连接的端口<br />
$proxy_host 使用的代理主机，如果有的话<br />
$proxy_port 使用的代理主机端口，如果有的话<br />
$agent 用户代理伪装 (Snoopy v0.1)<br />
$referer 来路信息，如果有的话<br />
$cookies cookies， 如果有的话<br />
$rawheaders 其他的头信息, 如果有的话<br />
$maxredirs 最大重定向次数， 0=不允许 (5)<br />
$offsiteok whether or not to allow redirects off-site. (true)<br />
$expandlinks 是否将链接都补全为完整地址 (true)<br />
$user 认证用户名, 如果有的话<br />
$pass 认证用户名, 如果有的话<br />
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)<br />
$error 哪里报错, 如果有的话<br />
$response_code 从服务器返回的响应代码<br />
$headers 从服务器返回的头信息<br />
$maxlength 最长返回数据长度<br />
$read_timeout 读取操作超时 (requires PHP 4 Beta 4+)<br />
设置为0为没有超时<br />
$timed_out 如果一次读取操作超时了，本属性返回 true (requires PHP 4 Beta 4+)<br />
$maxframes 允许追踪的框架最大数量<br />
$status 抓取的http的状态<br />
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp)<br />
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false</p>
<p>以下是demo</p>
<div><code lang="php"><br />
[codesyntax lang="php"]</p>
<pre>include "Snoopy.class.php";
$snoopy = new Snoopy; 

$snoopy-&gt;proxy_host = "www.baidu.com";
$snoopy-&gt;proxy_port = "8080"; 

$snoopy-&gt;agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";
$snoopy-&gt;referer = "http://www.baidu.com/"; 

$snoopy-&gt;cookies["SessionID"] = 238472834723489l;
$snoopy-&gt;cookies["favoriteColor"] = "RED"; 

$snoopy-&gt;rawheaders["Pragma"] = "no-cache"; 

$snoopy-&gt;maxredirs = 2;
$snoopy-&gt;offsiteok = false;
$snoopy-&gt;expandlinks = false; 

$snoopy-&gt;user = "joe";
$snoopy-&gt;pass = "bloe"; 

if($snoopy-&gt;fetchtext("http://www.baidu.com"))
{
echo " ".htmlspecialchars($snoopy-&gt;results)."n";

}

else

echo "error fetching document: ".$snoopy-&gt;error."n";</pre>
<p>[/codesyntax]</code><code lang="php"><br />
</code></div>
<p>snoopy采集示例<br />
<code lang="php"><br />
&lt; ?php<br />
//采集phpchina<br />
set_time_limit(0);<br />
require_once("Snoopy.class.php");<br />
$snoopy=new Snoopy();<br />
//登陆论坛<br />
$submit_url = "http://www.phpchina.com/bbs/logging.php?action=login";<br />
$submit_vars["loginmode"] = "normal";<br />
$submit_vars["styleid"] = "1";<br />
$submit_vars["cookietime"] = "315360000";<br />
$submit_vars["loginfield"] = "username";<br />
$submit_vars["username"] = "***"; //你的用户名<br />
$submit_vars["password"] = "*****"; //你的密码<br />
$submit_vars["questionid"] = "0";<br />
$submit_vars["answer"] = "";<br />
$submit_vars["loginsubmit"] = "提 交";<br />
$snoopy-&gt;submit($submit_url,$submit_vars);<br />
if ($snoopy-&gt;results)<br />
{<br />
//获取连接地址<br />
$snoopy-&gt;fetchlinks("http://www.phpchina.com/bbs");<br />
$url=array();<br />
$url=$snoopy-&gt;results;<br />
//print_r($url);<br />
foreach ($url as $key=&gt;$value)<br />
{<br />
//匹配http://www.phpchina.com/bbs/forumdisplay.php?fid=156&amp;sid=VfcqTR地址即论坛板块地址<br />
if (!preg_match("/^(http://www.phpchina.com/bbs/forumdisplay.php?fid=)[0-9]*&amp;sid=[a-zA-Z]{6}/i",$value))<br />
{<br />
unset($url[$key]);<br />
}<br />
}<br />
//print_r($url);<br />
//获取到板块数组$url，循环访问，此处获取第一个模块第一页的数据<br />
$i=0;<br />
foreach ($url as $key=&gt;$value)<br />
{<br />
if ($i&gt;=1)<br />
{<br />
//测试限制<br />
break;<br />
}<br />
else<br />
{<br />
//访问该模块，提取帖子的连接地址，正式访问里需要提取帖子分页的数据，然后根据分页数据提取帖子数据<br />
$snoopy=new Snoopy();<br />
$snoopy-&gt;fetchlinks($value);<br />
$tie=array();<br />
$tie[$i]=$snoopy-&gt;results;<br />
//print_r($tie);<br />
//转换数组<br />
foreach ($tie[$i] as $key=&gt;$value)<br />
{<br />
//匹配http://www.phpchina.com/bbs/viewthread.php?tid=68127&amp;extra=page%3D1&amp;page=1&amp;sid=iBLZfK<br />
if (!preg_match("/^(http://www.phpchina.com/bbs/viewthread.php?tid=)[0-9]*&amp;extra=page%3D1&amp;page=[0-9]*&amp;sid=[a-zA-Z]{6}/i",$value))<br />
{<br />
unset($tie[$i][$key]);<br />
}<br />
}<br />
//print_r($tie[$i]);<br />
//归类数组，将同一个帖子不同页面的内容放一个数组里<br />
$left='';//连接左边公用地址<br />
$j=0;<br />
$page=array();<br />
foreach ($tie[$i] as $key=&gt;$value)<br />
{<br />
$left=substr($value,0,52);<br />
$m=0;<br />
foreach ($tie[$i] as $pkey=&gt;$pvalue)<br />
{<br />
//重组数组<br />
if (substr($pvalue,0,52)==$left)<br />
{<br />
$page[$j][$m]=$pvalue;<br />
$m++;<br />
}<br />
}<br />
$j++;<br />
}<br />
//去除重复项开始<br />
//$page=array_unique($page);只能用于一维数组<br />
$paget[0]=$page[0];<br />
$nums=count($page);<br />
for ($n=1;$n&lt; $nums;$n++)<br />
{<br />
$paget[$n]=array_diff($page[$n],$page[$n-1]);<br />
}<br />
//去除多维数组重复值结束<br />
//去除数组空值<br />
unset($page);<br />
$page=array();//重新定义page数组<br />
$page=array_filter($paget);<br />
//print_r($page);<br />
$u=0;<br />
$title=array();<br />
$content=array();<br />
$temp='';<br />
$tt=array();<br />
foreach ($page as $key=&gt;$value)<br />
{<br />
//外围循环，针对一个帖子<br />
if (is_array($value))<br />
{<br />
foreach ($value as $k1=&gt;$v1)<br />
{<br />
//页内循环，针对一个帖子的N页<br />
$snoopy=new Snoopy();<br />
$snoopy-&gt;fetch($v1);<br />
$temp=$snoopy-&gt;results;<br />
//读取标题<br />
if (!preg_match_all("/</p>
<h2>(.*)&lt; /h2&gt;/i",$temp,$tt))<br />
{<br />
echo "no title";<br />
exit;<br />
}<br />
else<br />
{<br />
$title[$u]=$tt[1][1];<br />
}<br />
unset($tt);<br />
//读取内容<br />
if (!preg_match_all("/</p>
<div id="postmessage_[0-9]{1,8}" class="t_msgfont">(.*)&lt; /div&gt;/i",$temp,$tt))<br />
{<br />
print_r($tt);<br />
echo "no content1";<br />
exit;<br />
}<br />
else<br />
{<br />
foreach ($tt[1] as $c=&gt;$c2)<br />
{<br />
$content[$u].=$c2;<br />
}<br />
}<br />
}<br />
}<br />
else<br />
{<br />
//直接取页内容<br />
$snoopy=new Snoopy();<br />
$snoopy-&gt;fetch($value);<br />
$temp=$snoopy-&gt;results;<br />
//读取标题<br />
if (!preg_match_all("/</p>
<h2>(.*)&lt; /h2&gt;/i",$temp,$tt))<br />
{<br />
echo "no title";<br />
exit;<br />
}<br />
else<br />
{<br />
$title[$u]=$tt[1][1];<br />
}<br />
unset($tt);<br />
//读取内容<br />
if (!preg_match_all("/</p>
<div id="postmessage_[0-9]*" class="t_msgfont">(.*)&lt; /div&gt;/i",$temp,$tt))<br />
{<br />
echo "no content2";<br />
exit;<br />
}<br />
else<br />
{<br />
foreach ($tt[1] as $c=&gt;$c2)<br />
{<br />
$content[$u].=$c2;<br />
}<br />
}<br />
}<br />
$u++;<br />
}<br />
print_r($content);<br />
}<br />
$i++;<br />
}<br />
}<br />
else<br />
{<br />
echo "login failed";<br />
exit;<br />
}<br />
?&gt;</div>
</h2>
</div>
</h2>
<p> </p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/299.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP抓取远程网站数据的代码</title>
		<link>http://www.tisswb.com/archives/287.html</link>
		<comments>http://www.tisswb.com/archives/287.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 20:57:18 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=287</guid>
		<description><![CDATA[这几天开发一套新的采集系统，整理了一些这方面的资料：如何像搜索引擎那样去抓取别人网站的HTML代码,然后把代码收集整理成为自己有用的数据!今天就等我介绍一些简单例子吧.
Ⅰ.抓取远程网页标题的例子:

< ?php
/*
+-------------------------------------------------------------
+抓取网页标题的代码,直接拷贝本代码片段,另存为.php文件执行即可.
+-------------------------------------------------------------
*/
error_reporting(7);
<span class="readmore"><a href="http://www.tisswb.com/archives/287.html" title="PHP抓取远程网站数据的代码" target="_blank">阅读全文——共1792字</a></span>]]></description>
			<content:encoded><![CDATA[<p>这几天开发一套新的采集系统，整理了一些这方面的资料：如何像搜索引擎那样去抓取别人网站的HTML代码,然后把代码收集整理成为自己有用的数据!今天就等我介绍一些简单例子吧.</p>
<p><strong>Ⅰ.抓取远程网页标题的例子:</strong></p>
<p><code lang="php" linenum="on"><br />
< ?php<br />
/*<br />
+-------------------------------------------------------------<br />
+抓取网页标题的代码,直接拷贝本代码片段,另存为.php文件执行即可.<br />
+-------------------------------------------------------------<br />
*/<br />
error_reporting(7);<br />
$file = fopen ("http://www.dnsing.com/", "r");<br />
if (!$file) {<br />
echo "<font color=red>Unable to open remote file.n";<br />
exit;<br />
}<br />
while (!feof ($file)) {<br />
$line = fgets ($file, 1024);<br />
if (eregi ("", $line, $out)) {<br />
$title = $out[1];<br />
echo "".$title."";<br />
break;<br />
}<br />
}<br />
fclose($file); </p>
<p>//End<br />
?><br />
</code></p>
<p><strong>Ⅱ.抓取远程网页HTML代码的例子:</strong></p>
<p><code lang="php" linenum="on"><br />
< ? php<br />
/*<br />
+----------------<br />
+DNSing Sprider<br />
+----------------<br />
*/</p>
<p>$fp = fsockopen("www.dnsing.com", 80, $errno, $errstr, 30);<br />
if (!$fp) {<br />
   echo "$errstr ($errno)<br/>n";<br />
} else {<br />
   $out = "GET / HTTP/1.1rn";<br />
   $out .= "Host: www.dnsing.com rn";<br />
   $out .= "Connection: Close rnrn";<br />
   fputs($fp, $out);<br />
   while (!feof($fp)) {<br />
     echo fgets($fp, 128);<br />
   }<br />
   fclose($fp);<br />
}<br />
//End<br />
?></code></p>
<p>以上两个代码片段都直接Copy回去运行就知道效果了,上面的例子只是抓取网页数据的雏形,要使其更适合自己的使用,情况有各异.所以,在此各位程序爱好者自己好好研究一下吧.</p>
<p>===============================</p>
<p>稍微有点意义的函数是：get_content_by_socket(), get_url(), get_content_url(), get_content_object 几个函数，也许能够给你点什么想法。</p>
<p><code lang="php" linenum="on"><br />
< ?php </p>
<p>//获取所有内容url保存到文件<br />
function get_index($save_file, $prefix="index_"){<br />
     $count = 68;<br />
     $i = 1;<br />
     if (file_exists($save_file)) @unlink($save_file);<br />
     $fp = fopen($save_file, "a+") or die("Open ". $save_file ." failed");<br />
     while($i<$count){<br />
         $url = $prefix . $i .".htm";<br />
         echo "Get ". $url ."...";<br />
         $url_str = get_content_url(get_url($url));<br />
         echo " OKn";<br />
         fwrite($fp, $url_str);<br />
         ++$i;<br />
     }<br />
     fclose($fp);<br />
} </p>
<p>//获取目标多媒体对象<br />
function get_object($url_file, $save_file, $split="|--:**:--|"){<br />
     if (!file_exists($url_file)) die($url_file ." not exist");<br />
     $file_arr = file($url_file);<br />
     if (!is_array($file_arr) || empty($file_arr)) die($url_file ." not content");<br />
     $url_arr = array_unique($file_arr);<br />
     if (file_exists($save_file)) @unlink($save_file);<br />
     $fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");<br />
     foreach($url_arr as $url){<br />
         if (empty($url)) continue;<br />
         echo "Get ". $url ."...";<br />
         $html_str = get_url($url);<br />
         echo $html_str;<br />
         echo $url;<br />
         exit;<br />
         $obj_str = get_content_object($html_str);<br />
         echo " OKn";<br />
         fwrite($fp, $obj_str);<br />
     }<br />
     fclose($fp);<br />
} </p>
<p>//遍历目录获取文件内容<br />
function get_dir($save_file, $dir){<br />
     $dp = opendir($dir);<br />
     if (file_exists($save_file)) @unlink($save_file);<br />
     $fp = fopen($save_file, "a+") or die("Open save file ". $save_file ." failed");<br />
     while(($file = readdir($dp)) != false){<br />
         if ($file!="." &#038;&#038; $file!=".."){<br />
             echo "Read file ". $file ."...";<br />
             $file_content = file_get_contents($dir . $file);<br />
             $obj_str = get_content_object($file_content);<br />
             echo " OKn";<br />
             fwrite($fp, $obj_str);<br />
         }<br />
     }<br />
     fclose($fp);<br />
} </p>
<p>//获取指定url内容<br />
function get_url($url){<br />
     $reg = '/^http://[^/].+$/';<br />
     if (!preg_match($reg, $url)) die($url ." invalid");<br />
     $fp = fopen($url, "r") or die("Open url: ". $url ." failed.");<br />
     while($fc = fread($fp, 8192)){<br />
         $content .= $fc;<br />
     }<br />
     fclose($fp);<br />
     if (empty($content)){<br />
         die("Get url: ". $url ." content failed.");<br />
     }<br />
     return $content;<br />
} </p>
<p>//使用socket获取指定网页<br />
function get_content_by_socket($url, $host){<br />
     $fp = fsockopen($host, 80) or die("Open ". $url ." failed");<br />
     $header = "GET /".$url ." HTTP/1.1rn";<br />
     $header .= "Accept: */*rn";<br />
     $header .= "Accept-Language: zh-cnrn";<br />
     $header .= "Accept-Encoding: gzip, deflatern";<br />
     $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)rn";<br />
     $header .= "Host: ". $host ."rn";<br />
     $header .= "Connection: Keep-Alivern";<br />
     //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-rnrn";<br />
     $header .= "Connection: Closernrn"; </p>
<p>     fwrite($fp, $header);<br />
     while (!feof($fp)) {<br />
         $contents .= fgets($fp, 8192);<br />
     }<br />
     fclose($fp);<br />
     return $contents;<br />
} </p>
<p>//获取指定内容里的url<br />
function get_content_url($host_url, $file_contents){ </p>
<p>     //$reg = '/^(#|javascript.*?|ftp://.+|http://.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';<br />
     //$reg = '/^(down.*?.html|d+_d+.htm.*?)$/i';<br />
     $rex = "/([hH][rR][eE][Ff])s*=s*['"]*([^>'"s]+)["'>]*s*/i";<br />
     $reg = '/^(down.*?.html)$/i';<br />
     preg_match_all ($rex, $file_contents, $r);<br />
     $result = ""; //array();<br />
     foreach($r as $c){<br />
         if (is_array($c)){<br />
             foreach($c as $d){<br />
                 if (preg_match($reg, $d)){ $result .= $host_url . $d."n"; }<br />
             }<br />
         }<br />
     }<br />
     return $result;<br />
} </p>
<p>//获取指定内容中的多媒体文件<br />
function get_content_object($str, $split="|--:**:--|"){<br />
     $regx = "/hrefs*=s*['"]*([^>'"s]+)["'>]*s*(<b>.*?< /b>)/i";<br />
     preg_match_all($regx, $str, $result); </p>
<p>     if (count($result) == 3){<br />
         $result[2] = str_replace("</b><b>多媒体： ", "", $result[2]);<br />
         $result[2] = str_replace("</b>", "", $result[2]);<br />
         $result = $result[1][0] . $split .$result[2][0] . "n";<br />
     }<br />
     return $result;<br />
} </p>
<p>?> </code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/287.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php小偷程序原理分析</title>
		<link>http://www.tisswb.com/archives/284.html</link>
		<comments>http://www.tisswb.com/archives/284.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 20:51:59 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=284</guid>
		<description><![CDATA[拿华军软件开刀,经过今天的教程以后,我相信大家都能偷.
当然,你想偷别的站也是一个道理.关键是方法.
我们打开华军软件园主站地址:
http://www.onlinedown.net/index.htm
当打开完成以后,点 查看&#8211;查看源文件
系统会用记事本显示出来首页的HTML代码.
/*
&#60;title&#62;华军软件园——共享软件发布-下载-学习-研究-交流之园(推荐用1024*768)&#60;/title&#62;
*/
看见这一行没?这就是标题.
<span class="readmore"><a href="http://www.tisswb.com/archives/284.html" title="php小偷程序原理分析" target="_blank">阅读全文——共10526字</a></span>]]></description>
			<content:encoded><![CDATA[<p>拿华军软件开刀,经过今天的教程以后,我相信大家都能偷.<br />
当然,你想偷别的站也是一个道理.关键是方法.<br />
我们打开华军软件园主站地址:<br />
<a href="http://www.onlinedown.net/index.htm">http://www.onlinedown.net/index.htm</a></p>
<p>当打开完成以后,点 查看&#8211;查看源文件<br />
系统会用记事本显示出来首页的HTML代码.</p>
<p>/*<br />
&lt;title&gt;华军软件园——共享软件发布-下载-学习-研究-交流之园(推荐用1024*768)&lt;/title&gt;<br />
*/<br />
看见这一行没?这就是标题.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
写小偷需要能看懂HTML才行哦?如果你一点HTML都看不懂的话,那就学起来有难度.<br />
现在大家从HTML中,找出华军软件园首页的<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
软件总数:30738 更新:287<br />
国产软件:160国外软件:113<br />
汉化补丁:13 数码软件:1<br />
杀毒快报:10 资讯中心:42<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
以上信息从HTML代码从 哪里开始.<br />
是单独表格还是在表格内的行,或者列.<br />
不会也没关系,看多了就会了.如果你不会以后想成为神偷就有难度,所以现在开始就得学习了.</p>
<p>好了,讲了这么多,就是告诉大家,小偷就是用ASP,PHP或者其他语言在程序中打开并且处理这些HTML<br />
拿PHP讲<br />
&lt;?php<br />
$files=&#8221;http://www.onlinedown.net/index.htm&#8221;;<br />
$fp=fopen($files,&#8221;a&#8221;);<br />
&#8230;..<br />
&#8230;&#8230;<br />
?&gt;<br />
把打开的HTML代码进行切割,更换.<br />
比如刚才叫大家找的.下面的信息<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
软件总数:30738 更新:287<br />
国产软件:160国外软件:113<br />
汉化补丁:13 数码软件:1<br />
杀毒快报:10 资讯中心:42<br />
&#8212;&#8212;&#8212;&#8212;&#8211;<br />
PHP就是处理这个index.htm<br />
把你要的信息切割处理.简单的这么讲<br />
&#8211;<br />
首页更新 = 从index.htm中切割出首页更新内容<br />
&#8211;<br />
然后在你要显示的地方输出,就显示了上面内容.</p>
<p>其他内容也是一样处理.<br />
处理原理就是这样.所以说是一直自动更新.<br />
按照你的办法切割着首页.它首页内容变新了,当访问你小偷的时候,你切割出来的内容是他的内容,所以是同步时时的内容.</p>
<p>今天就讲这么多,就弄明白原理,知道怎么回事就可以,别往深处想.如果你看不懂HTML的话,应该花几个小时看看了.以后要用.<br />
对自己要有信心,其实每个人都很聪明的.知识是慢慢积累的.<br />
我相信经过我几天的教程,到最后你能写出你自己的小偷来!</p>
<p>____________________________________________________________________________________________</p>
<p>今天教第二天.<br />
有个朋友说的好,其实教功夫也是变相的教你怎么杀人,可是不说出来.<br />
所以这个教程从下一篇开始就改个名字<br />
叫&lt;远程操作对方数据程序&gt;有点土比小偷好听<br />
第二天.<br />
教几个函数给大家.<br />
1 读取判断函数<br />
2 更新cache函数<br />
3 写入文件函数<br />
4 切割字符函数<br />
5 读取字符函数<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
在我们想写之前我们先要做好准备,构思一下怎么去写.<br />
制作前构思1<br />
我们打开华军首页<br />
[url]http://www.onlinedown.net/[/url]<br />
经过我们统计,是不是发现它的连接有个很相同的规则?<br />
1 根目录的index.htm文件<br />
2 soft文件夹的 1.htm &#8230;&#8230;.30000.htm<br />
3 sort文件夹的 1_1.htm   200_1.htm<br />
4 a-z文件夹 1.htm &#8230;.200.htm<br />
到此我们可以想好一个打开函数,不是根目录 就是文件夹/名字<br />
只有2中可能.<br />
制作前构思2<br />
为了让速度更快,我们最好把内容读过来存储起来.<br />
1 减少了对对方站点的请求.<br />
2 提供了速度.<br />
这里我们判断这个文件写入的时间为准 我们自己设置一个时间<br />
当写入时间 和现在的时间比一下,如果在我们的设置时间内的话.就是可以.<br />
如果不在比如<br />
文件写入时间 2004年5月18好 06:00 我们现在时间是2004年5月19号 18:00<br />
我们设置时间是1个小时<br />
当再次请求这个文件的时候 他发现已经过期了.就会重新向对方请求一次并且存入.<br />
制作前构思3<br />
为了以后频繁的操作简单话,把固定的操作写进一个函数.<br />
切割字符.<br />
一般切割就是 从第一个位置   切割到第二个位置 然后取中间部分<br />
比如:<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;演示站点&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
从&lt;title&gt;开始切割到&lt;/title&gt;<br />
那切割出来的 就是 &#8220;演示站点&#8221;4个字<br />
如果说,可以找到   几个 &lt;title&gt;怎么办?程序会从第一处开始切割<br />
到这里构思差不多..<br />
程序要干净明了才行,不要这一个文件不知道什么,那一个文件不知道哪来.<br />
所以,如果你以后有做大站的机会的话,文件夹,文件一定要写的清楚,分的清楚.<br />
既然明白了构思,我们就开始动手做了.<br />
建立我们第一个PHP文件:<br />
你可以用记事本,可以用Dreamweaver也可以用专用PHP编辑软件<br />
取名字为 commom.php<br />
内容为<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
&lt;?php<br />
include &#8216;./config.php&#8217;;<br />
include &#8216;./global.php&#8217;;<br />
?&gt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
这个文件有什么用?就是在以后操作中直接 inclue 这个文件就可以用到所有的函数啊什么的<br />
然后config.php是设置 URL 刷新时间 等等<br />
global.php是 所有函数的文件<br />
也就是今天要给教给大家的!<br />
第一个个函数 open<br />
&#8212;&#8212;&#8212;&#8212;-<br />
function open($file,$type=&#8221;){<br />
         global $fromurl,$referer;<br />
         $cachename=$file;<br />
                 if($type){<br />
                         $file=$fromurl.&#8217;/&#8217;.$type.&#8217;/&#8217;.$file;<br />
                 }else{<br />
                         $file=$fromurl.$file;<br />
                 }</p>
<p>                <br />
                <br />
                <br />
                         if($open=file($file)){<br />
                                         $count=count($open);<br />
                                         for($i=0;$i&lt;$count;$i++){<br />
                                                 $theget.=$open[$i];</p>
<p>                                         }<br />
                                        <br />
                                 }else{<br />
                                         die(&#8216;请求过多，超时，请刷新&#8217;);<br />
                                 }<br />
                <br />
                <br />
         return $theget;</p>
<p>}<br />
&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
解释过了,连接地址就2中请求,根目录,和 文件夹/名字<br />
函数怎么用法等等,不多说了.建议大家下载译本PHP中文手册看看.<br />
第二个函数<br />
根据设置时间更新cache目录文件函数 update<br />
&#8212;&#8212;&#8212;&#8212;&#8212;<br />
function update($file,$type=&#8221;){<br />
         global $timestamp,$flush;<br />
         if(!file_exists(&#8220;cache/$file&#8221;)){<br />
                 if($type){<br />
                         $data=open($file,$type);<br />
                 }else{<br />
                         $data=open($file);<br />
                 }<br />
                <br />
                 writetofile(&#8220;cache/$file&#8221;,$data);<br />
         }else{<br />
                 $lastflesh=@filemtime(&#8220;cache/$file&#8221;);<br />
                <br />
        <br />
        <br />
                 if($lastflesh + ($flush * 60) &lt; $timestamp ){<br />
                         if($type){<br />
                                 $data=open($file,$type);<br />
                         }else{<br />
                                 $data=open($file);<br />
                         }<br />
                         writetofile(&#8220;cache/$file&#8221;,$data);<br />
                 }<br />
         }</p>
<p>}<br />
&#8212;&#8212;&#8211;<br />
简单解释<br />
$data=open($file,$type);就是用到上面的 open函数了<br />
如果我们用 udate(&#8220;index.htm&#8221;);<br />
那不就是用到了 update函数吗? 明白吗?<br />
上面出现了writetofile函数 下面是代码<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
function writetofile($file_name,$data,$method=&#8221;w&#8221;) {<br />
         if($filenum=fopen($file_name,$method)){<br />
                 flock($filenum,LOCK_EX);<br />
                 $file_data=fwrite($filenum,$data);<br />
                 fclose($filenum);<br />
                 return $file_data;<br />
         }else{<br />
                 return false;<br />
         }<br />
}&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
切割字符函数<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
function cut($file,$from,$end){</p>
<p>         $message=explode($from,$file);<br />
         $message=explode($end,$message[1]);<br />
return         $message[0];<br />
}<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
读取函数<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
function readfromfile($file_name) {<br />
         if($filenum=fopen($file_name,&#8221;r&#8221;)){<br />
                 flock($filenum,LOCK_SH);<br />
                 $file_data=fread($filenum,filesize($file_name));<br />
                 fclose($filenum);<br />
                 return $file_data;<br />
         }else{<br />
                 return false;<br />
         }<br />
        <br />
}<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
把所有函数写成一个文件 保存起来 取名字叫 global.php<br />
内容如下:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
&lt;?php<br />
function open($file,$type=&#8221;){<br />
         global $fromurl,$referer;<br />
         $cachename=$file;<br />
                 if($type){<br />
                         $file=$fromurl.&#8217;/&#8217;.$type.&#8217;/&#8217;.$file;<br />
                 }else{<br />
                         $file=$fromurl.$file;<br />
                 }</p>
<p>                <br />
                <br />
                <br />
                         if($open=file($file)){<br />
                                         $count=count($open);<br />
                                         for($i=0;$i&lt;$count;$i++){<br />
                                                 $theget.=$open[$i];</p>
<p>                                         }<br />
                                        <br />
                                 }else{<br />
                                         die(&#8216;请求过多，超时，请刷新&#8217;);<br />
                                 }<br />
                <br />
                <br />
         return $theget;</p>
<p>}</p>
<p>function update($file,$type=&#8221;){<br />
//更新cache中的文件<br />
         global $timestamp,$flush;<br />
         if(!file_exists(&#8220;cache/$file&#8221;)){<br />
                 if($type){<br />
                         $data=open($file,$type);<br />
                 }else{<br />
                         $data=open($file);<br />
                 }<br />
                <br />
                 writetofile(&#8220;cache/$file&#8221;,$data);<br />
         }else{<br />
                 $lastflesh=@filemtime(&#8220;cache/$file&#8221;);<br />
                <br />
        <br />
        <br />
                 if($lastflesh + ($flush * 60) &lt; $timestamp ){<br />
                         if($type){<br />
                                 $data=open($file,$type);<br />
                         }else{<br />
                                 $data=open($file);<br />
                         }<br />
                         writetofile(&#8220;cache/$file&#8221;,$data);<br />
                 }<br />
         }</p>
<p>}<br />
function readfromfile($file_name) {<br />
         if($filenum=fopen($file_name,&#8221;r&#8221;)){<br />
                 flock($filenum,LOCK_SH);<br />
                 $file_data=fread($filenum,filesize($file_name));<br />
                 fclose($filenum);<br />
                 return $file_data;<br />
         }else{<br />
                 return false;<br />
         }<br />
        <br />
}</p>
<p>function writetofile($file_name,$data,$method=&#8221;w&#8221;) {<br />
         if($filenum=fopen($file_name,$method)){<br />
                 flock($filenum,LOCK_EX);<br />
                 $file_data=fwrite($filenum,$data);<br />
                 fclose($filenum);<br />
                 return $file_data;<br />
         }else{<br />
                 return false;<br />
         }<br />
}<br />
function cut($file,$from,$end){</p>
<p>         $message=explode($from,$file);<br />
         $message=explode($end,$message[1]);<br />
return         $message[0];<br />
}<br />
function updatecache($file,$cache=&#8221;){<br />
         global $timestamp,$flush;<br />
         if(!file_exists($file)){<br />
                 writetofile($file,$cache);<br />
                 $return=$cache;<br />
         }elseif(@filemtime($file) &lt; $timestamp &#8211; ($flush * 60)){<br />
                 writetofile($file,$cache);<br />
                 $return=$cache;<br />
         }else{<br />
                 $return=readfromfile($file);        <br />
         }<br />
         return $return;<br />
}<br />
?&gt;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
其中有几个变量在config.php中设置一下<br />
我们建立config.php文件 内容如下:<br />
&lt;?php<br />
$fromurl = &#8220;http://www.onlinedown.net/&#8221;;<br />
$flush=&#8221;120&#8243;;//update函数中自动同步更新时间<br />
?&gt;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
现在位置我们有了3个文件了 commom.php config.php global.php<br />
有了3个文件 程序总体完成了.接下来如何去偷呢?<br />
心急的人可以先试试<br />
建立一个index.php文件 就是首页<br />
你先做好模板 的样子<br />
HTML先做好.<br />
然后在<br />
&lt;html&gt;<br />
&#8230;&#8230;..<br />
&#8230;&#8230;..<br />
&lt;/html&gt;<br />
的上方插入PHP代码<br />
如下:<br />
&lt;?php<br />
require &#8216;./commom.php&#8217;;<br />
update(&#8220;index.htm&#8221;);<br />
$file=readfromfile(&#8220;cache/index.htm&#8221;);<br />
$gwrj = cut($file,&#8221;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;,&#8221;&lt;/TD&gt;&#8221;);<br />
?&gt;<br />
&lt;html&gt;<br />
&#8230;&#8230;.<br />
&#8230;&#8230;<br />
&#8230;&#8230;.<br />
&lt;/html&gt;<br />
在你想要插入的地方插入&lt;?php echo $gwrj; ?&gt;<br />
就是从首页中切割出来的国外软件<br />
自己试试</p>
<p>___________________________________________________________________________________________</p>
<p>今天我们教,偷取首页.不同的首页需要不同的偷法,主要是分析HTML代码.函数以及方法前面2天介绍的很清楚了.今天我们在实践中讲解和使用.</p>
<p>还是拿华军软件园开刀.<br />
<a href="http://www.onlinedown.net/index.htm">http://www.onlinedown.net/index.htm</a><br />
用Dreamweaver新建一个index.php的页子.<br />
注意:<br />
先做好你要的首页模板,然后开始偷首页.由于考虑到对初学者的教程.所以先把模板和PHP处理代码放在同一个网页中.<br />
以后教大家HTML和PHP的分离.</p>
<p>模板建立好以后,我们就开偷.<br />
在&lt;html&gt;<br />
的上方插入PHP代码,如下形式:<br />
&lt;?<br />
require &#8216;./commom.php&#8217;;<br />
update(&#8220;index.htm&#8221;);<br />
$file=readfromfile(&#8220;cache/index.htm&#8221;);</p>
<p>?&gt;<br />
解释<br />
require &#8216;./commom.php&#8217;//引入commom.php文件<br />
update(&#8220;index.htm&#8221;)//读取写入index.htm网页<br />
$file=readfromfile(&#8220;cache/index.htm&#8221;)//从本地文件夹cache中读取index.htm<br />
这里的$file是一个变量,你可以随便取名.也可以叫它 $html<br />
但是后面用到的时候要统一.</p>
<p>上面代码,没有处理任何东西,也没有输出任何的东西.如果说输出$file的话,那么就是index.htm的所有html代码.<br />
下面就开始到index.htm中拿我们想要的东东.</p>
<p>1 拿国外软件更新的代码.<br />
大家可以取一个变量名为 $gwrj    //国外软件 名字随便取<br />
怎么从这个index.htm拿出这个我们想要的国外软件呢?这里拿出我们上一节讲过的cut函数<br />
$gwrj = cut($file,&#8221;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;,&#8221;&lt;/TD&gt;&#8221;);<br />
解释<br />
$xxx = cut($file,&#8221;$first&#8221;,&#8221;$end&#8221;);<br />
如何工作的呢?就是把$file(index.htm)从$first处切割取下面部分,在切割$end取上面部分.<br />
比如说:<br />
$file = &#8220;111222333444&#8243;;<br />
$xxx = cut($file,&#8221;1&#8243;,&#8221;3&#8243;);//结果是11222 这样的解释应该明白吧?<br />
注意:<br />
&#8220;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;<br />
在&#8221; &#8220;内的内容 如果也有 &#8221; 的话,需要在前面加<br />
例子<br />
&#8220;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;<br />
成为<br />
&#8220;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;<br />
下面这段代码就是成功偷取了国外软件:<br />
&lt;?<br />
require &#8216;./commom.php&#8217;;<br />
update(&#8220;index.htm&#8221;);<br />
$file=readfromfile(&#8220;cache/index.htm&#8221;);<br />
$gwrj = cut($file,&#8221;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;,&#8221;&lt;/TD&gt;&#8221;);<br />
?&gt;<br />
然后在你的html模板中,在需要显示的地方插入代码<br />
&lt;? echo $gwrj; ?&gt;</p>
<p>其他偷取也一样.<br />
注意:<br />
这里拿出来的HTML需要更换为自己的代码,可以总的更换,也可以一个一个更换.<br />
我们讲单独更换代码就是:<br />
$gwrj = cut($file,&#8221;&lt;TD width=&#8221;307&#8243; height=&#8221;118&#8243;&gt;&#8221;,&#8221;&lt;/TD&gt;&#8221;);<br />
$gwrj = str_replace(&#8220;soft/&#8221;,&#8221;soft.php?id=&#8221;,$gwrj);<br />
$gwrj = str_replace(&#8220;.htm&#8221;,&#8221;",$gwrj);<br />
解释:<br />
就是把偷过来的国外软件中的代码更换.<br />
原来的<br />
&lt;a target=_blank href=&#8221;soft/18204.htm&#8221;&gt;<br />
变为了现在的<br />
&lt;a target=_blank href=&#8221;soft.php?id=18204&#8243;&gt;</p>
<p>基本差不多了,多菜鸟讲来应该很详细咯.先做好首页模板,然后一个一个的挖出来你想要的东西.<br />
想一个问题.<br />
index.htm中,有很多分类资讯的,都是调用JS显示的内容,你怎么把它拿过来显示在你的首页中.<br />
希望大家偷的都很顺利.<br />
简单讲下分类的偷取.和偷取首页一样.代码如下:<br />
&lt;?<br />
require &#8216;./commom.php&#8217;;</p>
<p>if($soft){<br />
         update(&#8220;${soft}.htm&#8221;,&#8221;soft&#8221;);<br />
         $file=readfromfile(&#8220;cache/${soft}.htm&#8221;);<br />
}<br />
?&gt;<br />
soft.php<br />
其中$soft就是从前面传递过来的soft.php?id=1234<br />
如果传递过来1234<br />
那么就是更新读取update(&#8220;1234.html&#8221;,&#8221;soft&#8221;);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/284.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP小偷原理实现及改进</title>
		<link>http://www.tisswb.com/archives/272.html</link>
		<comments>http://www.tisswb.com/archives/272.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 20:36:41 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=272</guid>
		<description><![CDATA[PHP小偷程序说白了就是让别人帮你维护你的网站，有点不劳而获的意思。至于这个东西到底是好是坏我们不评价了，还是研究一下程序要紧。
优点：通过PHP小偷我们可以借用别人网站上的信息而不用自己辛苦地去采集
缺点：需要把整页的HTML代码读取到本地,然后通过匹配获取到想要的信息再进行显示,这样大大影响网页的加载速度
改进：通过AJAX异步读取HTML代码,后台进行匹配获取到想要的信息,再显示到前台页面
预备知识：PHP,AJAX,正则表达式
关键字：file_get_contents()  fopen()  fwrite()  eregi()
前三个关键字都是关于PHP文件处理的函数,eregi()是关于正则表达式的函数
PHP小偷原理的实现
一、file_get_contents() fopen() fwrite() 的应用
咱们用华夏黑客牛刀小试吧,把主页的全部信息获取过来
<span class="readmore"><a href="http://www.tisswb.com/archives/272.html" title="PHP小偷原理实现及改进" target="_blank">阅读全文——共2032字</a></span>]]></description>
			<content:encoded><![CDATA[<p>PHP小偷程序说白了就是让别人帮你维护你的网站，有点不劳而获的意思。至于这个东西到底是好是坏我们不评价了，还是研究一下程序要紧。</p>
<p><strong>优点</strong>：通过PHP小偷我们可以借用别人网站上的信息而不用自己辛苦地去采集</p>
<p><strong>缺点</strong>：需要把整页的HTML代码读取到本地,然后通过匹配获取到想要的信息再进行显示,这样大大影响网页的加载速度</p>
<p><strong>改进</strong>：通过AJAX异步读取HTML代码,后台进行匹配获取到想要的信息,再显示到前台页面</p>
<p><strong>预备知识</strong>：PHP,AJAX,正则表达式</p>
<p><strong>关键字</strong>：file_get_contents()  fopen()  fwrite()  eregi()</p>
<p>前三个关键字都是关于PHP文件处理的函数,eregi()是关于正则表达式的函数</p>
<p>PHP小偷原理的实现</p>
<p>一、file_get_contents() fopen() fwrite() 的应用</p>
<p>咱们用华夏黑客牛刀小试吧,把主页的全部信息获取过来</p>
<p>建立一个PHP文件</p>
<p><code lang="php"><br />
&lt; ?php<br />
$url = 'http://www.77169.com/';<br />
//file_get_contents（）函数获取网页的html文档<br />
$file = file_get_contents ( $url );<br />
//建立一个新文件ImitationIndex.htm<br />
$newfile = fopen ( 'ImitationIndex.htm', 'w' );<br />
//把内容读取进去<br />
fwrite ( $newfile, $file );<br />
//关闭打开的文件<br />
fclose ( $newfile );<br />
?&gt;<br />
</code><br />
ImitationIndex.htm获取主页全部的HTML(保存好,以备下次使用)</p>
<p>二、eregi()函数的应用</p>
<p>通过eregi()获取里的内容</p>
<div><code lang="php"><br />
&lt; ?php<br />
$url = 'http://www.77169.com/';<br />
//file_get_contents（）函数获取网页的html文档<br />
$file = file_get_contents ( $url );<br />
//通过eregi()匹配获取想要的信息<br />
eregi ( '之间的内容</code></div>
<div><code lang="php">　　从上面的两个例子,已经知道PHP小偷的实现原理,从中也知道它的不足之处,但通过AJAX可以完善它,使它可以用于实践项目中</code></div>
<p><code lang="php">　　PHP小偷技术的实用和改进</p>
<p>　　目的:获取华夏黑客的最新资讯,并实时更新查看示例<br />
实际中可能只用到三个页面</p>
<p>　　showNews.php,Update.php,HackNews.htm</p>
<p>　　但为了能看到实时更新的效果,这里用到了模拟主页的页面ImitationIndex.htm</p>
<div><code lang="html"><br />
<!--<br />
body {<br />
background: #c60;<br />
}</div>
<div mce_tmp="1">a {<br />
color: #444;<br />
font: 12px Courier New;<br />
padding: 8px;<br />
}</div>
<div mce_tmp="1">a:hover {<br />
color: #f00<br />
}</div>
<div mce_tmp="1">#hei_content {<br />
width: 400px;<br />
background: #ccc;<br />
border: 2px solid #000;<br />
border-bottom: 5px solid #000;<br />
}<br />
--></div>
<p></code><code lang="html">&lt; ?php<br />
echo ('<br />
</code></p>
<div></div>
</div>
<p> </p>
<p></code><code lang="html"></p>
<div id="hei_content">');<br />
include ('HackNews.htm');<br />
echo ('');<br />
?&gt;<br />
<script type="text/javascript"><!--
window.onload=UpdateNews;
function GetXmlHttp()
{
var xmlhttp;
try
{
//IE7.0 ect
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
}</p>
<p>catch(a)
{
try
{
//ie6.0 ect
xmlhttp=new ActiveXObject("Mscrosoft.XMLHTTP");
}
catch(b)
{
//非IE
xmlhttp=new XMLHttpRequest();
}
}
return xmlhttp;
}
function StateChange()
{
if(xmlhttp.readyState==4&#038;&#038;xmlhttp.status==200)
{
document.getElementById("hei_content").innerHTML=xmlhttp.responseText;
}
}
function UpdateNews()
{
xmlhttp=GetXmlHttp();
xmlhttp.onreadystatechange=StateChange;</p>
<p>var url='Update.php';
url=url+"?sid="+Math.random();
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}
// --></script></div>
<p>showNews.php中的</p>
<div><code lang="php"><br />
echo('</code></div>
<p></code><code lang="php"></p>
<div id="hei_content">');<br />
include('HackNews.htm');<br />
echo('</div>
<p>');</p>
<p></code></p>
<p>　　HackNews.htm是已经缓存的文件,这样不用加载主页上的整个HTML再显示,这个工作留给AJAX</p>
<p>　　document.getElementById(&#8220;hei_content&#8221;).innerHTML=xmlhttp.responseText</p>
<p>　　xmlhttp.responseText就是加载更新后的内容</p>
<p>　　Update.php</p>
<div><code lang="html"><br />
&lt; ?php<br />
$url = 'ImitationIndex.htm';<br />
//file_get_contents（）函数获取网页的html文档<br />
$file = file_get_contents ( $url );<br />
//$regx为正则表达式的内容,用于匹配获取想要的信息<br />
$regx = '</code></div>
<p><code lang="html"></p>
<td colspan="3" height="100" background="http://hack.77169.com/20090220100422648.gif"> </td>
<p> (.*)<br />
&lt; /td&gt;<br />
&lt; /tr&gt;<br />
&lt; /table&gt;<br />
&lt; /td&gt;<br />
&lt; /tr&gt;</p>
<td colspan="3"> </td>
<p> <img src="" alt="" height="8" /> //eregi()获取匹配到的内容,赋值给数组变量$rg;<br />
eregi ( $regx, $file, $rg );<br />
//建立一个新文件HackNews.htm<br />
$newfile = fopen ( 'HackNews.htm', 'w' );<br />
//把内容读取进去<br />
fwrite ( $newfile, $rg [1] );<br />
fclose ( $newfile );<br />
//用iconv编码转换后,输出匹配的HTML内容<br />
$rg [1] = iconv ( 'gb2312', 'utf-8', $rg [1] );<br />
echo ($rg [1]);<br />
?/&gt; </p>
<p>　　Update.php是异步更新的后台页面</p>
<p></code></p>
<p>　　$newfile=fopen(&#8216;HackNews.htm&#8217;,'w&#8217;);</p>
<p>　　fwrite($newfile,$rg[1]);</p>
<p>　　把更新的内容重新保存在HackNews.htm中,下次在index.php中include时就直接调用这个页面</p>
<p>　　$url=&#8217;ImitationIndex.htm&#8217;在实际应用中应该是这样$url=&#8217;http://www.77169.com/&#8217;</p>
<p>　　但为了便于调试,建立一个ImitationIndex.htm模拟页面,如果对ImitationIndex.htm页面中最新资讯中的内容改改,就可以看到实时更新效果。</p>
<p>　　总结:通过AJAX改进的PHP小偷技术,在采集多个网站的大量信息下,页面的加载速度并不会受多大影响。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/272.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP采集程序中常用的函数</title>
		<link>http://www.tisswb.com/archives/259.html</link>
		<comments>http://www.tisswb.com/archives/259.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:52:41 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=259</guid>
		<description><![CDATA[网上找到的，给大家总结一下：

//获得当前的脚本网址
function get_php_url(){
        if(!empty($_SERVER["REQUEST_URI"])){
                $scriptName = $_SERVER["REQUEST_URI"];
                $nowurl = $scriptName;
        }else{
                $scriptName = $_SERVER["PHP_SELF"];
                if(empty($_SERVER["QUERY_STRING"])) $nowurl = $scriptName;
<span class="readmore"><a href="http://www.tisswb.com/archives/259.html" title="PHP采集程序中常用的函数" target="_blank">阅读全文——共2780字</a></span>]]></description>
			<content:encoded><![CDATA[<p>网上找到的，给大家总结一下：<br />
<code lang="php" linenum="on" download="phpcaiji_function.php"><br />
//获得当前的脚本网址<br />
function get_php_url(){<br />
        if(!empty($_SERVER["REQUEST_URI"])){<br />
                $scriptName = $_SERVER["REQUEST_URI"];<br />
                $nowurl = $scriptName;<br />
        }else{<br />
                $scriptName = $_SERVER["PHP_SELF"];<br />
                if(empty($_SERVER["QUERY_STRING"])) $nowurl = $scriptName;<br />
                else $nowurl = $scriptName."?".$_SERVER["QUERY_STRING"];<br />
        }<br />
        return $nowurl;<br />
}<br />
//把全角数字转为半角数字<br />
function GetAlabNum($fnum){<br />
        $nums = array("０","１","２","３","４","５","６","７","８","９");<br />
        $fnums = "0123456789";<br />
        for($i=0;$i< =9;$i++) $fnum = str_replace($nums[$i],$fnums[$i],$fnum);<br />
        $fnum = ereg_replace("[^0-9.]|^0{1,}","",$fnum);<br />
        if($fnum=="") $fnum=0;<br />
        return $fnum;<br />
}<br />
//去除HTML标记<br />
function Text2Html($txt){<br />
        $txt = str_replace("  ","　",$txt);<br />
        $txt = str_replace("<","<",$txt);<br />
        $txt = str_replace(">",">",$txt);<br />
        $txt = preg_replace("/[rn]{1,}/isU","<br />rn",$txt);<br />
        return $txt;<br />
}</p>
<p>//清除HTML标记<br />
function ClearHtml($str){<br />
        $str = str_replace('< ','<',$str);<br />
        $str = str_replace('>','>',$str);<br />
        return $str;<br />
}<br />
//相对路径转化成绝对路径<br />
function relative_to_absolute($content, $feed_url) {<br />
    preg_match('/(http|https|ftp):///', $feed_url, $protocol);<br />
    $server_url = preg_replace("/(http|https|ftp|news):///", "", $feed_url);<br />
    $server_url = preg_replace("//.*/", "", $server_url);</p>
<p>    if ($server_url == '') {<br />
        return $content;<br />
    }</p>
<p>    if (isset($protocol[0])) {<br />
        $new_content = preg_replace('/href="//', 'href="'.$protocol[0].$server_url.'/', $content);<br />
        $new_content = preg_replace('/src="//', 'src="'.$protocol[0].$server_url.'/', $new_content);<br />
    } else {<br />
        $new_content = $content;<br />
    }<br />
    return $new_content;<br />
}<br />
//取得所有链接<br />
function get_all_url($code){<br />
        preg_match_all('/<a s+href=["|']?([^>"' ]+)["|']?s*[^>]*>([^>]+)< /a>/i',$code,$arr);<br />
        return array('name'=>$arr[2],'url'=>$arr[1]);<br />
}</p>
<p>//获取指定标记中的内容<br />
function get_tag_data($str, $start, $end){<br />
        if ( $start == '' || $end == '' ){<br />
               return;<br />
        }<br />
        $str = explode($start, $str);<br />
        $str = explode($end, $str[1]);<br />
        return $str[0];<br />
}<br />
//HTML表格的每行转为CSV格式数组<br />
function get_tr_array($table) {<br />
        $table = preg_replace("'
<td [^>]*?>'si",'"',$table);<br />
        $table = str_replace("</td>
<p>",'",',$table);<br />
        $table = str_replace("","{tr}",$table);<br />
        //去掉 HTML 标记<br />
        $table = preg_replace("'< [/!]*?[^<>]*?>'si","",$table);<br />
        //去掉空白字符<br />
        $table = preg_replace("'([rn])[s]+'","",$table);<br />
        $table = str_replace(" ","",$table);<br />
        $table = str_replace(" ","",$table);</p>
<p>        $table = explode(",{tr}",$table);<br />
        array_pop($table);<br />
        return $table;<br />
}</p>
<p>//将HTML表格的每行每列转为数组，采集表格数据<br />
function get_td_array($table) {<br />
        $table = preg_replace("'<br />
<table [^>]*?>'si","",$table);<br />
        $table = preg_replace("'<br />
<tr [^>]*?>'si","",$table);<br />
        $table = preg_replace("'
<td [^>]*?>'si","",$table);<br />
        $table = str_replace("</td>
</tr>
<p>","{tr}",$table);<br />
        $table = str_replace("","{td}",$table);<br />
        //去掉 HTML 标记<br />
        $table = preg_replace("'< [/!]*?[^<>]*?>'si","",$table);<br />
        //去掉空白字符<br />
        $table = preg_replace("'([rn])[s]+'","",$table);<br />
        $table = str_replace(" ","",$table);<br />
        $table = str_replace(" ","",$table);</p>
<p>        $table = explode('{tr}', $table);<br />
        array_pop($table);<br />
        foreach ($table as $key=>$tr) {<br />
                $td = explode('{td}', $tr);<br />
                array_pop($td);<br />
            $td_array[] = $td;<br />
        }<br />
        return $td_array;<br />
}</p>
<p>//返回字符串中的所有单词 $distinct=true 去除重复<br />
function split_en_str($str,$distinct=true) {<br />
        preg_match_all('/([a-zA-Z]+)/',$str,$match);<br />
        if ($distinct == true) {<br />
                $match[1] = array_unique($match[1]);<br />
        }<br />
        sort($match[1]);<br />
        return $match[1];<br />
}<br />
</table>
<p></a></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/259.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP学习——获得URL信息的类</title>
		<link>http://www.tisswb.com/archives/255.html</link>
		<comments>http://www.tisswb.com/archives/255.html#comments</comments>
		<pubDate>Sat, 07 Mar 2009 19:32:10 +0000</pubDate>
		<dc:creator>笨二十一</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php学习点滴]]></category>

		<guid isPermaLink="false">http://www.tisswb.cn/?p=255</guid>
		<description><![CDATA[获取URL信息的类
使用这个类，你能获得URL的如下信息：
- Host
- Path
- Statuscode (eg. 404,200, &#8230;)
- HTTP Version
- Server
- Content Type
- Date
- The whole header string of the URL
<span class="readmore"><a href="http://www.tisswb.com/archives/255.html" title="PHP学习——获得URL信息的类" target="_blank">阅读全文——共5315字</a></span>]]></description>
			<content:encoded><![CDATA[<p>获取URL信息的类<br />
使用这个类，你能获得URL的如下信息：<br />
- Host<br />
- Path<br />
- Statuscode (eg. 404,200, &#8230;)<br />
- HTTP Version<br />
- Server<br />
- Content Type<br />
- Date<br />
- The whole header string of the URL</p>
<p><code lang="php" linenum="on"><br />
< ?php<br />
/**<br />
 * Class for getting information about URL's<br />
 * @author Sven Wagener <[email]sven.wagener@intertribe.de[/email]><br />
 * @copyright Intertribe limited<br />
 * @PHP中文社区收集整理 [url]www.phpNet.cn[/url]<br />
 * @include Funktion:_include_<br />
 */<br />
class url {<br />
	var $url = "";<br />
	var $url_host;<br />
	var $url_path;<br />
	var $file = "";<br />
	var $code = "";<br />
	var $code_desc = "";<br />
	var $http_version = ""; // Variable for HTTP version<br />
	var $header_stream;<br />
	var $header_array;<br />
	var $timeout = "1";<br />
	/**<br />
	 * Constructor of class url<br />
	 * @param string $url the complete url<br />
	 * @desc Constructor of class url<br />
	 */<br />
	function url($url) {<br />
		$this->url = $url;<br />
		$url_array = parse_url ( $this->url );<br />
		$this->url_host = $url_array ['host'];<br />
		$this->url_path = $url_array ['path'];<br />
		if ($this->url_path == "") {<br />
			$this->url_path = "/";<br />
		}<br />
		$this->refresh_headerinfo ();<br />
	}<br />
	/**<br />
	 * Returns the whole url<br />
	 * @return string $url the whole url<br />
	 * @desc Returns the whole url<br />
	 */<br />
	function get_url() {<br />
		return $this->url;<br />
	}<br />
	/**<br />
	 * Returns the host of the url<br />
	 * @return string $url_host the host of the url<br />
	 * @desc Returns the host of the url<br />
	 */<br />
	function get_url_host() {<br />
		return $this->url_host;<br />
	}<br />
	/**<br />
	 * Returns the path of the url<br />
	 * @return string $url_path the path of the url<br />
	 * @desc Returns the path of the url<br />
	 */<br />
	function get_url_path() {<br />
		return $this->url_path;<br />
	}<br />
	/**<br />
	 * Returns the status code of the url<br />
	 * @return string $status_code the status code<br />
	 * @desc Returns the status code of the url<br />
	 */<br />
	function get_statuscode() {<br />
		return $this->code;<br />
	}<br />
	/**<br />
	 * Returns the status code description of the url<br />
	 * @return string $status_code_desc the status code description<br />
	 * @desc Returns the status code description of the url<br />
	 */<br />
	function get_statuscode_desc() {<br />
		return $this->code_desc;<br />
	}<br />
	/**<br />
	 * Returns the http version of the url by the returned headers of the server<br />
	 * @return string $http_version the http version<br />
	 * @desc Returns the http version of the url by the returned headers of the server<br />
	 */<br />
	function get_info_http_version() {<br />
		return $this->http_version;<br />
	}<br />
	/**<br />
	 * Returns the server type of the url's host by the returned headers of the server<br />
	 * @return string header_array['Server'] the server type<br />
	 * @desc Returns the server type of the url's host by the returned headers of the server<br />
	 */<br />
	function get_info_server() {<br />
		return $this->header_array ['Server'];<br />
	}<br />
	/**<br />
	 * Returns the date of the url's host by the returned headers of the server<br />
	 * @return string $header_array['Date'] the date<br />
	 * @desc Returns the date of the url's host by the returned headers of the server<br />
	 */<br />
	function get_info_date() {<br />
		return $this->header_array ['Date'];<br />
	}<br />
	/*<br />
function get_info_content_length(){<br />
return $this->header_array['Content-Length'];<br />
}<br />
*/<br />
	/**<br />
	 * Returns the content type by the returned headers of the server<br />
	 * @return string header_array['Content-Type'] the content type<br />
	 * @desc Returns the content type by the returned headers of the server<br />
	 */<br />
	function get_info_content_type() {<br />
		return $this->header_array ['Content-Type'];<br />
	}<br />
	/**<br />
	 * Returns the content of the url without the headers<br />
	 * @return string $content the content<br />
	 * @desc Returns the content of the url without the headers<br />
	 */<br />
	function get_content() {<br />
		// Get a web page into a string<br />
		$string = implode ( '', file ( $this->url ) );<br />
		return $string;<br />
	}<br />
	/**<br />
	 * Returns the whole header of url without content<br />
	 * @return string $header the header<br />
	 * @desc Returns the whole header of url without content<br />
	 */<br />
	function get_header_stream() {<br />
		return $this->header_stream;<br />
	}<br />
	/**<br />
	 * Returns the whole headers of the url in an array<br />
	 * @return array $header_array the headers in an array<br />
	 * @desc Returns the whole headers of the url in an array<br />
	 */<br />
	function get_headers() {<br />
		return $this->header_array;<br />
	}<br />
	/**<br />
	 * Refreshes the header information<br />
	 * @desc Refreshes the header information<br />
	 */<br />
	function refresh_headerinfo() {<br />
		// Open socket for connection via port 80 to put headers<br />
		$fp = fsockopen ( $this->url_host, 80, $errno, $errstr, 30 );<br />
		if (! $fp) {<br />
			// echo "$errstr ($errno)";<br />
			if ($errno == 0) {<br />
				$errstr = "Server Not Found";<br />
			}<br />
			$this->code = $errno;<br />
			$this->code_desc = $errstr;<br />
		} else {<br />
			$put_string = "GET " . $this->url_path . " HTTP/1.0rnHost: " . $this->url_host . "rnrn";<br />
			fputs ( $fp, $put_string );<br />
			@socket_set_timeout ( $fp, $this->timeout );<br />
			$stream = "";<br />
			$this->header_array = "";<br />
			$header_end = false;<br />
			// Getting header string and creating header array<br />
			$i = 0;<br />
			while ( ! feof ( $fp ) &#038;&#038; ! $header_end ) {<br />
				$line = fgets ( $fp, 128 );<br />
				if (strlen ( $line ) == 2) {<br />
					$header_end = true;<br />
				} else {<br />
					if ($i == 0) {<br />
						$line1 = $line;<br />
					}<br />
					$stream .= $line;<br />
					$splitted_line = split ( ":", $line );<br />
					$this->header_array [$splitted_line [0]] = $splitted_line [1];<br />
					$i ++;<br />
				}<br />
			}<br />
			fclose ( $fp );<br />
			$this->header_stream = $stream;<br />
			$splitted_stream = split ( " ", $line1 );<br />
			// Getting status code and description of the URL<br />
			$this->code = $splitted_stream [1];<br />
			$this->code_desc = $splitted_stream [2];<br />
			if (count ( $splitted_stream ) > 3) {<br />
				for($i = 3; $i < count ( $splitted_stream ); $i ++) {<br />
					$this->code_desc .= " " . $splitted_stream [$i];<br />
				}<br />
			}<br />
			// Cleaning up for n and r<br />
			$this->code_desc = preg_replace ( "[n]", "", $this->code_desc );<br />
			$this->code_desc = preg_replace ( "[r]", "", $this->code_desc );<br />
			// Getting Http Version<br />
			$http_array = split ( "/", $splitted_stream [0] );<br />
			$this->http_version = $http_array [1];<br />
		}<br />
	}<br />
	/**<br />
	 * Sets the timeout for getting header data from server<br />
	 * @param int $seconds time for timeout in seconds<br />
	 * @desc Sets the timeout for getting header data from server<br />
	 */<br />
	function set_timeout($seconds) {<br />
		$this->timeout = $seconds;<br />
	}<br />
}<br />
?><br />
</code></p>
<p>调用代码：<br />
<code lang="php" linenum="on"><br />
< ?php<br />
include ("url.class.php");<br />
$url = new url ( "[url]http://www.phpNet.cn/[/url]" );<br />
echo $url->get_header_stream ();<br />
$headers = $url->get_headers ();<br />
echo $headers ['Server'];<br />
echo $url->get_content ();<br />
echo "URL: <b>" . $url->get_url () . "</b><br />n";<br />
echo "URL Host: " . $url->get_url_host () . "<br />n";<br />
echo "URL Path: " . $url->get_url_path () . "<br />n<br />n";<br />
echo "Statuscode: " . $url->get_statuscode () . "<br />n";<br />
echo "Statuscode description: " . $url->get_statuscode_desc () . "<br />n";<br />
echo "HTTP Version: " . $url->get_info_http_version () . "<br />n";<br />
echo "Server: " . $url->get_info_server () . "<br />n";<br />
echo "Content Type: " . $url->get_info_content_type () . "<br />n";<br />
echo "Date: " . $url->get_info_date () . "<br />n<br />n";<br />
echo "WHOLE HEADERS:<br />n";<br />
echo $url->get_header_stream ();<br />
?> </code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tisswb.com/archives/255.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

