当前位置:首页 > PHP > 正文内容

php信号量

高老师5年前 (2021-05-18)PHP1140
<?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.整体的效果和文件锁完全一样,但是比文件锁性能更好

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/200.html

分享给朋友:

“php信号量” 的相关文章

PHP高并发下数据库值更新的问题

PHP高并发下数据库值更新的问题

(1).创建数据库test ,创建表shop(字段id,total),商品id是1,商品总数10    (2).PHP模拟购买,商品数量大于0才能购买<?php //连接数据库 $con=mysqli_connect("192.168.2.18...

php trait的使用

php trait的使用

PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts {     public f...

php elasticsearch基础使用

php elasticsearch基础使用

elasticsearch的操作都是基于http协议的,已经有现成的php类库,composer安装即可。{     "require": {        &...

在MyISAM引擎中使用事务会怎样

在MyISAM引擎中使用事务会怎样

众所周知MyISAM引擎不支持事务,但是我只是知道不支持事务,并未测试具体的表现是什么,测试代码如下:try {     //开启事务     Db::startTrans();    &...

php位运算符详解

php位运算符详解

文章篇幅较长,如果不喜欢看文章的,此处抛出韩顺丰老师的位运算视频,韩老师应该是全网讲php位运算符最详细的一个老师了。链接:https://pan.baidu.com/s/14xj7er8eVSUcJ-jYXyA0GA  提取码:731m 链接:https://pan.baidu.com...

thinkphp3定时任务,tp定时任务,thinkphp定时任务

thinkphp3定时任务,tp定时任务,thinkphp定时任务

本教程使用的定时任务基于EasyTak,EasyTask官方文档:https://gitee.com/392223903/EasyTask由于tp3.2.x官方开发未考虑命令行支持和绝对路径开发的标准,因此我编写了一个支持的类来运行。1.在tp3.2.3根目录下安装easytaskcomposer&...