php有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上–enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。
这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。
一、System V的共享内存使用:
<?php
// 创建内存块
$key = 12345; // 共享内存的key,注:类型为int
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$var_key = 345; // 共享内存的某变量的key,注:类型为int
$shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存
shm_put_var( $shmid, $var_key, "abc" ); // 插入一个共享内存变量,key为$var_key,值为"abc"
shm_detach( $shmid ); // 关闭共享内存
?>
运行上面的php程序可以创建一个key为12345的共享内存,大小为100字节,里面有个值为“abc”的变量。在linux命令行敲入ipcs可以看到创建的共享内存信息:
—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0×00003039 262144 daemon 666 100 0
注:0×00003039就是12345的16进制形式。
访问新创建的共享内存并删除这个共享内存的PHP代码:
<?php
// 读取内存块内容
$shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc
shm_remove( $shmid ); // 删除该共享内存
?>
运行上面这个php代码,将显示abc,并把共享内存删除,这时候再运行ipcs就可以看到那块共享内存已经不存在了。
二、shmop的共享内存使用:
<?php
// 创建内存块
$key = 12345; // 共享内存的key
$memsize = 100; // 共享内存的大小,单位byte
$perm = 0666; // 共享内存访问权限,参考linux的权限
$offset = 0; // 共享内存偏移地址,0表示共享内存的起始地址
$shmid = shmop_open($key, "c", $perm, $memsize); // 创建一个共享内存,第二个参数c表示创建
$shm_bytes_written = shmop_write($shm_id, "abc", 0); // 把"abc"写入共享内存
echo $shm_bytes_written; // 打印出写入共享内存的数据长度,这里将显示3
shmop_close($shm_id); // 关闭共享内存
?>
运行这个php将创建一个key为12345,大小为100字节的共享内存,里面写入了”abc”这个字符串。我们在写一个访问这个共享内存的php:
<?php
// 读取内存块
$shm_id = shmop_open(12345, "w", 0, 0); // 打开key为12345的共享内存,第二个参数w表示以读写方式打开,打开已存在的共享内存,第三个和第四个参数必须是0
$shm_data = shmop_read($shm_id, 0, 3); // 从共享内存里面读取3字节的数据,第二个参数是偏移地址,0表示共享内存的起始地址
echo $shm_data; // 打印出上个函数返回的共享内存数据
shmop_delete($shm_id); // 删除共享内存
?>
运行这个php将打印出abc,并把原来的共享内存删除。
总结:
1. 这两套函数都是简单易用的,shmop的唯一好处是可以在windows下使用,在linux下的话推荐使用shm_*那套函数,因为那套函数在插入、更新以及读取共享内存里面的变量相当方便,而shmop需要自己来规划共享内存的存储结构,应用起来稍微复杂一点。此外,上面的例子里面我直接用数字12345作为共享内存的key,实际上,更为标准的做法是使用ftok函数来把一个路径转成ipc的key。具体做法可以参考php手册。
2. 在使用shmop时,如果使用完成后没有进行shmop_delete()操作,则下次对共享内存变量值的写入会有问题出现,如果前次写入的长度〉下次写入的长度,则只覆盖前面的,多余的内容保留。反之,如果前次写入的长度〈下次写入的长度,则多余的内容会自动追加到后面。
3. 共享内存时需要的key及变量均为int类型。
=================================
相关方法介绍:
shm_attach
打开建立共享内存空间。
语法: int shm_attach(int key, int [memsize], int [perm]);
返回值: 整数
函数种类: 操作系统与环境
内容说明: 本函数用来打开或者建立共享内存空间。参数 key 为这部分的键。参数 memsize 可省略,表示所需最小的内存空间 (单位为 byte 位组),默认值在 php3.ini 或 php.ini 中的 sysvshm.init_mem 配置,若无配置则为 10000 bytes。参数 perm 亦可省略,为该内存空间的使用权限,默认值为 666。返回值为共享内存的ID 值,可供程序使用。
shm_detach
中止共享内存空间链接。
语法: int shm_detach(int shm_identifier);
返回值: 整数
函数种类: 操作系统与环境
内容说明: 本函数用来中止与共享内存空间的链接。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。
shm_remove
清除内存空间。
语法: int shm_remove(int shm_identifier);
返回值: 整数
函数种类: 操作系统与环境
内容说明: 本函数用来清除共享内存空间的所有资料。参数 shm_identifier 即为欲停止部分的共享内存 ID 值。
shm_put_var
加入或更新内存空间中的变量。
语法: int shm_put_var(int shm_identifier, int variable_key, mixed variable);
返回值: 整数
函数种类: 操作系统与环境
内容说明: 本函数可用来增加或者修改内存空间中变量值。参数 shm_identifier 为欲增加修改的共享内存 ID 值。参数 variable_key 为欲增加修改的变量名称键。参数 variable 为变量的内容,变量的类型可以是倍精确数 (double)、整数 (integer)、字符串 (string) 或者是数组 (array)。
shm_get_var
取得内存空间中指定的变量。
语法: mixed shm_get_var(int shm_identifier, int variable_key);
返回值: 混合类型资料
函数种类: 操作系统与环境
内容说明: 本函数可用来取得内存空间中指定的变量值。参数 shm_identifier 为欲取得的共享内存 ID 值。参数 variable_key 为欲取得的变量名称键。返回值即为指定变量键的值。
shm_remove_var
删除内存空间中指定的变量。
语法: int shm_remove_var(int id, int variable_key);
返回值: 整数
函数种类: 操作系统与环境
内容说明: 本函数可用来删除内存空间中指定的变量值。参数 shm_identifier 为欲除去的共享内存 ID 值。参数 variable_key 为欲删除的变量名称键
分享到:
相关推荐
本文实例讲述了PHP共享内存使用与信号控制。分享给大家供大家参考,具体如下: 共享内存 共享内存的使用主要是为了能够在同一台机器不同的进程中共享一些数据,比如在多个 php-fpm 进程中共享当前进程的使用情况。...
本文将深入探讨如何使用PHP和C++通过IPC的两种常见机制——命名管道(Named Pipes)和共享内存(Shared Memory)来实现跨进程通信。这两种技术在高效率的系统设计中尤其重要。 首先,我们来看命名管道。命名管道是...
8. **多进程协作**: 在实际应用中,多个PHP进程可能会同时操作共享内存,因此需要使用信号量(sysvsem)进行同步控制,防止数据冲突。信号量可以限制对共享资源的并发访问。 9. **安全性考虑**: 在实现进程间的共享...
【PHP共享内存】是进程间通信(IPC,Inter-Process Communication)的一种高效方式,它允许多个进程共享同一块内存区域,从而实现数据的快速交换。PHP提供了两种扩展来实现共享内存:`shmop` 和 `Semaphore`。 1. *...
"提高php内存"这个主题涉及到如何有效地调整PHP配置以提升其内存使用限制,确保程序能够处理更复杂或资源密集型的任务。以下是一些关于PHP内存管理的核心知识点: 1. **内存限制(memory_limit)**: PHP的`memory...
本文中我们主要讨论共享内存和信号量的使用。在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法。如果你在一个进程中向所共享的内存写入一段信息,那么所有其他的进程也可以看到这段被写入的数据...
在asp.net和java中都有共享内存,php除了可以使用Memcached等方式变通以外其实php也是支持共享内存的,下面使用shmop来实现这个功能
总的来说,"PHP实现多服务器session共享之memcache共享"这个主题涵盖的知识点包括:session管理、分布式存储、memcache的使用、PHP配置、并发控制以及系统扩展性设计。掌握这些知识对于构建高可用、可扩展的Web应用...
该项目为基于PHP的多进程内存共享定时计划任务框架设计源码,包含44个文件,涵盖32个PHP脚本、7个Markdown文档、1个JSON配置、1个日志文件、1个数据库文件、1个命令文件、1个模板文件。该框架利用PHP的多进程和内存...
在实际应用中,我们可以使用 pmap 命令来查看 PHP 进程的内存占用情况,了解 PHP 扩展占用内存的情况,以便更好地优化 PHP 应用程序的性能和内存使用。 此外,我们还可以使用 pmap 命令来查看其他类型的进程的内存...
首先,需要了解phpExcel在内存使用上的机制。默认情况下,PHPExcel使用内存来存储单元格信息。这意味着,如果一次性读取或写入大量数据,就很容易超出PHP脚本执行的最大内存限制。为了缓解这一问题,可以通过更改...
如果共享内存已经存在(因为使用了'n'模式,表示如果共享内存不存在则创建),则直接返回成功,避免重复初始化。 4. **生成下一个序列号**:`next`方法同样通过信号量控制互斥。获取信号量后,打开共享内存,读取...
使用Redis或Memcached作为SESSION存储则更为高效,它们支持内存存储,提供快速的读写操作。PHP可以通过相应的扩展库与这些服务进行通信,如predis/predis库用于连接Redis,memcached库连接Memcached。在配置文件中...
在PHP中,可以使用`shm_attach()`函数创建或连接到一个共享内存区域,`shm_put_var()`和`shm_get_var()`用于在共享内存中设置和获取变量。示例代码中,创建了一个1024字节大小的共享内存区域,并使用`shm_has_var()`...
在传统的PHP开发中,由于其运行在FPM(FastCGI Process Manager)模式下,每个请求都会创建一个新的PHP进程,进程之间无法直接共享内存,这限制了数据的实时交互。然而,Swoole扩展引入了常驻内存的概念,使得PHP...
PHP多进程实例讲解,一个PHP,如何实现PHP多进程,并控制进程数量