备份下代码
<?php
namespace Lib\Library;
use Closure;
use Exception;
/**
* 文件锁
* 1.阻塞,进程加锁时发现其他进程已经加锁会一直阻塞等待,一直等到可以加锁成功,然后去执行业务代码
* 2.非阻塞,进程加锁时发现其他进程已经加锁直接返回,不会执行业务代码
* 3.注意Erp默认Session驱动为文件,本身请求已经存Session锁机制,所以测试非阻塞时请修改Session驱动为Redis
* @package Lib\Library
*/
class FileLock
{
/**
* 锁文件位置
* @var string
*/
private $file;
/**
* 锁文件句柄
* @var
*/
private $fileHandle;
/**
* 构造函数
* @param string $name 锁名称
* @throws Exception
*/
public function __construct($name = 'lock')
{
//初始化文件
$path = RUNTIME_PATH . 'Lock' . DIRECTORY_SEPARATOR;
$this->file = $path . md5($name);
if (!is_dir($path)) {
if (!mkdir($path, 0777, true)) {
throw new Exception('文件锁目录创建失败,请检查目录' . $path . '是否可写');
}
}
if (!file_exists($this->file)) {
if (file_put_contents($this->file, '')) {
throw new Exception('文件锁创建失败,请检查文件' . $this->file . '是否可写');
}
}
}
/**
* 加锁
* @param bool $block
* @return bool
*/
public function lock($block = true)
{
$this->fileHandle = fopen($this->file, 'r');
$is_flock = $block ? flock($this->fileHandle, LOCK_EX) : flock($this->fileHandle, LOCK_EX | LOCK_NB);
if (!$is_flock) {
fclose($this->fileHandle);
}
return $is_flock;
}
/**
* 释放
*/
public function release()
{
if (!$this->fileHandle) {
return false;
}
$unlock = flock($this->fileHandle, LOCK_UN);
if ($unlock) {
fclose($this->fileHandle);
$this->fileHandle = null;
}
return $unlock;
}
/**
* 加锁执行
* @param Closure $func 执行闭包函数
* @param bool $block 是否阻塞
* @return mixed 闭包函数的返回值
*/
public function lockToExecute($func, $block = true)
{
$is_flock = $this->lock($block);
$call_back = null;
if ($is_flock) {
$call_back = $func();
$this->release();
}
return $call_back;
}
} Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了,如果你单纯的认为SESSION和COOKIE没有联系的话请迅速百度补脑。 &nbs...
因项目需要需要统计用户无限下级计算分销佣金,计算每月分红,计算无限下级团队的业绩,需要先获得某个会员的无限下级成员。先看看数据库中的member表字段id username &...
在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型.和其他语言有点差距.(1).在值类型中我们直接使用&符号表示指向对应变量的内存地址,当前变量和被指向的变量只要有1个的值被修改都会直接影响另外一个变量的值发生变化。(ps:还是非常节省内存的,可以使用...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...
【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1. <?php 2. $data = ['1', '2', &...
php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int { &nb...