备份下代码
<?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; } }
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...
(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习: (2.1)pcntl_fork()执行时: &nbs...
在编写多进程的实例中我在每个进程中使用如下代码://调用等待信号的处理器 while (true) { pcntl_signal_dispatch(); }开启5个进程,cpu直接100%修正之后的代码://调用等待信号的处理器 while&...