<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[使用linux共享内存的实现的php内存队列]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 06 May 2010 15:34:07 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<div class="code">&lt;?php&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 使用共享内存的PHP循环内存队列实现&nbsp;&nbsp;<br/> * 支持多进程, 支持各种数据类型的存储&nbsp;&nbsp;<br/> * 注: 完成入队或出队操作,尽快使用unset(), 以释放临界区&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> * @author wangbinandi@gmail.com&nbsp;&nbsp;<br/> * @created 2009-12-23&nbsp;&nbsp; <br/> */&nbsp;&nbsp;<br/>class SHMQueue&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $maxQSize = 0; // 队列最大长度&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $front = 0; // 队头指针&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $rear = 0;&nbsp;&nbsp;// 队尾指针&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $blockSize = 256;&nbsp;&nbsp;// 块的大小(byte)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $memSize = 25600;&nbsp;&nbsp;// 最大共享内存(byte)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $shmId = 0;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $filePtr = &#039;./shmq.ptr&#039;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private $semId = 0;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function __construct()&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$shmkey = ftok(__FILE__, &#039;t&#039;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;shmId = shmop_open($shmkey, &quot;c&quot;, 0644, $this-&gt;memSize );&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;maxQSize = $this-&gt;memSize / $this-&gt;blockSize;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 申請一个信号量&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;semId = sem_get($shmkey, 1);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_acquire($this-&gt;semId); // 申请进入临界区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;init();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private function init()&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( file_exists($this-&gt;filePtr) )&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$contents = file_get_contents($this-&gt;filePtr);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = explode( &#039;&#124;&#039;, $contents );&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( isset($data&#91;0&#93;) &amp;&amp; isset($data&#91;1&#93;))&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;front = (int)$data&#91;0&#93;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;rear&nbsp;&nbsp;= (int)$data&#91;1&#93;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function getLength()&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (($this-&gt;rear - $this-&gt;front + $this-&gt;memSize) % ($this-&gt;memSize) )/$this-&gt;blockSize;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function enQueue( $value )&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;ptrInc($this-&gt;rear) == $this-&gt;front )&#123; // 队满&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = $this-&gt;encode($value);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shmop_write($this-&gt;shmId, $data, $this-&gt;rear );&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;rear = $this-&gt;ptrInc($this-&gt;rear);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function deQueue()&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( $this-&gt;front == $this-&gt;rear )&#123; // 队空&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$value = shmop_read($this-&gt;shmId, $this-&gt;front, $this-&gt;blockSize-1);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;front = $this-&gt;ptrInc($this-&gt;front);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this-&gt;decode($value);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private function ptrInc( $ptr )&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ($ptr + $this-&gt;blockSize) % ($this-&gt;memSize);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private function encode( $value )&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = serialize($value) . &quot;__eof&quot;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( strlen($data) &gt; $this-&gt;blockSize -1 )&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception(strlen($data).&quot; is overload block size!&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $data;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private function decode( $value )&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = explode(&quot;__eof&quot;, $value);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return unserialize($data&#91;0&#93;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public function __destruct()&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data = $this-&gt;front . &#039;&#124;&#039; . $this-&gt;rear;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents($this-&gt;filePtr, $data);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sem_release($this-&gt;semId); // 出临界区, 释放信号量&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;<br/></div><br/><br/>使用的样例代码如下:<br/>// 进队操作&nbsp;&nbsp; <br/><div class="code">$shmq = new SHMQueue();&nbsp;&nbsp; <br/>$data = &#039;test data&#039;;&nbsp;&nbsp; <br/>$shmq-&gt;enQueue($data);&nbsp;&nbsp; <br/>unset($shmq);&nbsp;&nbsp; <br/>// 出队操作&nbsp;&nbsp; <br/>$shmq = new SHMQueue();&nbsp;&nbsp; <br/>$data = $shmq-&gt;deQueue();&nbsp;&nbsp; <br/>unset($shmq);</div><br/>来源：http://blog.csdn.net/ChaoticLife/archive/2009/12/23/5064172.aspx
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 使用linux共享内存的实现的php内存队列]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>