<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>shanghuo.net(上火网)</title>
		<link>http://www.shanghuo.net/</link>
		<description>人间五十年，万事如梦幻。一度生存者，岂有长不灭？</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>shanghuo Version 1.6 Build 20071004</generator>
		<lastBuildDate>Sun, 05 Feb 2012 10:05:01 +0000</lastBuildDate>
		<ttl></ttl>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=323</guid>
			<title>为程序员量身定制的12个目标</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>为程序员量身定制的12个目标</p><br /><br /><a href="http://www.shanghuo.net/?action=show&amp;id=323" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=323</link>
			<category domain="http://www.shanghuo.net/?cid=18">成长</category>
			<pubDate>2012-01-17 18:21</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=322</guid>
			<title>php获取客户端真实IP 防止代理和作弊</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>获取客户端ip其实不是个简单的活儿,因为存在Ip欺骗,和代理问题,所以获取客户端的IP的真实性会打折扣的,不能百分百准确.但是我们还是尽量找一个比较完善的获取客户端真正ip方法.使用php获取IP的方法能找到很多.</p>
<p>getIp</p>
<p>1.function getIp() { <br />
2.&nbsp;&nbsp;&nbsp; if (getenv(&quot;HTTP_CLIENT_IP&quot;) &amp;&amp; strcasecmp(getenv(&quot;HTTP_CLIENT_IP&quot;), &quot;unknown&quot;)) $ip = getenv(&quot;HTTP_CLIENT_IP&quot;); <br />
3.&nbsp;&nbsp;&nbsp; else if (getenv(&quot;HTTP_X_FORWARDED_FOR&quot;) &amp;&amp; strcasecmp(getenv(&quot;HTTP_X_FORWARDED_FOR&quot;), &quot;unknown&quot;)) $ip = getenv(&quot;HTTP_X_FORWARDED_FOR&quot;); <br />
4.&nbsp;&nbsp;&nbsp; else if (getenv(&quot;REMOTE_ADDR&quot;) &amp;&amp; strcasecmp(getenv(&quot;REMOTE_ADDR&quot;), &quot;unknown&quot;)) $ip = getenv(&quot;REMOTE_ADDR&quot;); <br />
5.&nbsp;&nbsp;&nbsp; else if (isset($_SERVER['REMOTE_ADDR']) &amp;&amp; $_SERVER['REMOTE_ADDR'] &amp;&amp; strcasecmp($_SERVER['REMOTE_ADDR'], &quot;unknown&quot;)) $ip = $_SERVER['REMOTE_ADDR']; <br />
6.&nbsp;&nbsp;&nbsp; else $ip = &quot;unknown&quot;; <br />
7.&nbsp;&nbsp;&nbsp; return ($ip); <br />
8.} 　　</p>
<p>现在需要对这段代码进行解释,这里用到了两个函数,getenv()和strcasecmp(),前一个函数获取得系统的环境变量,如果能取到值,则返回该值,不能则返回false.</p>
<p>　　$_SERVER是服务器超级全局变量数组,用$_SERVER['REMOTE_ADDR']同样可以获取到客户端的IP地址.二者的区别在于,getenv不支持IIS的isapi方式运行的php.</p>
<p>　　strcasecmp(string1,string2)字符串函数的用法是把string1和string2进行比较,如果相等返回0,如果string1大于string2,返回大于0的数,小于则返回小于0的数.</p>
<p>　　函数先使用客户IP,如果不成立尝试用代理的方法,如果不行,再使用REMOTE_ADDR.还看到过一个检测IP更详细的方法,考虑了IP的欺骗,和多重代理代码.方法相类似.</p>
<p>1.function getip() { <br />
2.&nbsp;&nbsp;&nbsp; $unknown = 'unknown'; <br />
3.&nbsp;&nbsp;&nbsp; if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) &amp;&amp; $_SERVER['HTTP_X_FORWARDED_FOR'] &amp;&amp; strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)) { <br />
4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; <br />
5.&nbsp;&nbsp;&nbsp; } <br />
6.&nbsp;&nbsp;&nbsp; elseif(isset($_SERVER['REMOTE_ADDR']) &amp;&amp; $_SERVER['REMOTE_ADDR'] &amp;&amp; strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) { <br />
7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ip = $_SERVER['REMOTE_ADDR']; <br />
8.&nbsp;&nbsp;&nbsp; } <br />
9.&nbsp;&nbsp;&nbsp; /*&nbsp; <br />
10.处理多层代理的情况&nbsp; <br />
11.或者使用正则方式：$ip = preg_match(&quot;/[\d\.]{7,15}/&quot;, $ip, $matches) ? $matches[0] : $unknown;&nbsp; 12.*/ <br />
13.&nbsp;&nbsp;&nbsp; if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip)); <br />
14.&nbsp;&nbsp;&nbsp; return $ip; 15.} 一、没有使用代理服务器的PHP获取客户端IP情况：</p>
<p>&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 客户端IP<br />
&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p>二、使用透明代理服务器的情况：Transparent Proxies<br />
&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP<br />
&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 客户端真实 IP （经过多个代理服务器时，这个值类似：221.5.252.160, 203.98.182.163, 203.129.72.215）<br />
&nbsp;&nbsp;&nbsp; 这类代理服务器还是将客户端真实的IP发送给了访问对象,无法达到隐藏真实身份的目的.</p>
<p>三、使用普通匿名代理服务器的PHP获取客户端IP情况：Anonymous Proxies<br />
&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP<br />
&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 代理服务器 IP （经过多个代理服务器时，这个值类似：203.98.182.163, 203.98.182.163, 203.129.72.215）<br />
&nbsp;&nbsp;&nbsp; 这种情况下隐藏了客户端的真实IP,但是向访问对象透露了客户端是使用代理服务器访问它们的.</p>
<p>四、使用欺骗性代理服务器的情况：Distorting Proxies<br />
&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 随机的 IP（经过多个代理服务器时,这个值类似：220.4.251.159, 203.98.182.163, 203.129.72.215）<br />
&nbsp;&nbsp;&nbsp; 这种情况下同样透露了客户端是使用了代理服务器,但编造了一个虚假的随机IP（220.4.251.159）代替客户端的真实IP来欺骗它.</p>
<p>五、使用高匿名代理服务器的PHP获取客户端IP情况：High Anonymity Proxies (Elite proxies)<br />
&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p>&nbsp;&nbsp;&nbsp; 无论是REMOTE_ADDR还是HTTP_FORWARDED_FOR，这些头消息未必能够取得到,因为不同的浏览器不同的网络设备可能发送不同的IP头消息.因此PHP使用$_SERVER[&quot;REMOTE_ADDR&quot;] 、$_SERVER[&quot;HTTP_X_FORWARDED_FOR&quot;] 获取的值可能是空值也可能是&ldquo;unknown&rdquo;值.</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=322</link>
			<category domain="http://www.shanghuo.net/?cid=2">php学习</category>
			<pubDate>2011-11-23 13:04</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=321</guid>
			<title>php REMOTE_ADDR，HTTP_CLIENT_IP，HTTP_X_FORWARDED_FOR解释</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>一、没有使用代理服务器的情况：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 您的 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示</p>
