php中对共享内存段的操作有两组函数:System V IPC和Shared 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
介绍完共享内存再顺带提一下消息队列Message Queue(也是在System V IPC函数组中),消息队列似乎可以视为另一种共享内存,只是数据存储的方式有些不同。简单来说,就是每个key对应一个队列,每个队列可以保存多个数据,数据间按照先进先出的原则进行操作。php文档中的例子很好的介绍了各函数的应用:
ftok ( string $pathname , string $proj ) 手册上给出的解释是:Convert a pathname and a project identifier to a System V IPC key。这个函数返回的键值唯一对应linux系统中一个消息队列。在获得消息队列的引用之前都需要调用这个函数。
msg_get_queue ( int $key [, int $perms ] ) msg_get_queue() 会根据传入的键值返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。函数 的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是同一个意思,因为在linux系统中一切皆是文件。
<?php $message_queue_key = ftok(__FILE__, 'a'); $message_queue = msg_get_queue($message_queue_key, 0666); $pids = array(); for ($i = 0; $i < 5; $i++) { //创建子进程 $pids[$i] = pcntl_fork(); if ($pids[$i]) { echo "No.$i child process was created, the pid is $pids[$i]\r\n"; } elseif ($pids[$i] == 0) { $pid = posix_getpid(); echo "process.$pid is writing now\r\n"; msg_send($message_queue, 1, "this is process.$pid's data\r\n"); posix_kill($pid, SIGTERM); } } do { msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT); echo $message; //需要判断队列是否为空,如果为空就退出 //break; } while(true) ?> 运行结果为: No.0 child process was created, the pid is 5249 No.1 child process was created, the pid is 5250 No.2 child process was created, the pid is 5251 No.3 child process was created, the pid is 5252 No.4 child process was created, the pid is 5253 process.5251 is writing now this is process.5251's data process.5253 is writing now process.5252 is writing now process.5250 is writing now this is process.5253's data this is process.5252's data this is process.5250's data process.5249 is writing now this is process.5249's data