2013-05-11 79 views
2

为什么shmop_open()不能返回共享内存ID,好像它似乎暗示它在文档中的含义?在PHP中使用共享内存

成功时shmop_open()将返回一个可以用来访问您创建的共享内存段的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命令?

+0

那么,文档没有说什么样的ID返回,它只是说它会返回*一个ID可以使用... *。我不会将文档解释为返回您正在查找的ID。我也猜测细节被抽象掉了,所以我怀疑它可能在本地获得你正在寻找的ID。 – nickb 2013-05-11 21:13:15

回答

3

这是打算。它返回一个你可以用PHP访问共享内存块的ID。这是一个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)的shmid是:1533149226

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

[[email protected] ~]$ 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。

+0

我添加了一种方法在PHP中获取shmid。我不相信有一种方法可以通过纯粹的PHP实现来获得它(除了创建扩展)。我很想被证明是错误的。 – 2013-05-11 21:59:44

+0

+1为好答案。不幸的是,我需要使用0。我正在重新创建一个传统的C程序,它使用'IPC_PRIVATE'作为关键。 – FtDRbwLXw6 2013-05-13 12:59:56

+0

啊,好的。我实际上很好奇为什么PHP开发者从未发现它适合将shmid公开到PHP中。我得到了他们正在完成的整个资源抽象,但是没有给出一种方法来查看底层操作系统资源标识符.....对于开发人员列表来说,这可能是一个很好的问题。 – 2013-05-13 17:47:54