<p>二、使用透明代理服务器的情况：Transparent Proxies<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 您的真实 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。<br />
&nbsp; 这类代理服务器还是将您的信息转发给您的访问对象，无法达到隐藏真实身份的目的。</p>
<p>三、使用普通匿名代理服务器的情况：Anonymous Proxies<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 最后一个代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 代理服务器 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。<br />
&nbsp; 隐藏了您的真实IP，但是向访问对象透露了您是使用代理服务器访问他们的。</p>
<p>四、使用欺骗性代理服务器的情况：Distorting Proxies<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 随机的 IP ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp; 告诉了访问对象您使用了代理服务器，但编造了一个虚假的随机IP代替您的真实IP欺骗它。</p>
<p>五、使用高匿名代理服务器的情况：High Anonymity Proxies (Elite proxies)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REMOTE_ADDR = 代理服务器 IP<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_VIA = 没数值或不显示<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP_X_FORWARDED_FOR = 没数值或不显示 ，经过多个代理服务器时，这个值类似如下：203.98.182.163, 203.98.182.163, 203.129.72.215。</p>
<p>&nbsp; 完全用代理服务器的信息替代了您的所有信息，就象您就是完全使用那台代理服务器直接访问对象。</p>
<p>REMOTE_ADDR 是你的客户端跟你的服务器&ldquo;握手&rdquo;时候的IP。如果使用了&ldquo;匿名代理&rdquo;，REMOTE_ADDR将显示代理服务器的IP。<br />
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是&ldquo;超级匿名代理&rdquo;，则返回none值。同样，REMOTE_ADDR也会被替换为这个代理服务器的IP。<br />
$_SERVER['REMOTE_ADDR']; //访问端（有可能是用户，有可能是代理的）IP<br />
$_SERVER['HTTP_CLIENT_IP'];&nbsp; //代理端的（有可能存在，可伪造）<br />
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理（有可能存在，也可以伪造）</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=321</link>
			<category domain="http://www.shanghuo.net/?cid=2">php学习</category>
			<pubDate>2011-11-23 13:03</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=320</guid>
			<title>一些对日志分析的脚本</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>1.查看apache的进程数<br />
