在PHP中使用共享内存

时间:2013-05-11 21:03:35

标签: php ipc shared-memory

为什么shmop_open()没有返回共享内存ID,喜欢它似乎暗示它在文档中呢?

  

成功时,shmop_open()将返回一个id,您可以使用该ID访问您创建的共享内存段。

在此示例中,您可以看到返回的ID为4,但共享内存ID实际为578322450

[*@* *]$ php -r 'var_dump(shmop_open(0, 'c', 0666, 1024));'
int(4)
[*@* *]$ ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 578322450  *         666        1024       0

如果是这样,我如何从PHP检索ipcs命令中显示的值?

1 个答案:

答案 0 :(得分:3)

这是有意的。它返回一个id,您可以在PHP中使用它来访问共享内存块。这是一个shmop资源,你可以在这里看到:http://php.net/manual/en/resource.php

要弄清楚它是哪一个,请使用自己的密钥而不是0.我写了一个简单的例子:

<?php
echo "Opening shared memory!\n";

if($shm_id = shmop_open(0xdeadbeef, 'c', 0666, 1024)) {
   echo "Opened shared memory\n";
   echo "Wrote " . shmop_write($shm_id, "Testing", 0) . " bytes.\n";
   echo shmop_read($shm_id, 0, 7) . "\n";
   var_dump($shm_id);
   echo $shm_id . "\n";
   $line = `ipcs -m |grep deadbeef`;
   list($null, $shmid, $null) = explode(' ', $line);
   echo "shmid is: " . $shmid . "\n";
}
?>

输出:

  

打开共享内存!   打开共享内存写了7个字节。   测试   INT(4)   4   shmid是:1533149226

正如您所看到的,很容易找到:

[nedwidek@yule ~]$ ipcs -m |grep deadbeef
0xdeadbeef 1533149226 nedwidek   666        1024       0

只是我所追求的最新消息:

来自php-src / ext / shmop / shmop.c(https://github.com/php/php-src/blob/master/ext/shmop/shmop.c

rsid = zend_list_insert(shmop, shm_type TSRMLS_CC);
RETURN_LONG(rsid);

这里有两件事....验证您获得了资源ID并且持久化了shmop结构。这意味着可以获得shmod-> shmid。

我还订阅了内部邮件列表。我将发布一个查询,说明为什么他们不允许你获取shmid,如果引入了一个函数来获取它(或者可能是shmop细节作为哈希数组),他们会为此合并一个补丁。

让我知道你的兴趣水平是什么(在补丁上合作,接收我提出的任何补丁,等待PHP正式整合(如果有的话),或者没有)。如果你根本不感兴趣,我会停止更新我的答案。 - 关心Erik。