千家信息网

php信号量和共享内存的概念是什么

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,本文小编为大家详细介绍"php信号量和共享内存的概念是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"php信号量和共享内存的概念是什么"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来
千家信息网最后更新 2025年02月03日php信号量和共享内存的概念是什么

本文小编为大家详细介绍"php信号量和共享内存的概念是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"php信号量和共享内存的概念是什么"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

说明

1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作。

一个过程获得一个信号,必须被过程释放。

2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问。

在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号。

实例

echo "parent progress pid:{$parentPid}\n";$childList = array(); // 创建共享内存,创建信号量,定义共享key$shm_id = ftok(__FILE__,'m');$sem_id = ftok(__FILE__,'s');$shareMemory = shm_attach($shm_id);$signal = sem_get($sem_id);const SHARE_KEY = 1;// 生产者function producer(){    global $shareMemory;    global $signal;    $pid = posix_getpid();    $repeatNum = 5;    for ( $i = 1; $i <= $repeatNum; $i++) {        // 获得信号量        sem_acquire($signal);                if (shm_has_var($shareMemory,SHARE_KEY)){            // 有值,加一            $count = shm_get_var($shareMemory,SHARE_KEY);            $count ++;            shm_put_var($shareMemory,SHARE_KEY,$count);            echo "({$pid}) count: {$count}\n";        }else{            // 无值,初始化            shm_put_var($shareMemory,SHARE_KEY,0);            echo "({$pid}) count: 0\n";        }        // 用完释放        sem_release($signal);                $rand = rand(1,3);        sleep($rand);    }}function createProgress($callback){    $pid = pcntl_fork();    if ( $pid == -1) {        // 创建失败        exit("fork progress error!\n");    } else if ($pid == 0) {        // 子进程执行程序        $pid = posix_getpid();        $callback();        exit("({$pid})child progress end!\n");    }else{        // 父进程执行程序        return $pid;    }}// 3个写进程for ($i = 0; $i < 3; $i ++ ) {    $pid = createProgress('producer');    $childList[$pid] = 1;    echo "create producer child progress: {$pid} \n";}// 等待所有子进程结束while(!empty($childList)){    $childPid = pcntl_wait($status);    if ($childPid > 0){        unset($childList[$childPid]);    }}// 释放共享内存与信号量shm_remove($shareMemory);sem_remove($signal);echo "({$parentPid})main progress end!\n";

读到这里,这篇"php信号量和共享内存的概念是什么"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

0