ps -aux | grep httpd | wc -l</p>
<p>2.分析日志查看当天的ip连接数<br />
cat default-access_log | grep &quot;10/Dec/2010&quot; | awk '{print $2}' | sort | uniq -c | sort -nr</p>
<p>3.查看指定的ip在当天究竟访问了什么url<br />
cat default-access_log | grep &quot;10/Dec/2010&quot; | grep &quot;218.19.140.242&quot; | awk '{print $7}' | sort | uniq -c | sort -nr</p>
<p>4.查看当天访问排行前10的url<br />
cat default-access_log | grep &quot;10/Dec/2010&quot; | awk '{print $7}' | sort | uniq -c | sort -nr | head -n 10</p>
<p>5.看到指定的ip究竟干了什么<br />
cat default-access_log | grep 218.19.140.242 | awk '{print $1&quot;\t&quot;$8}' | sort | uniq -c | sort -nr | less</p>
<p>6.查看访问次数最多的几个分钟(找到热点)<br />
awk '{print $4}' default-access_log |cut -c 14-18|sort|uniq -c|sort -nr|head</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=320</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2011-07-01 14:12</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=319</guid>
			<title>Apache日志分析脚本</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>1,查看apache进程:</p>
<p>ps aux | grep httpd | grep -v grep | wc -l</p>
<p>2,查看80端口的tcp连接:</p>
<p>netstat -tan | grep &quot;ESTABLISHED&quot; | grep &quot;:80&quot; | wc -l</p>
<p>3,通过日志查看当天ip连接数，过滤重复:</p>
<p>cat access_log | grep &quot;20/Oct/2008&quot; | awk '{print $2}' | sort | uniq -c | sort -nr</p>
<p>4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):</p>
<p>cat access_log | grep &quot;20/Oct/2008:00&quot; | grep &quot;122.102.7.212&quot; | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10</p>
<p>5,当天访问页面排前10的url:</p>
<p>cat access_log | grep &quot;20/Oct/2008:00&quot; | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10</p>
<p>6,用tcpdump嗅探80端口的访问看看谁最高</p>
<p>tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F&quot;.&quot; '{print $1&quot;.&quot;$2&quot;.&quot;$3&quot;.&quot;$4}' | sort | uniq -c | sort -nr</p>
<p>接着从日志里查看该ip在干嘛:<br />
cat access_log | grep 122.102.7.212| awk '{print $1&quot;\t&quot;$8}' | sort | uniq -c | sort -nr | less</p>
<p>7,查看某一时间段的ip连接数:</p>
<p>grep &quot;2006:0[7-8]&quot; www20060723.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=319</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2011-07-01 14:11</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=318</guid>
			<title>MySQL性能监控小知识</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>一，获取mysql用户下的进程总数</p>
