php 共享数据,PHP 队列跨进程共享数据

linux下可以轻松的利用PHP扩展做一个更完善的,独立服务的队列。但是WIN下相对就麻烦了。这个类只基于PHP核心函数。

原理:利用数组实现队列,讲数组序列化存入文档以实现数据共享。其中存储文件读写时加锁,防止同时操作造成脏读。

1.[代码][PHP]代码

/* vim: set expandtab tabstop=4 shiftwidth=4: */

// +----------------------------------------------------------------------+

// | PHP version 5 |

// +----------------------------------------------------------------------+

// | Copyright (c) 1997-2004 The PHP Group |

// +----------------------------------------------------------------------+

// | This source file is subject to version 3.0 of the PHP license, |

// | that is bundled with this package in the file LICENSE, and is |

// | available through the world-wide-web at the following url: |

// | http://www.php.net/license/3_0.txt. |

// | If you did not receive a copy of the PHP license and are unable to |

// | obtain it through the world-wide-web, please send a note to |

// | license@php.net so we can mail you a copy immediately. |

// +----------------------------------------------------------------------+

// | Authors: xavier007 <499873958@qq.com> |

// +----------------------------------------------------------------------+

//

// $Deque=new Deque(__DIR__.'/cache.txt');

// $Deque->addFirst();

// Deque:实现了PHP队列。可以在多进程之间共享队列信息。

//

//

class Deque{

private $list_array;

private $filename;

public function __construct($filename="cache.txt") {

$this->list_array=array();

$this->filename=$filename;

}

private function _write($data=array()){

$str=serialize($data);

$fp = fopen($this->filename, 'w+');

if(flock($fp,LOCK_EX)) {

$arr['name'] = 'foo2';

ftruncate($fp, 0);

fwrite($fp,$str);

fflush($fp);

flock($fp, LOCK_UN);

}

fclose($fp);

}

private function _read(){

try

{

$file = $this->filename;

if (file_exists($file )){

$fp = fopen($file , 'r+');

$str="";

if(flock($fp , LOCK_EX)){

while (!feof($fp)) {

$str .= fread($fp, 100);

}

flock($fp , LOCK_UN);

} else{

echo "Lock file failed...\n";

}

fclose($fp);

$data=unserialize($str);

return $data;

}

return array();;

}

catch(Exception $e)

{

return array();;

}

}

private function _update(){

$arr=self::_write($this->list_array);

}

/**(尾部)入队 **/

public function addLast($value)

{

$arr=self::_read();

$this->list_array=$arr;

array_push($this->list_array,$value);

$arr=self::_update();

return $this->list_array;

}

/**(尾部)出队**/

public function removeLast()

{

$arr=self::_read();

$this->list_array=$arr;

array_pop($this->list_array);

$arr=self::_update();

return $this->list_array;

}

/**(头部)入队**/

public function addFirst($value)

{

$arr=self::_read();

$this->list_array=$arr;

array_unshift($this->list_array,$value);

$arr=self::_update();

return $this->list_array;

}

/**(头部)出队**/

public function removeFirst()

{

$arr=self::_read();

$this->list_array=$arr;

array_shift($this->list_array);

$arr=self::_update();

return $this->list_array;

}

/**清空队列**/

public function makeEmpty()

{

$arr=self::_read();

$this->list_array=$arr;

unset($this->list_array);

$this->list_array=array();

$arr=self::_update();

return $this->list_array;

}

/**获取列头**/

public function getFirst()

{

return reset($this->list_array);

}

/** 获取列尾 **/

public function getLast()

{

return end($this->list_array);

}

/** 获取长度 **/

public function getLength()

{

return count($this->list_array);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
php实现文件共享(其于windows网上邻居原理)   通过本php文件,在进行相关设置后,您可以方便的看到共享目录中的文件,以及相应的说明,便于能够迅速找到自己想要的文件。   找到想要的东西后,直接点击文件夹名打开共享文件夹。 使用方法: 1: 将index.php放在网站根目录。 2: 本脚本支持从根目录向下两级目录显示,目录名可为中文英不限,但是建议使用英文。 3: 请在根目录下建好各种分类文件夹,不要在根目录下直接放普通文件。 4: 要添加新的脚本时,请在所属分类目录中再建一个目录,文件名可为中英文,取名最好简捷明了能直接说明用途。在这个文件夹内放入要用的脚本,并且建一个readme.txt文件,在此txt文件中说明脚本的具体功能和用法。    当用访问的时候,脚本将直接显示在网页列表中,并且在下面显示readme.txt文件中的内容。 5: 直接点击文件夹时,将自动用网上邻居打开此文件所在目录。    这个路径需要一个默认值,建议将网站的根目录直接从服务器上面共享,并将此共享目录的网上邻居目录填到index.php的$netdir变量的''之间。 再次重申: 1: 本脚本只支持网站根目录向下的两级文件夹,再有深层目录将不予判断。   2: 此脚本只支持ie内核的浏览器,非IE内核浏览器不支持file://abc.abc.com这样的链接,所以点了链接也打不开。 另: 只为功能所以美工基本没有,眼睛吃点苦了。        顺便宣传一下我的PHP LAMP群:34513293  WEB前端群:73269871 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值