php有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上 –enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。
这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。
一、System V的共享内存使用:
—— Shared Memory Segments ——–
key shmid owner perms bytes nattch status
0×00003039 262144 daemon 666 100 0
注:0×00003039就是12345的16进制形式。
访问新创建的共享内存并删除这个共享内存的PHP代码:
二、shmop的共享内存使用:
来源:http://code.haohailuo.com/article-78.html
A.ipcs -m 查看共享内存
B.ipcrm –M 0x20110302//清这个内存地址的缓存
C.ipcrm -M 0x20110303//清这个内存地址的缓存
这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考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可以看到创建的共享内存信息:// 创建内存块
$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 ); // 关闭共享内存
?>
—— 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就可以看到那块共享内存已经不存在了。// 读取内存块内容
$shmid = shm_attach( 12345 ); // 访问key为12345的共享内存
echo shm_get_var( $shmid, 345 ); // 把共享内存中key为345的变量打印出来,这里将显示abc
shm_remove( $shmid ); // 删除该共享内存
?>
二、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:// 创建内存块
$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
// 读取内存块
$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); // 删除共享内存
?>
// 读取内存块
$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); // 删除共享内存
?>
来源:http://code.haohailuo.com/article-78.html
A.ipcs -m 查看共享内存
B.ipcrm –M 0x20110302//清这个内存地址的缓存
C.ipcrm -M 0x20110303//清这个内存地址的缓存
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3977/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2013-3-1 10:08
评论列表