<p>ps -ef | awk '{print $1}' | grep &quot;mysql&quot; | grep -v &quot;grep&quot; | wc-1</p>
<p>二，主机性能状态</p>
<p># uptime</p>
<p>[root@ ~]# uptime<br />
13:05:52 up 53 days, 52 min, 1 user, load average: 0.00, 0.00, 0.00</p>
<p>三，CPU使用率</p>
<p># top<br />
或<br />
# vmstat</p>
<p>四，磁盘IO量</p>
<p># vmstat 或 # iostat<br />
五，swap进出量[内存]</p>
<p># free<br />
六，数据库性能状态<br />
(1)QPS(每秒Query量)<br />
QPS = Questions(or Queries) / seconds<br />
mysql &gt; show /*50000 global */ status like 'Question';</p>
<p>(2)TPS(每秒事务量)<br />
TPS = (Com_commit + Com_rollback) / seconds<br />
mysql &gt; show status like 'Com_commit';<br />
mysql &gt; show status like 'Com_rollback';</p>
<p>(3)key Buffer 命中率<br />
key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%<br />
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%</p>
<p>mysql&gt; show status like 'Key%';</p>
<p>(4)InnoDB Buffer命中率<br />
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%</p>
<p>mysql&gt; show status like 'innodb_buffer_pool_read%';</p>
<p>(5)Query Cache命中率<br />
Query_cache_hits = (Qcahce_hits / (Qcache_hits + Qcache_inserts )) * 100%;</p>
<p>mysql&gt; show status like 'Qcache%';<br />
(6)Table Cache状态量<br />
mysql&gt; show status like 'open%';</p>
<p>(7)Thread Cache 命中率<br />
Thread_cache_hits = (1 - Threads_created / connections ) * 100%</p>
<p>mysql&gt; show status like 'Thread%';</p>
<p>mysql&gt; show status like 'Connections';</p>
<p>(8)锁定状态<br />
mysql&gt; show status like '%lock%';</p>
<p>(9)复制延时量<br />
mysql &gt; show slave status</p>
<p>(10) Tmp Table 状况(临时表状况)<br />
mysql &gt; show status like 'Create_tmp%';<br />
(11) Binlog Cache 使用状况<br />
mysql &gt; show status like 'Binlog_cache%';</p>
<p>(12) Innodb_log_waits 量<br />
mysql &gt; show status like 'innodb_log_waits';</p>
<p>开源监控软件<br />
一，RRDTool<br />
二，Nagios<br />
三，MRTG<br />
四，Cacti</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=318</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2011-06-28 12:10</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=317</guid>
			<title>windows xp下配置JDK环境变量</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>windows xp下配置JDK环境变量</p><br /><br /><a href="http://www.shanghuo.net/?action=show&amp;id=317" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=317</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2011-01-05 15:40</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=316</guid>
			<title>百万级PHP网站架构工具箱</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>在了解过世界最大的PHP站点，Facebook的后台技术后，今天我们来了解一个百万级PHP站点的网站架构：Poppen.de。Poppen.de是德国的一个社交网站，相对Facebook、Flickr来说是一个很小的网站，但它有一个很好的架构，融合了很多技术，如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。</p>
