github地址

php-lock

安装

-PHP 7.1或以上
-可选的nrk/predis以使用Predis锁。
-可选的php-pcntl扩展名,用于启用锁定而flock() 无需在CLI脚本中等待。(linux)
-任选地flock(),ext-redis,ext-pdo_mysql,ext-pdo_sqlite, ext-pdo_pgsql或ext--memcached可以用作用于锁后端。请参阅下面的示例。
-如果ext-redis用于锁定并配置为使用igbinary进行序列化或使用lzf进行压缩,则必须另外安装-ext-igbinary和/或 ext-lzf必须安装。
###
composer require "malkusch/lock"

使用malkusch/lock测试超卖
链接:http://www.koukousky.com/back/3017.html

predis调用

$redis = new \Predis\Client(array(
    'scheme'   => 'tcp',
    'host'     => '127.0.0.1',
    'port'     => 6379,
));
#传入一个predis实例,设置redis key名为test_lock的锁,设置锁释放时间为10秒(10秒之后当前程序释放,新的实例获取此锁)
$mutex = new \malkusch\lock\mutex\PredisMutex([$redis], "test_lock",10);
$mutex->synchronized(function () {

    echo 'start';
    sleep(100);
    //代码逻辑
});

redis调用(需安装php-redis扩展)

$redis = new Redis();
$redis->connect("localhost");

$mutex = new PHPRedisMutex([$redis], "balance");
$mutex->synchronized(function () use ($bankAccount, $amount) {
    $balance = $bankAccount->getBalance();
    $balance -= $amount;
    if ($balance < 0) {
        throw new \DomainException("You have no credit.");
    }
    $bankAccount->setBalance($balance);
});

mysql调用

#它支持超时。如果与数据库服务器的连接丢失或中断,则锁定将自动释放。
#请注意,在MySQL 5.7.5之前,您不能使用嵌套锁,任何新锁都会静默释放已经持有的锁。您可能应#该避免在版本低于5.7.5的MySQL版本上使用此互斥锁。
$pdo = new PDO("mysql:host=localhost;dbname=test", "username");

$mutex = new MySQLMutex($pdo, "balance", 15);
$mutex->synchronized(function () use ($bankAccount, $amount) {
    $balance = $bankAccount->getBalance();
    $balance -= $amount;
    if ($balance < 0) {
        throw new \DomainException("You have no credit.");
    }
    $bankAccount->setBalance($balance);
});

解决 laravel-admin between datetime 假如数据库是时间戳int类型无法筛选。

laravel-admin默认的between->datetime(),查询默认是datetime类型,但是假如数据库是时间戳类型就会报错,又不想改底层文件的话可以试试加自定义筛选功能...

阅读全文

php解析英文语句,自动分解。

参考:https://www.php.net/manual/en/function.str-split.php 最近碰到一个问题,客户的英文地址太长,超出接口api字段长度,所以需要解析下语句分解发送。 ...

阅读全文

记录一个laravel-excel导出表格值为0导出excel显示空的解决方法。

最近在使用laravel-excel导出表格的时候,发现假如字段值为0的情况下,导出的excel中直接显示为空,找到一个方法解决,如下. 在laravel-excel的config配置中...

阅读全文

5 条评论

  1. 劝博主多读读文档了解下redis,这样容易误导新人,get set操作并不能保证原子性,在大流量情况下还是会有并发抢占问题,redis特地设置一个叫做setnx的原子性方法用来加锁用
    https://redis.io/commands/setnx/

    1. 由于SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。http://www.redis.cn/commands/set.html

回复 阿斯顿 取消回复