php信号量

简介: php信号量
<?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.整体的效果和文件锁完全一样,但是比文件锁性能更好

目录
相关文章
|
11月前
|
安全 PHP
PHP文件读写锁的问题详解
PHP文件读写锁的问题详解
PHP进程池是干什么的?底层原理是什么?
PHP进程池是干什么的?底层原理是什么?
123 0
|
PHP 调度
浅谈 实现php多线程
浅谈 实现php多线程
|
Ubuntu PHP
php管道通信
php管道通信
139 0
|
PHP
php共享内存,php共享内存的使用
php共享内存,php共享内存的使用
58 0
|
安全 PHP
PHP多线程
1、扩展下载链接:https://windows.php.net/downloads/pecl/releases/pthreads 2、php扩展安装:pthreads a)注意事项: i.Php必须是线程安全的版本(TS),可以在phpinfo中查看
|
安全 PHP
php不支持多线程怎么办
PHP 默认并不支持多线程,要使用多线程需要安装 pthread 扩展,而要安装 pthread 扩展,必须使用 --enable-maintainer-zts 参数重新编译 PHP,这个参数是指定编译 PHP 时使用线程安全方式。
820 0
|
消息中间件 存储 Unix
PHP共享内存详解
前言 在PHP中有这么一族函数,他们是对UNIX的V IPC函数族的包装。 它们很少被人们用到,但是它们却很强大。巧妙的运用它们,可以让你事倍功半。 它们包括: 信号量(Semaphores) 共享内存(Shared Memory) 进程间通信(Inter-Process Messaging, IPC)   基于这些,我们完全有可能将PHP包装成一基于消息驱动的系统。
1359 0
|
PHP Windows 索引
优雅的玩PHP多进程
proc_open (PHP 4 >= 4.3.0, PHP 5, PHP 7) proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。 说明 ¶ resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string$cwd [, array $env [, array $other_options ]]] ) 类似 popen() 函数, 但是 proc_open() 提供了更加强大的控制程序执行的能力。
1458 0