<?php
//获得信号量的方法
$execute = function () {
//(1).创建IPC通信KEY
$key = ftok(__FILE__, 'a');
//(2).获取一个信号量资源句柄
$sem_handler = sem_get($key, 1);
if (sem_acquire($sem_handler, false)) {
echo '进程' . getmypid() . '获得信号量' . PHP_EOL;
//模拟业务执行
sleep(5);
//释放信号量(sem_get函数默认自动释放)
sem_release($sem_handler);
} else {
echo '进程' . getmypid() . '未获得信号量' . PHP_EOL;
}
};
//父进程执行函数
$mainFunc = function ($pid) {
sleep(10);
echo "10秒后所有进程跟我一起死" . PHP_EOL;
};
//(3).模拟父子进程抢占信号
$pid = pcntl_fork();
if ($pid == -1) {
throw new Exception('创建子进程失败');
} elseif ($pid) {
//父进程获取信号量
$execute();
} else {
//子进程获取信号量
$execute();
}//提示:
//1.sem_get函数默认设置为最多1个进程可以获取信号量,所以实现了锁的效果
//2.配合sem_acquire函数的no_wait参数实现阻塞或者非阻塞
//3.整体的效果和文件锁完全一样,但是比文件锁性能更好
前面的文章对于高并发下单商品导致商品库存为负值的问题请先阅读再阅读本篇文章一定对您有帮助,建议亲手测试较好。加上文件锁后的下单处理代码:【一】.阻塞模式:(如果其他进程已经加锁文件,当前进程会一直等其他进程解锁文件后继续执行)<?php //连接数据库 $con=mysqli_connect(...
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/** * 获取应用根目录 * @return string */ public static function getRootP...
<?php /** * @throws Exception */ function curl() { throw new \Exception('err...
php7新增的特性(1).强制限制只能返回一种类型<?php class task { } //must return an integer function add(): int { &nb...