<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[回忆未来[张宴]]]></title> 
<link>http://blog.s135.com/index.php</link> 
<description><![CDATA[服务器系统架构与底层研发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[回忆未来[张宴]]]></copyright>
<item>
<link>http://blog.s135.com/php_sqlserver_freetds/</link>
<title><![CDATA[Linux 下 PHP 5.2.x 连接 SQL Server 数据库 FreeTDS 配置笔记]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Fri, 25 Jun 2010 10:00:35 +0000</pubDate> 
<guid>http://blog.s135.com/php_sqlserver_freetds/</guid> 
<description>
<![CDATA[ 
	　　CentOS 5.4 Linux 下的 PHP（FastCGI） 需要连接相关部门的SQL Server 2000数据库，配置了扩展FreeTDS扩展。<br/><br/>　　<strong>1、编译安装FreeTDS</strong><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">mkdir -p /data0/software/<br/>cd /data0/software/<br/>wget <a href="ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz" target="_blank">ftp://ftp.ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz</a><br/>tar zxvf freetds-stable.tgz<br/>cd freetds-0.82/<br/>./configure --prefix=/usr/local/webserver/freetds --with-tdsver=8.0 --enable-msdblib<br/>make && make install<br/>cd ../<br/> <br/>echo "/usr/local/webserver/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf<br/>ln -s /usr/local/webserver/freetds/lib/libsybdb.so.5.0.0 /usr/local/webserver/freetds/lib/libsybdb.so.4<br/>/sbin/ldconfig<br/><br/>rm -f /usr/local/webserver/freetds/etc/freetds.conf<br/>vi /usr/local/webserver/freetds/etc/freetds.conf</div><br/>　　输入以下内容：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">[global]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# TDS protocol version<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tds version = 4.2<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Whether to write a TDSDUMP file for diagnostic purposes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# (setting this to /tmp is insecure on a multi-user system)<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dump file = /tmp/freetds.log<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug flags = 0xffff<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Command and connection timeouts<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeout = 10<br/>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect timeout = 10<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# If you get out-of-memory errors, it may mean that your client<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# is trying to allocate a huge buffer for a TEXT field.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Try setting 'text size' to a more reasonable limit<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text size = 64512<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host = mssql.yourdomain.com<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port = 1433<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tds version = 8.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client charset = UTF-8</div></div><br/><br/>　　<strong>2、编译安装PHP自带MSSQL扩展</strong><br/>　　进入本地已存在的php-5.2.XX源码包目录：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">cd /data0/software/php-5.2.XX/ext/mssql/<br/>/usr/local/webserver/php/bin/phpize<br/>./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-mssql=/usr/local/webserver/freetds/<br/>make && make install</div><br/><br/>　　<strong>3、在php.ini配置文件中增加mssql.so</strong><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">vi /usr/local/webserver/php/etc/php.ini</div><br/>　　增加一行：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">extension = "mssql.so"</div></div><br/><br/>　　<strong>4、重启PHP FastCGI</strong><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">/usr/local/webserver/php/sbin/php-fpm restart</div><br/><br/>　　<strong>5、测试文件（test_mssql.php）：</strong><br/><textarea name="code" class="php" rows="15" cols="100"><?php
header("Content-type: text/html; charset=utf-8");
$msdb=mssql_connect("mssql.yourdomain.com:1433","username","password");
if (!$msdb) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "connect sqlserver error";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;
&#125;
mssql_select_db("database_name",$msdb);
$result = mssql_query("SELECT top 5 * FROM table", $msdb);
while($row = mssql_fetch_array($result)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var_dump($row);
&#125;
mssql_free_result($result);
?></textarea><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a> , <a href="http://blog.s135.com/tags/centos/" rel="tag">centos</a> , <a href="http://blog.s135.com/tags/linux/" rel="tag">linux</a> , <a href="http://blog.s135.com/tags/freetds/" rel="tag">freetds</a> , <a href="http://blog.s135.com/tags/sqlserver/" rel="tag">sqlserver</a> , <a href="http://blog.s135.com/tags/mssql/" rel="tag">mssql</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/google_ssl/</link>
<title><![CDATA[快速跳转到Google SSL 中文版的网址：ggssl.com [此文被墙，无法浏览]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Fri, 28 May 2010 15:18:25 +0000</pubDate> 
<guid>http://blog.s135.com/google_ssl/</guid> 
<description>
<![CDATA[ 
	　　Google 最近提供了 SSL（HTTPS） 搜索功能（<a href="https://www.google.com" target="_blank">https://www.google.com</a>），可以保护用户的搜索关键字和搜索结果不被ISP等第三方机构拦截、窃取，不被墙连接重置。<br/><br/>　　国内用户访问 <a href="https://www.google.com" target="_blank">https://www.google.com</a> 默认情况下会跳转到谷歌香港 <a href="http://www.google.com.hk" target="_blank">http://www.google.com.hk</a>，解决方法为先点击“Google.com in English“访问 <a href="http://www.google.com/ncr" target="_blank">http://www.google.com/ncr</a> （仅需要点击一次），该网址会种一个Cookie，防止跳转，再设置搜索语言为中文，再输入 <a href="https://www.google.com" target="_blank">https://www.google.com</a> 即可，比较麻烦。<br/><br/>　　本人将这一复杂的流程简化为一个域名：<span style="color: #FF0000;">ggssl.com</span>，只需要访问：<a href="http://ggssl.com" target="_blank">http://ggssl.com</a>，即可利用脚本快速跳转到 Google SSL 加密搜索中文版。第一次访问自动设置并跳转，以后访问立即自动跳转。<br/><br/>　　<span style="font-size: 18px;">Google SSL 搜索快速跳转域名：<a href="http://ggssl.com" target="_blank">http://ggssl.com</a></span>
]]>
</description>
</item><item>
<link>http://blog.s135.com/ajaxcdr/</link>
<title><![CDATA[AJAXCDR：利用 Flash 完美解决 JavaScript 和 AJAX 跨域 HTTP POST/GET 表单请求[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Mon, 09 Mar 2009 03:54:45 +0000</pubDate> 
<guid>http://blog.s135.com/ajaxcdr/</guid> 
<description>
<![CDATA[ 
	　　[文章+部分代码 作者：张宴 本文版本：v1.0 最后修改：2009.03.09 转载请注明原文链接：<a href="http://blog.s135.com/ajaxcdr/" target="_blank">http://blog.s135.com/ajaxcdr/</a>]<br/><br/>　　最近的一个项目中，需要通过 JavaScript 提交表单数据到另一个域名下的PHP接口（因为数据较大，需要HTTP POST方式提交），并获取PHP接口的返回值，在页面无刷新、无跳转的情况下，更新div标签内的内容。<br/><br/>　　浏览器出于安全考虑，是不允许JavaScript代码进行跨域操作。JavaScript 和 AJAX 跨域访问分为两大类，一是本域和子域的交互，二是本域和其他域的交互。<br/><br/>　　一、本域和子域的交互：<a href="http://www.s135.com" target="_blank">www.s135.com</a> 和 blog.s135.com<br/>　　二、本域和其他域的交互：blog.s135.com 和 api.bz<br/><br/>　　本域和子域的交互，可以通过iframe设置两个域名document.domain = "s135.com"，实现统一s135.com域下的跨域访问。<br/><br/>　　本域和其他域的交互，可以通过iframe、代理、JS创建动态脚本等几种方法来实现，<a href="http://www.phpchina.com/html/48/n-33848.html" target="_blank">这里有篇文章对几种方法作了简要的介绍</a>。<br/><br/>　　iframe、JS创建动态脚本这两种方法，需要开发者能控制两个域，两端都要编写相应的代码，非常麻烦。在本域服务器上用PHP写个代理中转程序，让本域PHP程序去读取远程其他域的数据再返回给自己，是常用的方法。但是，在本域“前端是CDN或Squid缓存服务器，后端才是PHP应用程序服务器”的系统架构下，穿透CDN或Squid去访问不能被缓存的PHP代理中转程序，效率是很低的。<br/><br/><hr/><br/>　　国外有人尝试用 Flash 做 JavaScript 和 AJAX 跨域访问中转，无疑是一个好方法。JavaScript 将数据提交给本域下的 Flash，通过 Flash 中转去访问其他域的接口，条件只需要其他域的根目录下有一个crossdomain.xml文件，文件中设置允许所有域名或允许本域访问即可。很多网站的API域名都提供了crossdomain.xml文件。<br/><br/>　　例如：<br/>　　1、新浪博客的crossdomain.xml文件（<a href="http://blog.sina.com.cn/crossdomain.xml" target="_blank">http://blog.sina.com.cn/crossdomain.xml</a>）设置了允许所有域名访问；<br/>　　2、饭否API的crossdomain.xml文件（<a href="http://api.fanfou.com/crossdomain.xml" target="_blank">http://api.fanfou.com/crossdomain.xml</a>）设置了允许所有域名访问；<br/>　　3、校内网API的crossdomain.xml文件（<a href="http://api.xiaonei.com/crossdomain.xml" target="_blank">http://api.xiaonei.com/crossdomain.xml</a>）设置了允许所有域名访问；<br/>　　4、优酷网的crossdomain.xml文件（<a href="http://www.youku.com/crossdomain.xml" target="_blank">http://www.youku.com/crossdomain.xml</a>）设置了允许所有域名访问；<br/>　　5、土豆网的crossdomain.xml文件（<a href="http://www.tudou.com/crossdomain.xml" target="_blank">http://www.tudou.com/crossdomain.xml</a>）设置了允许所有域名访问；<br/><br/>　　6、逍遥视频的crossdomain.xml文件（<a href="http://v.xoyo.com/crossdomain.xml" target="_blank">http://v.xoyo.com/crossdomain.xml</a>）设置了只允许*.xoyo.com域名访问；<br/>　　7、网易的crossdomain.xml文件（<a href="http://www.163.com/crossdomain.xml" target="_blank">http://www.163.com/crossdomain.xml</a>）设置了只允许tech.163.com、sports.163.com等几个域名访问。<br/><br/><hr/><br/>　　本人在“<a href="http://blog.monstuff.com/archives/000280.html" target="_blank">Cross-domain AJAX using Flash</a>”的基础上，增加了对表单进行智能处理的功能，封装了一个JavaScript包：<span style="color: #FF0000;">AJAXCDR</span>。通过 AJAXCDR，即可轻松地解决 JavaScript 和 AJAX 跨域 HTTP POST/GET 表单请求，支持IE、Firefox、谷歌Chrome等多种浏览器。<br/><br/>　　AJAXCDR 拥有两个文件：ajaxcdr.js 和 ajaxcdr.swf，AJAXCDR 拥有一个 JavaScript 函数 AjaxCrossDomainRequest() 和一个全局变量 AjaxCrossDomainResponse。<br/><br/>　　<strong>一、AJAXCDR 下载：</strong><br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/ajaxcdr/" rel="tag">ajaxcdr</a> , <a href="http://blog.s135.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://blog.s135.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://blog.s135.com/tags/cross-domain/" rel="tag">cross-domain</a> , <a href="http://blog.s135.com/tags/cross/" rel="tag">cross</a> , <a href="http://blog.s135.com/tags/domain/" rel="tag">domain</a> , <a href="http://blog.s135.com/tags/flash/" rel="tag">flash</a> , <a href="http://blog.s135.com/tags/form/" rel="tag">form</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/392/</link>
<title><![CDATA[PHPSH：Facebook开发的PHP Shell的安装与使用[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Tue, 13 Jan 2009 10:35:24 +0000</pubDate> 
<guid>http://blog.s135.com/post/392/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2009.01.13 转载请注明原文链接：<a href="http://blog.s135.com/post/392/" target="_blank">http://blog.s135.com/post/392/</a>]<br/><br/>　　PHPSH 是 <a href="http://www.facebook.com" target="_blank">Facebook</a> 团队开发的一款交互式 PHP Shell，可以方便地进行PHP命令行测试。<br/><br/>　　网址：<a href="http://www.phpsh.org/" target="_blank">http://www.phpsh.org/</a><br/><br/>　　<strong>安装方法：</strong><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">cd /opt/<br/>wget <a href="http://www.phpsh.org/phpsh-latest.tgz" target="_blank">http://www.phpsh.org/phpsh-latest.tgz</a><br/>tar zxvf phpsh-latest.tgz<br/>cd phpsh/<br/>sed -i "s#php -q#/usr/local/webserver/php/bin/php -q#g" phpsh<br/>chmod +x phpsh<br/>ln -s /opt/phpsh/phpsh /bin/phpsh</div><br/>　　注意：上述安装方法中的“/usr/local/webserver/php/bin/php”为您的PHP可执行文件路径。<br/><br/><br/>　　<strong>使用示例：</strong><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">[root@localhost ~]# phpsh<br/><span style="color: #8B0000;">I can't find a tags file for you.&nbsp;&nbsp;To enable tab completion in phpsh,<br/>go to the root directory of your php code and run 'ctags -R',<br/>(or whatever the analagous command is with your version of ctags,)<br/>then run phpsh from that directory or a subdirectory of that directory.</span><br/><span style="color: #008000;">Commandline: /usr/local/webserver/php/bin/php -q /opt/phpsh/phpsh.php<br/>phpsh (c)2006 by Charlie Cheever and Dan Corson and Facebook, Inc.<br/>type 'h' or 'help' to see instructions & features</span><br/><span style="color: #8B0000;">New Feature: You can use the -c option to turn off coloring</span><br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">= 3 + 4</span><br/>7<br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">= md5("ZhangYan")</span><br/>28f91f3a4b62ce57b7a533e742e8aae1<br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">echo date("Y-m-d H:i:s") </span><br/>2009-01-13 15:28:19<br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">$var = "blog.s135.com"</span><br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">echo $var</span><br/>blog.s135.com<br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">$array = array(array(1,2,3), array("a" => "b", "c" => "d", "e" => "f"), 'g', 'h')</span><br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">= $array</span><br/>Array<br/>(<br/>&nbsp;&nbsp;&nbsp;&nbsp;[0] => Array<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0] => 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1] => 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2] => 3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;[1] => Array<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[a] => b<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[c] => d<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[e] => f<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;[2] => g<br/>&nbsp;&nbsp;&nbsp;&nbsp;[3] => h<br/>)<br/><br/><span style="color: #4169E1;">php></span> <span style="color: #FFA500;">q</span><br/><br/>[root@localhost ~]# phpsh</div><br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a> , <a href="http://blog.s135.com/tags/shell/" rel="tag">shell</a> , <a href="http://blog.s135.com/tags/phpsh/" rel="tag">phpsh</a> , <a href="http://blog.s135.com/tags/facebook/" rel="tag">facebook</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/390/</link>
<title><![CDATA[支持MSNP15协议与离线消息的PHP MSN Class，可实现MSN机器人]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Mon, 29 Dec 2008 16:05:33 +0000</pubDate> 
<guid>http://blog.s135.com/post/390/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2008.12.30 转载请注明原文链接：<a href="http://blog.s135.com/post/390/" target="_blank">http://blog.s135.com/post/390/</a>]<br/><br/>　　我之前的一篇文章《<a href="post/354.htm" target="_blank">Linux服务器系统监控框架与MSN、E-mail、手机短信报警的实现</a>》中提到MSN报警，当时使用的<a href="http://www.fanatic.net.nz/2005/02/15/send-a-message-using-php/" target="_blank">sendMsg</a>类采用的是MSNP9协议，不支持离线消息。最近找到一个PHP MSN Class（<a href="http://code.google.com/p/phpmsnclass/" target="_blank">http://code.google.com/p/phpmsnclass/</a>），支持MSNP9 (MSN 6.2)和最新的MSNP15 (WLM 8.1)协议（MSNP15协议支持离线消息），可以作为MSN机器人使用，或者给MSN、雅虎通发消息。<br/><br/>　　示例代码：必须确保发送人、接收人的MSN互相加为好友。<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a> , <a href="http://blog.s135.com/tags/msn/" rel="tag">msn</a> , <a href="http://blog.s135.com/tags/msnbot/" rel="tag">msnbot</a> , <a href="http://blog.s135.com/tags/%25E6%259C%25BA%25E5%2599%25A8%25E4%25BA%25BA/" rel="tag">机器人</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/389/</link>
<title><![CDATA[同一域名对应多个IP时，PHP获取远程网页内容的函数[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Sun, 14 Dec 2008 16:01:32 +0000</pubDate> 
<guid>http://blog.s135.com/post/389/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2008.12.15 转载请注明原文链接：<a href="http://blog.s135.com/post/389/" target="_blank">http://blog.s135.com/post/389/</a>]<br/><br/>　　PHP获取远程网页内容有多种方式，例如用自带的file_get_contents、fopen等函数。<div class="quote"><div class="quote-title">引用</div><div class="quote-content">&lt;?php&nbsp;&nbsp; <br/>echo file_get_contents(&quot;<a href="http://blog.s135.com/abc.php&quot;);&nbsp;&nbsp;" target="_blank">http://blog.s135.com/abc.php&quot;);&nbsp;&nbsp;</a> <br/>?&gt;</div></div><br/>　　但是，在DNS轮询等负载均衡中，同一域名，可能对应多台服务器，多个IP。假设blog.s135.com被DNS解析到72.249.146.213、72.249.146.214、72.249.146.215三个IP，用户每次访问blog.s135.com，系统会根据负载均衡的相应算法访问其中的一台服务器。<br/><br/>　　上周做一个视频项目时，就碰到这样一类需求：需要依次访问每台服务器上的一个PHP接口程序（假设为abc.php），查询这台服务器的传输状态。<br/><br/>　　这时就不能直接用file_get_contents访问<a href="http://blog.s135.com/abc.php" target="_blank">http://blog.s135.com/abc.php</a>了，因为它可能一直重复访问某一台服务器。<br/><br/>　　而采用依次访问<a href="http://72.249.146.213/abc.php" target="_blank">http://72.249.146.213/abc.php</a>、<a href="http://72.249.146.214/abc.php" target="_blank">http://72.249.146.214/abc.php</a>、<a href="http://72.249.146.215/abc.php" target="_blank">http://72.249.146.215/abc.php</a>的方法，在这三台服务器上的Web Server配有多个虚拟主机时，也是不行的。<br/><br/>　　通过设置本地hosts也不行，因为hosts不能设置多个IP对应同一个域名。<br/><br/>　　那就只有通过PHP和HTTP协议来实现：访问abc.php时，在header头中加上blog.s135.com域名。于是，我写了下面这个PHP函数：<br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/312/</link>
<title><![CDATA[一个发送HTML邮件的PHP函数[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Wed, 21 Nov 2007 01:14:57 +0000</pubDate> 
<guid>http://blog.s135.com/post/312/</guid> 
<description>
<![CDATA[ 
	　　写了一个简单的发送HTML邮件的PHP函数。<br/><br/>　　函数说明：send_mail("发件人地址", "收件人地址", "邮件主题", "邮件正文");<br/><br/>　　示例：send_mail($from, &quot;info@s135.com&quot;, &quot;这是邮件的主题&quot;, &quot;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;&lt;font color=red&gt;这是邮件正文&lt;/font&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;);<br/><br/>　　代码如下：<br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/311/</link>
<title><![CDATA[PHP多进程并发控制的测试用例[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Fri, 16 Nov 2007 06:32:30 +0000</pubDate> 
<guid>http://blog.s135.com/post/311/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.11.16 转载请注明出处：<a href="http://blog.s135.com" target="_blank">http://blog.s135.com</a>]<br/><br/>　　最近遇到一个问题，Linux下的PHP命令行程序作为守护进程，需要从队列文件中读一行数据，通过TCP协议发送给外地的接收服务器，再读下一行数据，再发送。当本地与外地的网络状况不好时，有时候发送一条数据所耗费的时间就较长，累积起来容易造成队列堵塞和延迟。<br/><br/>　　于是，我准备用该PHP命令行程序生成多个子进程，将串行处理变成并行处理。最简单的方法就是在PHP中用exec()或popen()函数将一个shell命令行推到后台去执行，例如：<div class="code">&lt;?php<br/>exec(&quot;/bin/sh /opt/zhangyan.sh &amp;&quot;);<br/>?&gt;</div>　　最后的&表示将shell脚本推到后台去执行。<br/><br/>　　但是这样会有一个问题，如果推到后台的进程太多，可能会导致服务器系统资源耗尽而崩溃，所以必须控制进程数量。<br/><br/><hr/><br/>　　我写了一个PHP程序（/opt/zhangyan.php）、一个shell程序（/opt/zhangyan.sh）作为测试用例。<br/><br/>　　<strong>程序的逻辑：</strong><br/>　　1、设置/opt/zhangyan.php最多允许生成500个子进程；<br/>　　2、当/opt/zhangyan.php读取到一条数据后，将允许生成的子进程数减1（空闲进程数$p_number=500-1=499），然后将数据交给/opt/zhangyan.sh去后台处理，不等待/opt/zhangyan.sh处理结束，继续读取下一条数据；<br/>　　3、当允许生成的子进程数减至0时（空闲进程数$p_number=0），/opt/zhangyan.php会等待1秒钟，然后检查后台还有多少个/opt/zhangyan.sh子进程尚未处理结束；<br/>　　4、如果1秒钟之后/opt/zhangyan.php发现后台的/opt/zhangyan.sh子进程数还是500（空闲进程数$p_number=0），会继续等待1秒钟，如此反复；<br/>　　5、如果/opt/zhangyan.php发现后台尚未处理结束的/opt/zhangyan.sh子进程数减少到300个了（空闲进程数$p_number=500-300=200），那么/opt/zhangyan.php会再往后台推送200个/opt/zhangyan.sh子进程；<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/linux/" rel="tag">linux</a> , <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/285/</link>
<title><![CDATA[采用curl库在PHP程序之间传递数组[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Thu, 16 Aug 2007 10:59:44 +0000</pubDate> 
<guid>http://blog.s135.com/post/285/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.1 最后修改：2007.08.23 转载请注明出处：<a href="http://blog.s135.com" target="_blank">http://blog.s135.com</a>]<br/><br/>　　最近在工作中遇到一个问题：a.php程序需要将接收到的数据同时写到“线上运行的正式数据库”和“进行开发调试的测试数据库”。而测试数据库可能经常会面临对表结构、字段、配置信息做调整等问题，很不稳定，发生错误的概率很高，如果用a.php程序同时写“正式数据库”和“测试数据库”，势必影响到线上运行的正式服务。<br/><br/>　　于是，我想到用PHP curl扩展库将生成的$data数组post传递一份给b.php程序，然后a.php程序继续往下执行写“正式数据库”的代码。a.php程序将$data数组传递给b.php程序就完事了，至于b.php如何处理，就不关a.php的事了，b.php程序即使写“测试数据库”失败，也不会对a.php程序造成影响。<br/><br/>　　<a href="http://blog.s135.com/attachment/200708/curl.gif" target="_blank"><img src="http://blog.s135.com/attachment/200708/curl.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　按照这种思路，我写了a.php和b.php的代码：<br/><br/>　　a.php程序源代码：<br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/284/</link>
<title><![CDATA[PHP截取中文字符串不出现?号的解决方法[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Wed, 15 Aug 2007 10:51:21 +0000</pubDate> 
<guid>http://blog.s135.com/post/284/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.08.15 转载请注明出处：<a href="http://blog.s135.com" target="_blank">http://blog.s135.com</a>]<br/><br/>　　当PHP截取中英文混合字符串时，最后一个汉字经常被拆成两半，例：截取字符串的前18个字<br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/257/</link>
<title><![CDATA[利用Xdebug分析PHP程序，找出性能瓶颈[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Thu, 28 Jun 2007 02:17:46 +0000</pubDate> 
<guid>http://blog.s135.com/post/257/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.06.28 转载请注明出处：<a href="http://blog.s135.com" target="_blank">http://blog.s135.com</a>]<br/><br/>　　经济学中有一条著名的80-20定律，引用到编程中，就是：80%的性能瓶颈是由20%的代码引起的。借助PHP的XDebug扩展，可以有效地找出这20%的代码。<br/><br/>　　一、安装配置<br/>　　1、下载PHP的XDebug扩展，网址：<a href="http://xdebug.org/" target="_blank">http://xdebug.org/</a><br/><br/>　　2、在Linux下编译安装XDebug<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">tar -xzf xdebug-2.0.0RC3.gz<br/>cd xdebug-2.0.0RC3<br/>/usr/local/php/bin/phpize<br/>./configure --enable-xdebug<br/>cp modules/xdebug.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/</div></div><br/>　　注：/usr/local/php/lib/php/extensions/no-debug-non-zts-20020429/不同的PHP版本路径不同，也不一定要放在该路径，可以在zend_extension_ts中自行指定xdebug.so所在位置。<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a> , <a href="http://blog.s135.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/253/</link>
<title><![CDATA[PHP XML Library：一个不错的PHP XML操作类]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Tue, 19 Jun 2007 11:08:40 +0000</pubDate> 
<guid>http://blog.s135.com/post/253/</guid> 
<description>
<![CDATA[ 
	　　今天在PHP4环境下重新写一个接口程序，需要大量分析解析XML，PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组，而SimpleXML扩展在PHP5中才支持，于是逛逛搜索引擎，在老外的网站上找到了一个不错的PHP XML操作类。<br/><br/>一、用法举例：<br/>1、将XML文件解释成便于使用的数组：<br/><textarea name="code" class="php" rows="15" cols="100"><?php
include('xml.php'); &nbsp; &nbsp;//引用PHP XML操作类
$xml = file_get_contents('data.xml'); &nbsp; &nbsp;//读取XML文件
//$xml = file_get_contents("php://input"); &nbsp; &nbsp;//读取POST过来的输入流
$data=XML_unserialize($xml);
echo '<pre>';
print_r($data);
echo '</pre>';
?></textarea><br/><br/>............<br/>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/250/</link>
<title><![CDATA[PHP中常用的字符串函数[转载]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Wed, 13 Jun 2007 08:24:30 +0000</pubDate> 
<guid>http://blog.s135.com/post/250/</guid> 
<description>
<![CDATA[ 
	　　PHP中的字符串操作功能是比较多的,重要的有以下这些:<br/><br/>　　(1)echo,print,printf,sprintf<br/>　　前两个函数是输出字符串.字符串中如果有变量名则被替换成其值. 后两个函数类似于C的同名函数.<br/><br/>............<br/>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/229/</link>
<title><![CDATA[PHP编程的好工具：《PHP Designer 2007 专业版》]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Wed, 25 Apr 2007 11:21:30 +0000</pubDate> 
<guid>http://blog.s135.com/post/229/</guid> 
<description>
<![CDATA[ 
	　　今天下载了一款国外的PHP编辑器----《PHP Designer 2007 专业版》，用了后感觉非常不错，拥有PHP, Javascript, Smarty, Perl, C#, HTML, XHTML, CSS and SQL (Ingres, Interbase, MSSQL, MySQL, Oracle, Sybase and Standard SQL) 等程序语言的函数库，支持代码高亮显示，功能包括自动完成、代码库、TODO管理、FTP支持、任务管理、扩展工具、代码调试、自定义标记、帮助文件搜索等。 <br/><br/>　　下载地址：<a href="http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1539036" target="_blank">http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1539036</a><br/><br/>　　<a href="http://blog.s135.com/attachment/200704/php_designer.jpg" target="_blank"><img src="http://blog.s135.com/attachment/200704/php_designer.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>Tags - <a href="http://blog.s135.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://blog.s135.com/post/226/</link>
<title><![CDATA[dp.SyntaxHighlighter介绍：在网页中加亮显示源代码的工具[原创]]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Thu, 19 Apr 2007 06:56:55 +0000</pubDate> 
<guid>http://blog.s135.com/post/226/</guid> 
<description>
<![CDATA[ 
	　　这两天发现一个老外用JavaScript编写的好东西：dp.SyntaxHighlighter。它可以在网页中对各种程序源代码语法进行加亮显示。支持当前流行的各种编程语言：C#、CSS、C++、Delphi、Java、JavaScript、PHP、Python、Ruby、SQL、Visual Basic、XML / HTML<br/><br/>　　下载地址：<a href="http://www.dreamprojections.com/syntaxhighlighter/" target="_blank">http://www.dreamprojections.com/syntaxhighlighter/</a><br/>　　演示地址：<a href="http://www.dreamprojections.com/syntaxhighlighter/Tests/PHP.html" target="_blank">http://www.dreamprojections.com/syntaxhighlighter/Tests/PHP.html</a><br/><br/>　　使用方法：<br/>　　1、假设网页文件test.htm存放在一个目录，则将dp.SyntaxHighlighter解压缩到该目录下的子目录，假设为images<br/>　　2、在网页的&lt;head&gt;&lt;/head&gt;之间插入以下代码：<br/><br/>............<br/><br/>Tags - <a href="http://blog.s135.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://blog.s135.com/tags/html/" rel="tag">html</a>
]]>
</description>
</item>
</channel>
</rss>