牛骨文教育服务平台(让学习变的简单)
博文笔记

php中对共享内存,消息队列的操作

创建时间:2013-02-26 投稿人: 浏览次数:155

php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是php运行的一个周期,请求结束则生命周期截止。所以php在处理需要共 享的资源时,一般会将共享数据保存在数据库或dbm之类的文件中,再者就是利用内存实现共享。你可以选择已有的工具辅助你,像memcache;也可以自 己编写代码访问操作系统的共享内存段。

php中对共享内存段的操作有两组函数:System V IPCShared Memory。 其中System V IPC系列函数能够更方便的操作数据,无需像Shared Memory那样必须自己掌握读写时的偏移量、长度等,也不用序列化/反序列化来回转换(因为Shared Memory函数只支持字符串格式的数据参数)。但是System V IPC系列不支持Windows,所以如果要在win环境下使用,只能选Shared Memory。

因为php默认不支持这些函数,所以需要重编译php。如要使用:
System V信号量,编译时加上 –enable-sysvsem
System V共享内存,编译时加上 –enable-sysvshm
System V消息队列,编译时加上 –enable-sysvmsg
Shared Memory,编译时加上 –enable-shmop

先写个Shared Memory的例子:

<?php
$key = ftok(__FILE__, "i");
$size = 100;
$shm_h = @shmop_open($key, "c", 0644, $size);
if($shm_h === false) {
        echo "shmop open failed";
        exit;
}
$data = shmop_read($shm_h, 0, $size);
$data = unserialize($data);
//如果没有数据则写一个
if(empty($data)) {
        echo "there is no data";
        $data = "imdonkey";
        //就算数据是文本,write时也要序列化
        $write_size = shmop_write($shm_h, serialize($data), 0);
        if($write_size === false) echo "shmop write failed!";
}
//如果有,显示出来,之后删掉
else {
        echo "shared memory data: ";
        print_r($data);
        shmop_delete($shm_h);
}
shmop_close($shm_h);
?>

再写个System V shm的例子:
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。