您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP进程锁如何实现

2024/3/13 19:58:24发布28次查看
<?php /** * cachelock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的sql请求穿透到数据库 * 用于解决php在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定 * 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁 * 使用了eaccelerator则在内存中处理,性能相对较高 * 不同的锁之间并行执行,类似mysql innodb的行级锁 * 本类在sunli的phplock的基础上做了少许修改 http://code.google.com/p/phplock * @author yangxinqi * */ namespace common\business; class phplock { //文件锁存放路径 private $path = null; //文件句柄 private $fp = null; //锁粒度,设置越大粒度越小 private $hashnum = 100; //cache key private $name; //是否存在eaccelerator标志 private $eaccelerator = false; /** * 构造函数 * 传入锁的存放路径,及cache key的名称,这样可以进行并发 * @param string $path 锁的存放目录,以"/"结尾 * @param string $name cache key */ public function __construct($name,$path='lock\\') { $app_path = str_replace('thinkphp/', '', think_path); $is_cli = php_sapi_name(); if($is_cli == 'cli' || $is_cli == 'cli_server') { $app_path = trim(app_path, '.'); } else { $app_path = $app_path . trim(app_path, '.'); } $path = $app_path.'/common/business/lockfile/'; if(!file_exists($path)) { mkdir($path); chmod($path,777); } //$path .= '/protected/runtime/cache/'; //判断是否存在eaccelerator,这里启用了eaccelerator之后可以进行内存锁提高效率 $this->eaccelerator = function_exists("eaccelerator_lock"); if(!$this->eaccelerator) { //$this->path = $path.($this->_mycrc32($name) % $this->hashnum).'.txt'; $this->path = $path.sha1($name).'.txt'; } $this->name = $name; } /** * crc32 * crc32封装 * @param int $string * @return int */ private function _mycrc32($string) { $crc = abs (crc32($string)); if ($crc & 0x80000000) { $crc ^= 0xffffffff; $crc += 1; } return $crc; } /** * 加锁 * enter description here ... */ public function lock() { //如果无法开启ea内存锁,则开启文件锁 if(!$this->eaccelerator) { //配置目录权限可写 $this->fp = fopen($this->path, 'w+'); if($this->fp === false) { return false; } return flock($this->fp, lock_ex); }else{ return eaccelerator_lock($this->name); } } /** * 解锁 * enter description here ... */ public function unlock() { if(!$this->eaccelerator) { if($this->fp !== false) { flock($this->fp, lock_un); clearstatcache(); } //进行关闭 fclose($this->fp); }else{ return eaccelerator_unlock($this->name); } } }
以上就是php进程锁如何实现的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product