共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
php中封装了shm开头的函数和shmop开头的函数,实际效果是一样的,具体使用方式请查看官方手册 ,下面我们以shm开头的为例演示
共享内存是将内存映射到其他进程的地址空间中,所以说共享内存也是最快的IPC进程通信方式
在使用IPC进程通信时,也就是信号量、消息队列、共享存储时,首先要先确定自己的PHP扩展是否已经开启,使用php -m
查看
$key = ftok('demo25.php','x');
//创建共享存储
$shmId = shm_attach($key,128);
$pid = pcntl_fork();
if($pid == 0)
{
//获取数据
$data = shm_get_var($shmId,1);
fprintf(STDOUT,"recv data=%s\n",$data);
exit(0);
}
//写入数据
shm_put_var($shmId,1,'test');
//回收子进程
$pid = pcntl_wait($status);
if($pid > 0)
{
//删除共享存储
// shm_remove($shmId);
fprintf(STDOUT,"child process exit ok pid=%d\n",$pid);
}
执行代码,查看结果,发现父子进程之间也可以实现通信,至于非血缘关系的通信,则看我之前的文章,自己实现即可
当然,IPC进程间的通信数据也会保存在Linux系统中,可通过下面的方式,具体查看相关信息
并且如果想知道系统调用的哪些底层函数,则可以用 strace -f -s 6550 xxxx
执行查看底层函数,亦或者说根据php的函数去查看PHP官方C源码 php-src 并根据查到的相关C调用的函数,去查看 linux系统函数,了解相关知识 linux 文档
本文为北溟有鱼QAQ原创文章,转载无需和我联系,但请注明来自北溟有鱼QAQ https://www.umdzz.cn