<p>　　51CTO推荐阅读：大型B2C网站高性能可伸缩架构技术探秘</p>
<p>　　Poppen.de目前有200万注册用户数、2万并发用户数、每天20万条私有消息、每天25万登录次数。而项目团队有11个开发人员，两个设计，两个系统管理员。该站点的商业模式采用免费增值模式，用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。</p>
<p>　　如果用户想享受不受限制发送消息和上载图片，那么就得根据需要支付不同类型的会员服务，视频聊天及网站其他服务也采用同样的策略。</p>
<p>　　Nginx</p>
<p>　　Poppen.de 所有的服务都是基于Nginx服务上的。前端有两台Nginx服务器在高峰期提供每分钟15万次请求的负载，每个机器已经有四年寿命，并且只有一个CPU 和3GB RAM。Poppen.de拥有三台独立的图像服务器，由三台Nginx服务器为*.bilder.poppen.de提供每分钟8万次请求服务。</p>
<p>　　Nginx 架构中一个很酷的设计就是有很多请求是由Memcached处理的，因此请求从缓存中获取内容而不需要直接访问PHP机器。比如，用户信息页(user profile)是网站需要密集处理的内容，如果把用户信息页全部缓存到Memcached上，那么请求直接从Memcached上获取内容。 Poppen.de的Memcached每分钟可以处理8000次请求。</p>
<p>　　架构中有三个Nginx图像服务器提供本地图像缓存，用户上载图 像到一个中央文件服务器。当向这三个Nginx之一中请求图像时，如果服务器本地中没有存在该图像，则从中央文件服务器下载到该服务器上作缓存并提供服 务。这种负载均衡的分布式图像服务器架构设计可以减轻主要存储设备的负载。</p>
<p>　　PHP-FPM</p>
<p>　　该网站运行在PHP- FPM上。共有28台双CPU、6GB内存的PHP机器，每个机器上运行100个PHP-FPM的工作线程。使用启用了APC的PHP5.3.x。 PHP5.3可以降低CPU和内存使用率的30%以上。</p>
<p>　　51CTO推荐阅读：Nginx + PHP-FPM + APC=绝妙的组合</p>
<p>　　程序代码是基于Symfony1.2框架之上开发的。一是可以使用外部资源，二是 能够提高项目开发进度，同时在一个著名的框架上可以让新开发人员更容易加入到团队中来。虽然没有任何事情都是十全十美的，但可以从Symfony框架中得 到很多好处，让团队可以更多的精力放在Poppen.de的业务开发上去。</p>
<p>　　网站性能优化使用XHProf，这是Facebook开源出来的一个类库。这个框架非常容易个性化和配置，能够可以缓存大部分高代价的服务器计算。</p>
<p>　　MySQL</p>
<p>　　MySQL是网站主要的RDBMS。网站又几个MySql服务器：一台4CPU、32GB的服务器存储用户相关信息，如基本信息、照片描述信息等。这台机器已经使用了4 年，下一步计划会使用共享集群来替换它。目前仍基于这个系统上进行设计，以简化数据访问代码。根据用户ID进行数据分区，因为网站中大部分信息都是以用户 为中心的，如照片、视频、消息等。</p>
<p>　　推荐专题：MySQL数据库入门与精通教程</p>
<p>　　有三台服务器按主-从-从配置架构提供用户论坛服务。一台从服务器负责网站自定义消息存储，到现在有 2.5亿条消息。另外四台机器为主-从配置关系。另外由4台机器配置成NDB族群专门服务于密集型写操作数据，如用户访问统计信息。</p>
<p>　　数据表设计尽量避免关联操作，尽可能缓存最多的数据。当然，数据库的结构化规范已经完全被破坏掉了。因此，为了更容易搜索，数据库设计创建了数据挖掘表。大部分表是MyISAM型表，可以提供快速查找。现在的问题是越来越多的表已经全表锁住了。Poppen.de正考虑往XtraDB存储引擎上迁移。</p>
<p>　　Memcached</p>
<p>　　网站架构中Memcached应用相当多，超过45GB的高速缓存和51个节点。缓存了Session会话、视图缓存以及函数执行缓存等。架构中有一个系统 当记录被修改时可以自动地把数据更新到缓存中去。未来改善缓存更新的可能方案是使用新的Redis Hash API或者MongoDB。</p>
<p>　　RabbitMQ</p>
<p>　　在 2009年中开始在架构中使用RabbitMQ。这是一个很好的消息解决方案，便于部署和集中到这个架构中去，在LVS后运行了两台RabbitMQ服务 器。在上个月，已经把更多的东西集成到该队列中，意味着同一时刻有28台PHP服务器每天要处理50万次请求。发送日志、邮件通知、系统消息、图像上载等 更多的东西到这个队列中。</p>
<p>　　应用PHP-FPM中的fastcgi_finish_request()函数集成队列消息，可以把消息异步发 送到队列中。当系统需要给用户发送HTML或JSON格式响应时，就调用这个函数，这样用户就没有必要等到PHP脚本清理。</p>
<p>　　这个系统可以改善架构资源管理。例如，在高峰期服务每分钟可以处理1000次登录请求。这表示有1000并发更新用户表保存用户的登录时间。由于使用了队列机制，可以 按相反的顺序来运行这些查询。如果需要提高处理速度，只需要增加更多的队列处理者即可，甚至可以增加更多的服务器到这集群中去，而不需要修改任何配置和部 署新节点。</p>
<p>　　CouchDB</p>
<p>　　日志存储CouchDB运行在一台机器上。在这台机器上可以根据模块/行为进行日志查询 /分组，或者根据错误类型等等。这对定位问题非常有用。在使用日志聚合服务CouchDB之前，不得不逐台登录到PHP服务器上设法日志分析定位问题，这 是非常麻烦的。而现在把所有的日志集中到队列中保存到CouchDB中，可以集中进行问题检查和分析。</p>
<p>　　Graphite</p>
<p>　　网站使用Graphite采集网站实时信息并统计。从请求每个模块/行为到Memcached的命中和未命中、RabbitMQ状态监控以及Unix负载等等。Graphite服务平均每分钟有4800次更新操作。实践已经证实要监测网站发发生什么是非常有用的，它的简单文本协议和绘图功能可以方便地即插即 用的方式用于任何需要监控的系统上。</p>
<p>　　一件很酷的事情是使用Graphite同时监控了网站的两个版本。一月份部署了Symfony框架新 版本，以前代码作为一个备份部署。这就意味着网站可能会面临性能问题。因此可以使用Graphite来对两个版本在线进行对比。</p>
<p>　　发现新版本上的Unix负载表较高，于是使用XHProf对两个版本进行性能分析，找出问题所在。</p>
<p>　　Red5</p>
<p>　　网站为用户也提供了两种类型的视频服务，一种是用户自己上载的视频，另外一种是视频聊天，用户视频互动和分享。到2009年年中，每月为用户提供17TB的流量服务。</p>
<p>　　Tsung</p>
<p>　　Tsung 是一个Erlang编写的分布式基准分析工具。在Poppen.de网站中主要用于HTTP基准分析、MySQL与其他存储系统(XtraDB)的对比分 析。用一个系统记录了主要的MySQL服务器的流量，再转换成Tsung的基准会话。然后对该流量进行回放，由Tsung产生数以千计的并发用户访问实验 室的服务器。这样就可以在实验环境中与真实场景非常接近。</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=316</link>
			<category domain="http://www.shanghuo.net/?cid=16">sever</category>
			<pubDate>2010-07-24 22:15</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=315</guid>
			<title>关于PHP你可能不知道的10件事</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>1.使用ip2long() 和long2ip()函数来把IP地址转化成整型存储到数据库里。<br />
