备份下代码
<?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;
}
} 源码:特别适用于微信支付中通知微信支付网关function array2xml($arr, $level = 1) { $s = $level == 1 ? "<xml&g...
开发com组件可以用c++,vc++,net,我比较熟悉net,演示用dnet(1).创建项目:启动vs2017,新建项目,选择Visual C# ->Windows桌面->类库通用windows(2). 修改Com项目:点击 项目->项目属性,再点击应用程序->程序集信息,...
xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。(1).创建xmlrpc服务端(求和函数api)function getSum($method,$ar...
使用openssl扩展对应替换mcrypt的函数,(比较麻烦,但是openssl是未来趋势)在新版php中编译mcrypt扩展使用一个纯php代码实现的mcrypt扩展库,git地址为https://github.com/phpseclib/mcrypt_compat,每个mcrypt的方法都已经实...
(1).管道是干嘛的?管道是用于进程之间通信的,传播或交换信息(2).管道有几种?(2.1).匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。通常是指父子进程关系。(2.2).高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中...
整理一个自己用的编码转换方法,不需要知道原字符串的编码,只需要传入字符串,和你想要转换的编码。/** * 编码转换 * @param string $char * @param string $...