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

php信号量

高老师5年前 (2021-05-18)PHP1156
<?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 trait的使用

php trait的使用

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

Thinkphp Call Stack,PHP调用栈Call Stack的获取

Thinkphp Call Stack,PHP调用栈Call Stack的获取

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...

php多进程实现任务管理器,定时执行任务,支持守护

php多进程实现任务管理器,定时执行任务,支持守护

主要原理是通过PHP创建多个子进程,在子进程中发送进程闹钟信号,然后再监听闹钟信号中继续发送闹钟信号。同时通过父进程设置非阻塞运行。代码如下:<?php /**  * 订单任务  */ class Order {    &n...

php异步信号处理

php异步信号处理

php7.1引入了PHP异步信号处理函数pcntl_async_signals() 来处理阻塞问题。在php7之前信号处理方式有2种,第一种是基于ticks来每执行一行代码来触发执行信号监听,第二种是直接while(true){  //监听信号 }第一种方式如果某行的代码阻塞时间较长会影响...

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

php代理下载,php代下载文件,php下载远程文件,php远程文件下载

经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....

windows安装php event扩展问题

windows安装php event扩展问题

php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...