这种方法把存储空间降到了接近四分之一（char(15)的15个字节对整形的4个字节），计算一个特定的地址是不是在一个区段内页更简单了，而且加快了搜索和排序的速度（虽然有时仅仅是快了一点）。</p>
<p>2.在验证Email地址的时候使用checkdnsrr() 函数验证域名是否存在。</p>
<p>这个内置函数能够确认指定的域名能够解析成IP地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数，这个函数基于checkdnsrr()，用来验证 email 地址的合法性。对于那些认为自己的Email地址是<a href="mailto:joeuser@wwwphp.net">joeuser@wwwphp.net</a>而不是<a href="mailto:joeuser@php.net">joeuser@php.net</a>的家伙们，这个方法可以很方便的抓住他们。</p>
<p>3.如果你使用的是PHP 5和MySQL 4.1 或者更高的版本，考虑用mysqli_* 系列函数。</p>
<p>一个很好的功能就是你可以使用预处理语句，如果你在维护一个数据库密集型站点，这个功能能够加快查询速度。一些评估分数。&amp; l6 ]' U&amp; Z: B- z! X</p>
<p>4.学会爱上三元运算符。</p>
<p>5.如果你在项目中感觉到有可复用的部分，在你写下一行代码前先看看PEAR中是否已经有了。</p>
<p>很多PHP程序员都知道 PEAR 是一个很好的资源库，虽然还有很多程序员不知道。这个在线资源库包含了超过400个可以复用的程序片段，这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的，你总能找到帮你节省时间的 PEAR包。</p>
<p>6.用 highlight_file()来自动的打印出格式化的很漂亮的源代码。</p>
<p>如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话，这个函数用起来非常的顺手。当然了，要小心不要意外的泄露出你的数据库连接信息和密码等。</p>
<p>7.使用 error_reporting(0)函数来防止用户看到潜在的敏感错误信息。</p>
<p>在理想情况下，发布服务器应该在php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话，你没有自己的 php.ini 文件，那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);（或者使用 require_once() 方法）。这就能够在出错的时候完全屏蔽敏感的SQL查询语句和路径名。</p>
<p>8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。</p>
<p>这个PHP内置函数使用 gzip 算法，可以压缩普通文本达 90%。在我每次要读写BLOB类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。</p>
<p>9.通过&ldquo;引用&rdquo;传递参数的方法从一个函数中得到多个返回值。<br />
就像三元运算符一样，大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问&ldquo;在仅能使用一次 return 的情况下，从一个函数里返回多个值？&rdquo;答案就是在变量前加上一个 &ldquo;&amp;&rdquo; 符号，通过&ldquo;引用&rdquo;传递而非&ldquo;值&rdquo;传递。</p>
<p>10.完全理解&ldquo;魔术引号&rdquo;和 SQL 注入的危险性。: <br />
我希望阅读到这里的开发者都已经很对SQL注入很了解了。不过我还是把这条列在这里，是因为这个确实有点难以理解。</p>]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=315</link>
			<category domain="http://www.shanghuo.net/?cid=2">php学习</category>
			<pubDate>2010-05-24 18:12</pubDate>
		</item>
		<item>
			<guid>http://www.shanghuo.net/?action=show&amp;id=314</guid>
			<title>兰德公司对中国的评价(转)</title>
			<author>jiashixiang</author>
			<description><![CDATA[<p>兰德是美国领先的智库/思想库。应该是个保守派/右派,下面的文章写的很狠,但耐心想想是有它的道理,是对我们这一代人的一个警钟。中国不要成为一个没有灵魂的巨人。</p><br /><br /><a href="http://www.shanghuo.net/?action=show&amp;id=314" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.shanghuo.net/?action=show&amp;id=314</link>
			<category domain="http://www.shanghuo.net/?cid=10">读书</category>
			<pubDate>2010-03-30 17:21</pubDate>
		</item>
	</channel>
</rss>

