当前位置: 首页 > Linux

作为phper,既然知道了共享内存函数shmop的使用,就一定要明白什么是信号量,以及在单个PHP中读取、写入、创建、删除共享内存方面使用信号量的代码案例

时间:2023-04-06 01:39:02 Linux

过程你应该没问题。但是在实际运行中,不可能只有一个PHP进程在运行。如果在多进程的情况下仍然使用单进程的处理方式,肯定会遇到问题——著名的并行和互斥问题。例如,两个进程需要同时读写同一块内存。当两个进程同时执行写操作时,你会得到一个错误的数据,因为内存段将是最后执行的进程的内容,甚至是随机依次出现的2个进程写入的数据的混合。有四种不同的图像。这显然是不能接受的。为了解决这个问题,必须引入互斥机制。互斥机制在很多操作系统教材中都有专门的介绍,这里不再赘述。实现互斥机制的最简单方法是使用信号量。信号量是进程间(IPC)的另一种方式,不同于其他IPC机制(管道、FIFO、消息队列)。说到信号量,大家可能比较陌生。作为php的你肯定知道mysql、redis中的锁,当然还有php文件锁。说白了就是锁,用来解决进程(线程同步问题),访问前获取锁(未获取则等待),访问后释放锁。信号量的作用是考虑是否有多个进程同时向共享内存写入数据,是否需要避免冲突。举个生活中的例子:以经营停车场为例。为简单起见,假设停车场只有三个车位,而且一开始三个车位都是空的。此时如果有五辆车同时进来,看门人让其中三辆直接进入,然后放下车挡,剩下的车必须在入口处等候,后面的车也都要等候在入口。这时,一辆汽车离开了停车场。看门人知道后,打开挡车板,把外面的车放了进去,剩下两辆车,再放两辆车,以此类推。在这个停车场系统中,车位是公共资源,每辆车就像一个线程,看门人充当信号量。记得为环境开启两个扩展【enable-shmop--enable-sysvsem】因为php默认不支持这两个功能,所以需要重新编译php。如果要使用:SystemV信号量,编译时加上--enable-sysvsemSystemV共享内存,编译时加上--enable-sysvshmSystemV消息队列,编译时加上--enable-sysvmsgSharedMemory,加上--enable-shmop信号量系列函数0){foreach($child_listas$key=>$pid){$status=pcntl_waitpid($pid,$status);如果($status>0||$status==-1){unset($child_list[$key]);}}sleep(1);}$count=shm_get_var($shm_id,SHARE_KEY);echo"$count".PHP_EOL;//销毁信号量sem_remove($signal);shm_remove($shm_id);shm_detach($shm_id);实际使用中,可以根据场景灵活使用~