<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[张宴的博客]]></title> 
<link>http://zyan.cc/index.php</link> 
<description><![CDATA[Web系统架构与底层研发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[张宴的博客]]></copyright>
<item>
<link>http://zyan.cc/pthreads/</link>
<title><![CDATA[PHP 真正多线程的使用]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Tue, 17 Dec 2013 03:17:53 +0000</pubDate> 
<guid>http://zyan.cc/pthreads/</guid> 
<description>
<![CDATA[ 
	　　PHP 5.3 以上版本，使用pthreads PHP扩展，可以使PHP真正地支持多线程。多线程在处理重复性的循环任务，能够大大缩短程序执行时间。<br/><br/>　　我之前的文章中说过，大多数网站的性能瓶颈不在PHP服务器上，因为它可以简单地通过横向增加服务器或CPU核数来轻松应对（对于各种云主机，增加VPS或CPU核数就更方便了，直接以备份镜像增加VPS，连操作系统、环境都不用安装配置），而是在于MySQL数据库。如果用 MySQL 数据库，一条联合查询的SQL，也许就可以处理完业务逻辑，但是，遇到大量并发请求，就歇菜了。如果用 NoSQL 数据库，也许需要十次查询，才能处理完同样地业务逻辑，但每次查询都比 MySQL 要快，十次循环NoSQL查询也许比一次MySQL联合查询更快，应对几万次/秒的查询完全没问题。如果加上PHP多线程，通过十个线程同时查询NoSQL，返回结果汇总输出，速度就要更快了。我们实际的APP产品中，调用一个通过用户喜好实时推荐商品的PHP接口，PHP需要对BigSea NoSQL数据库发起500~1000次查询，来实时算出用户的个性喜好商品数据，PHP多线程的作用非常明显。<br/><br/>　　PHP扩展下载：<a href="https://github.com/krakjoe/pthreads" target="_blank">https://github.com/krakjoe/pthreads</a><br/>　　PHP手册文档：<a href="http://php.net/manual/zh/book.pthreads.php" target="_blank">http://php.net/manual/zh/book.pthreads.php</a><br/><br/>　　1、扩展的编译安装(Linux），编辑参数 --enable-maintainer-zts 是必选项：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">cd /Data/tgz/php-5.5.1<br/>./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts<br/>make clean<br/>make<br/>make install&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>unzip pthreads-master.zip<br/>cd pthreads-master<br/>/Data/apps/php/bin/phpize<br/>./configure --with-php-config=/Data/apps/php/bin/php-config<br/>make<br/>make install<br/></div><br/><br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">vi /Data/apps/php/etc/php.ini</div><br/>添加：<br/><div style="border-left: 0px dashed #D6C094; margin: 5px; padding: 3px; margin-bottom:0px; border: 1px dashed #00a0c6; background-color: #ffffff;">extension = "pthreads.so"</div><br/><br/>　　2、给出一段PHP多线程、与For循环，抓取百度搜索页面的PHP代码示例：<br/><textarea name="code" class="php" rows="15" cols="100">
<?php
&nbsp;&nbsp;class test_thread_run extends Thread 
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public $url;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public $data;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function __construct($url)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->url = $url;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function run()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(($url = $this->url))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->data = model_http_curl_get($url);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;function model_thread_result_get($urls_array) 
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($urls_array as $key => $value) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$thread_array[$key] = new test_thread_run($value["url"]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$thread_array[$key]->start();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($thread_array as $thread_array_key => $thread_array_value) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while($thread_array[$thread_array_key]->isRunning())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($thread_array[$thread_array_key]->join())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$variable_data[$thread_array_key] = $thread_array[$thread_array_key]->data;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $variable_data;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;function model_http_curl_get($url,$userAgent="") 
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$userAgent = $userAgent ? $userAgent : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$curl = curl_init();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($curl, CURLOPT_URL, $url);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($curl, CURLOPT_TIMEOUT, 5);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = curl_exec($curl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($curl);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $result;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;for ($i=0; $i < 100; $i++) 
&nbsp;&nbsp;&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$urls_array[] = array("name" => "baidu", "url" => "http://www.baidu.com/s?wd=".mt_rand(10000,20000));
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;$t = microtime(true);
&nbsp;&nbsp;$result = model_thread_result_get($urls_array);
&nbsp;&nbsp;$e = microtime(true);
&nbsp;&nbsp;echo "多线程：".($e-$t)."&#92;n";

&nbsp;&nbsp;$t = microtime(true);
&nbsp;&nbsp;foreach ($urls_array as $key => $value) 
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result_new[$key] = model_http_curl_get($value["url"]);
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;$e = microtime(true);
&nbsp;&nbsp;echo "For循环：".($e-$t)."&#92;n";
?>
</textarea><br/>Tags - <a href="http://zyan.cc/tags/php%25E5%25A4%259A%25E7%25BA%25BF%25E7%25A8%258B/" rel="tag">php多线程</a> , <a href="http://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/%25E5%25A4%259A%25E7%25BA%25BF%25E7%25A8%258B/" rel="tag">多线程</a> , <a href="http://zyan.cc/tags/pthreads/" rel="tag">pthreads</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/taobaoke_click_urls/</link>
<title><![CDATA[根据淘宝商品 num_iid 批量生成淘宝客链接的 PHP 函数]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Thu, 16 Feb 2012 06:08:13 +0000</pubDate> 
<guid>http://zyan.cc/taobaoke_click_urls/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2012.02.16 转载请注明原文链接：<a href="http://blog.zyan.cc/taobaoke_click_urls/" target="_blank">http://blog.zyan.cc/taobaoke_click_urls/</a>]<br/><br/>　　根据淘宝商品 num_iid 批量生成淘宝客（<a href="http://baike.baidu.com/view/2133469.htm" target="_blank">什么是淘宝客？</a>）链接的 PHP 文件内容如下。<br/><br/>　　淘宝 API 有调用次数限制，一次 API 调用，可以最大返回40个商品的淘宝客链接，因此，在本函数内，如果需要批量生成的淘宝商品 num_iid 数大于40，将按照40个一次，分多次调用。如果调用淘宝 API 查询过的商品 num_iid，不管其是否有淘宝客链接（有些商品没有淘宝客推广链接），都将利用 Memcached 缓存起来，下次直接查缓存，不会重复调用淘宝 API。<br/><br/><div class="code">&lt;?php<br/>require_once(dirname(__FILE__).&#039;/TopSdk.php&#039;); //引用淘宝开放平台 API SDK<br/><br/>function object2Array($d)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_object($d))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$d = get_object_vars($d);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (is_array($d))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return array_map(__FUNCTION__, $d);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $d;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/><br/>/*********************************************<br/>* 函数名：get_taobaoke_link ($num_iids)<br/>* 函数用途：通过淘宝商品 num_iids 获取其对应的淘宝客手机版链接 <br/>* 创建时间：2012-02-14<br/>* 创建人：张宴 net@zyan.cc<br/>* 参数说明：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&nbsp;&nbsp; 淘宝商品ID（支持多个商品）数组，示例如下：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;13583512568&quot;;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;10809380078&quot;;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$num_iids&#91;&#93; = &quot;10809380079&quot;;&nbsp;&nbsp;<br/>* 返回值：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;下标为淘宝商品 num_iid ，值为淘宝客链接 click_url 的二维数组。如果无淘宝客链接，click_url 为空字符串，示例如下：<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(3) &#123;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;13583512568&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(191) &quot;http://auction1.wap.taobao.com/auction/item_detail-0db2-13583512568.jhtml?tks=jUTwPLMDtUUNEZhqfEuTZqkZhGw1LA7%2BzCJBXCj27NpurHxjZN70Amg0DVaFU61pfnHwW%2FI4MZGm%0Awgb69kbb1NL8uwtu%2BDnyAunBCVDP&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;10809380078&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(187) &quot;http://auction1.wap.taobao.com/auction/item_detail-0db2-10809380078.jhtml?tks=jUTwPLMDtUUNEGWhOOgVVuX%2BJKYt7fesyuZjEe7hvmpTJxYDfK8i1Wpvfl7lwI7nzD9W8M352v6E%0AyuUtsKun81AGltKzJWCYPiVDiOeC&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;&quot;10809380079&quot;&#93;=&gt;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string(0) &quot;&quot;<br/>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>*********************************************/<br/>function get_taobaoke_link ($num_iids) &#123;<br/>&nbsp;&nbsp;$memcache = new Memcache;<br/>&nbsp;&nbsp;$memcache-&gt;connect(&#039;127.0.0.1&#039;, 11911); //Memcached 缓存服务器地址<br/>&nbsp;&nbsp;$click_urls = $memcache-&gt;get($num_iids);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;foreach ($num_iids AS $num_iid) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!isset($click_urls&#91;$num_iid&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids_arr&#91;&#93; = $num_iid;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (!empty($tbapi_num_iids_arr)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$numbers = count($tbapi_num_iids_arr);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$numbers_max = 40; //淘宝 API 限制最大返回40条记录<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($numbers &gt; 0) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_times = ceil($numbers / $numbers_max); //第一层循环的循环次数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_start = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_end = $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($numbers_i = 1; $numbers_i &lt;= $numbers_times; $numbers_i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($numbers_j = $numbers_start; $numbers_j &lt; $numbers_end; $numbers_j++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($numbers_j &gt;= $numbers) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids_arr_sp&#91;&#93; = $tbapi_num_iids_arr&#91;$numbers_j&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_start = $numbers_start + $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numbers_end = $numbers_end + $numbers_max;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tbapi_num_iids = implode(&quot;,&quot;, $tbapi_num_iids_arr_sp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c = new TopClient;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;appkey = 12498835; //淘宝开放平台 API 接口 App Key<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;secretKey = &quot;745db5f8e316f9f1aa8310a7568d6566&quot;; //淘宝开放平台 API 接口 App Secret<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$c-&gt;format = &quot;json&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req = new TaobaokeItemsConvertRequest;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setFields(&quot;num_iid,click_url&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setNumIids($tbapi_num_iids);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setPid(29509662); //淘宝联盟（阿里妈妈）PID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$req-&gt;setIsMobile(&quot;true&quot;); //如果要生成手机页面的淘宝客链接，选择 true；网页版选择 false<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$resp = $c-&gt;execute($req);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res = object2Array($resp);<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset($res&#91;&quot;taobaoke_items&quot;&#93;&#91;&quot;taobaoke_item&quot;&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$links = $res&#91;&quot;taobaoke_items&quot;&#93;&#91;&quot;taobaoke_item&quot;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($links as $value) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$memcache-&gt;set($value&#91;&quot;num_iid&quot;&#93;, $value&#91;&quot;click_url&quot;&#93;, MEMCACHE_COMPRESSED, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$click_urls&#91;(string)$value&#91;&quot;num_iid&quot;&#93;&#93; = $value&#91;&quot;click_url&quot;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tbapi_num_iids_arr_sp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($tbapi_num_iids);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($resp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($res);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($links);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unset($value);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;foreach ($num_iids AS $num_iid) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (!isset($click_urls&#91;$num_iid&#93;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$memcache-&gt;set($num_iid, &quot;&quot;, MEMCACHE_COMPRESSED, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$click_urls&#91;(string)$num_iid&#93; = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;$memcache-&gt;close();<br/>&nbsp;&nbsp;return $click_urls;<br/>&#125;<br/><br/>//演示<br/>$num_iids&#91;&#93; = &quot;13583512568&quot;;<br/>$num_iids&#91;&#93; = &quot;10809380078&quot;;<br/>$num_iids&#91;&#93; = &quot;10809380079&quot;;<br/>$click_urls = get_taobaoke_link ($num_iids);<br/>var_dump($click_urls);<br/>?&gt;</div><br/><br/><hr/><br/>　　淘宝开放平台（<a href="http://open.taobao.com/" target="_blank">http://open.taobao.com/</a>） PHP SDK 下载：<br/>............<br/><br/>Tags - <a href="http://zyan.cc/tags/%25E6%25B7%2598%25E5%25AE%259D%25E5%25AE%25A2/" rel="tag">淘宝客</a> , <a href="http://zyan.cc/tags/%25E6%2589%258B%25E6%259C%25BA/" rel="tag">手机</a> , <a href="http://zyan.cc/tags/%25E6%25B7%2598%25E5%25AE%259D%25E5%2595%2586%25E5%2593%2581/" rel="tag">淘宝商品</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/2011phptc/</link>
<title><![CDATA[2011中国PHP技术高峰论坛：PHP在金山游戏运营中的应用]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Sun, 08 May 2011 11:40:41 +0000</pubDate> 
<guid>http://zyan.cc/2011phptc/</guid> 
<description>
<![CDATA[ 
	　　5月7日，我在北京长城饭店“<a href="http://www.phpchina.com/2011phptc/" target="_blank">2011中国PHP技术高峰论坛</a>”上的演讲PPT：<br/><br/>　　下载地址1（国外服务器）：<a href="http://blog.zyan.cc/attachment/201105/2011phptc_zy.zip" target="_blank">http://blog.zyan.cc/attachment/201105/2011phptc_zy.zip</a><br/><br/>　　下载地址2（国内服务器）：<a href="http://ishare.iask.sina.com.cn/f/15231659.html" target="_blank">http://ishare.iask.sina.com.cn/f/15231659.html</a><br/><br/><hr/><br/>　　<a href="http://zyan.cc/attachment/201105/2011phptc_zy.jpg" target="_blank"><img src="http://zyan.cc/attachment/201105/2011phptc_zy.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　以下是我在会议主办方对演讲文字速录的基础上，修正错漏内容，整理之后，对应到每页PPT的文字内容：<br/><br/>　　[PPT No.1]<br/>　　大家下午好，现在我来跟大家分享的是PHP在金山游戏运营中的应用，包括团队协助开发实现方式、网站Web架构设计、游戏运营平台设计这些信息。<br/><br/>　　[PPT No.2]<br/>　　我议题主要有两个，一个是<a href="http://www.xoyo.com" target="_blank">金山游戏官方网站</a>的一些应用，另一个是金山游戏运营系统Keyes中的架构设计。<br/><br/>　　[PPT No.3]<br/>　　金山游戏官方网站包括<a href="http://my.xoyo.com" target="_blank">用户中心</a>、<a href="http://kefu.xoyo.com" target="_blank">客服系统</a>、<a href="http://bbs.xoyo.com" target="_blank">论坛</a>、<a href="http://v.xoyo.com" target="_blank">视频</a>、各游戏<a href="http://jx3.xoyo.com" target="_blank">官网</a>，以及其他跟游戏相关的一些产品，主要采用64位CentOS Linux系统、Nginx、PHP 5.2版本、MySQL 5.5。<br/><br/>　　[PPT No.4]<br/>　　首先来看团队协作开发。我们肯定遇到过这样一种情况，在很多项目中，都是多个人同时开发，涉及到开发环境和测试环境不一样。我们很多PHP工程师，都是在Windows上开发代码，虽然Windows上也可以配置Nginx+PHP+MySQL环境，但是，由于测试环境、生产环境都是Linux系统，而且一些功能只能在Linux下运行，还有一些PHP扩展（例如：分布式图片处理、金山通行证加密扩展），也只能运行在Linux环境中。当我们在Windows上修改完几行PHP代码，想马上看一下执行结果，如果利用FTP之类的工具传到Linux测试服务器上再测试，就太慢了。如果同一台Linux测试服务器上，有多少人同时开发，你上传上去PHP文件，可能会覆盖别人上传的同名文件，就没有办法做到版本控制。<br/><br/>　　[PPT No.5]<br/>　　我们从图中可以看到，假如是程序员A和B都在Windows上开发代码，由于Nginx与PHP之间采用的是TCP FastCGI协议通讯，因此，两者可以分离到不同的服务器上。我们可以把Nginx安装在程序员各自的Windows PC机上，用本机的Nginx处理HTTP请求，用Linux测试服务器上的php-cgi程序，处理PHP请求。程序员在Windows上开发程序，保存之后，不用做任何上传操作，即可用Linux上的php-cgi调试程序。从图中这个流程可以看到，首先，两个程序员分别从SVN版本库，获取到一个项目的最新版本，各自进行一些修改。两人修改程序时，采用的是同一台Linux测试服务器的php-cgi，对各自PC机上的PHP程序进行调试。在PC机上本地测试没有问题，可以提交到SVN版本库。我们做了一个自动同步程序，利用SVN钩子，在每次发生svn commit提交时，在对应的测试服务器的对应项目路径内，执行svn update，将最新修改到文件同步到测试服务器。后来发现有一些问题，如果我们一个项目的目录、程序文件特别多的话，svn update需要遍历扫描目录列表，非常慢。因为我们的SVN是和Apache结合起来使用的，Apache可以记录日志，于是，我们进行了改进，将SVN提交日志记录到Linux下的命名管道内，再用一个程序从命名管道内读取日志，只svn update每次修改的几个文件，这样，速度就非常快了。设置hosts为Linux测试服务器的IP，就可以测试多位程序员代码合并后的效果了。<br/><br/>............<br/><br/>Tags - <a href="http://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/post/459/</link>
<title><![CDATA[Windows 和 Linux 下生成以当前时间命名的文件]]></title> 
<author>张宴 &lt;net@s135.com&gt;</author>
<category><![CDATA[PHP/JS/Shell]]></category>
<pubDate>Mon, 28 Feb 2011 07:33:09 +0000</pubDate> 
<guid>http://zyan.cc/post/459/</guid> 
<description>
<![CDATA[ 
	　　在 Windows、Linux 操作系统，分别利用BAT批处理文件和Shell脚本，生成类似“20110228_082905.txt”以“年月日_时分秒”命名的文件。<br/><br/>　　Windows BAT批处理文件：<br/><div class="code">@echo off<br/>set time_hh=%time:~0,2%<br/>if /i %time_hh% LSS 10 (set time_hh=0%time:~1,1%)<br/>set filename=%date:~,4%%date:~5,2%%date:~8,2%_%time_hh%%time:~3,2%%time:~6,2%<br/>echo test &gt;&gt; %filename%.txt<br/></div><br/><br/>　　Linux Shell 脚本：<br/><div class="code">#!/bin/sh<br/>echo test &gt;&gt; $(date -d &quot;today&quot; +&quot;%Y%m%d_%H%M%S&quot;).txt<br/></div><br/>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/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://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/centos/" rel="tag">centos</a> , <a href="http://zyan.cc/tags/linux/" rel="tag">linux</a> , <a href="http://zyan.cc/tags/freetds/" rel="tag">freetds</a> , <a href="http://zyan.cc/tags/sqlserver/" rel="tag">sqlserver</a> , <a href="http://zyan.cc/tags/mssql/" rel="tag">mssql</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/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://zyan.cc/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://zyan.cc/ajaxcdr/</guid> 
<description>
<![CDATA[ 
	　　[文章+部分代码 作者：张宴 本文版本：v1.0 最后修改：2009.03.09 转载请注明原文链接：<a href="http://blog.zyan.cc/ajaxcdr/" target="_blank">http://blog.zyan.cc/ajaxcdr/</a>]<br/><br/>　　最近的一个项目中，需要通过 JavaScript 提交表单数据到另一个域名下的PHP接口（因为数据较大，需要HTTP POST方式提交），并获取PHP接口的返回值，在页面无刷新、无跳转的情况下，更新div标签内的内容。<br/><br/>　　浏览器出于安全考虑，是不允许JavaScript代码进行跨域操作。JavaScript 和 AJAX 跨域访问分为两大类，一是本域和子域的交互，二是本域和其他域的交互。<br/><br/>　　一、本域和子域的交互：<a href="http://www.zyan.cc" target="_blank">www.zyan.cc</a> 和 blog.zyan.cc<br/>　　二、本域和其他域的交互：blog.zyan.cc 和 api.bz<br/><br/>　　本域和子域的交互，可以通过iframe设置两个域名document.domain = "zyan.cc"，实现统一zyan.cc域下的跨域访问。<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://zyan.cc/tags/ajaxcdr/" rel="tag">ajaxcdr</a> , <a href="http://zyan.cc/tags/ajax/" rel="tag">ajax</a> , <a href="http://zyan.cc/tags/javascript/" rel="tag">javascript</a> , <a href="http://zyan.cc/tags/cross-domain/" rel="tag">cross-domain</a> , <a href="http://zyan.cc/tags/cross/" rel="tag">cross</a> , <a href="http://zyan.cc/tags/domain/" rel="tag">domain</a> , <a href="http://zyan.cc/tags/flash/" rel="tag">flash</a> , <a href="http://zyan.cc/tags/form/" rel="tag">form</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/392/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2009.01.13 转载请注明原文链接：<a href="http://blog.zyan.cc/post/392/" target="_blank">http://blog.zyan.cc/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.zyan.cc"</span><br/><span style="color: #4169E1;">php></span> <span style="color: #FF7F50;">echo $var</span><br/>blog.zyan.cc<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://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/shell/" rel="tag">shell</a> , <a href="http://zyan.cc/tags/phpsh/" rel="tag">phpsh</a> , <a href="http://zyan.cc/tags/facebook/" rel="tag">facebook</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/390/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2008.12.30 转载请注明原文链接：<a href="http://blog.zyan.cc/post/390/" target="_blank">http://blog.zyan.cc/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://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/msn/" rel="tag">msn</a> , <a href="http://zyan.cc/tags/msnbot/" rel="tag">msnbot</a> , <a href="http://zyan.cc/tags/%25E6%259C%25BA%25E5%2599%25A8%25E4%25BA%25BA/" rel="tag">机器人</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/389/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2008.12.15 转载请注明原文链接：<a href="http://blog.zyan.cc/post/389/" target="_blank">http://blog.zyan.cc/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.zyan.cc/abc.php&quot;);&nbsp;&nbsp;" target="_blank">http://blog.zyan.cc/abc.php&quot;);&nbsp;&nbsp;</a> <br/>?&gt;</div></div><br/>　　但是，在DNS轮询等负载均衡中，同一域名，可能对应多台服务器，多个IP。假设blog.zyan.cc被DNS解析到72.249.146.213、72.249.146.214、72.249.146.215三个IP，用户每次访问blog.zyan.cc，系统会根据负载均衡的相应算法访问其中的一台服务器。<br/><br/>　　上周做一个视频项目时，就碰到这样一类需求：需要依次访问每台服务器上的一个PHP接口程序（假设为abc.php），查询这台服务器的传输状态。<br/><br/>　　这时就不能直接用file_get_contents访问<a href="http://blog.zyan.cc/abc.php" target="_blank">http://blog.zyan.cc/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.zyan.cc域名。于是，我写了下面这个PHP函数：<br/>............<br/><br/>Tags - <a href="http://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/312/</guid> 
<description>
<![CDATA[ 
	　　写了一个简单的发送HTML邮件的PHP函数。<br/><br/>　　函数说明：send_mail("发件人地址", "收件人地址", "邮件主题", "邮件正文");<br/><br/>　　示例：send_mail($from, &quot;info@zyan.cc&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://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/311/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.11.16 转载请注明出处：<a href="http://blog.zyan.cc" target="_blank">http://blog.zyan.cc</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://zyan.cc/tags/linux/" rel="tag">linux</a> , <a href="http://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/285/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.1 最后修改：2007.08.23 转载请注明出处：<a href="http://blog.zyan.cc" target="_blank">http://blog.zyan.cc</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://zyan.cc/attachment/200708/curl.gif" target="_blank"><img src="http://zyan.cc/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://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/284/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.08.15 转载请注明出处：<a href="http://blog.zyan.cc" target="_blank">http://blog.zyan.cc</a>]<br/><br/>　　当PHP截取中英文混合字符串时，最后一个汉字经常被拆成两半，例：截取字符串的前18个字<br/>............<br/><br/>Tags - <a href="http://zyan.cc/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zyan.cc/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://zyan.cc/post/257/</guid> 
<description>
<![CDATA[ 
	　　[文章作者：张宴 本文版本：v1.0 最后修改：2007.06.28 转载请注明出处：<a href="http://blog.zyan.cc" target="_blank">http://blog.zyan.cc</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://zyan.cc/tags/php/" rel="tag">php</a> , <a href="http://zyan.cc/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item>
</channel>
</rss>