在 PHP 中使用共享内存
Posted
技术标签:
【中文标题】在 PHP 中使用共享内存【英文标题】:Working with shared memory in PHP 【发布时间】:2013-05-11 21:03:35 【问题描述】:为什么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
命令中显示的值?
【问题讨论】:
嗯,文档没有说明返回什么样的 ID,只是说它会返回一个可以使用的 ID...。我不会将文档解释为返回您正在寻找的 ID。我也猜想细节被抽象掉了,所以我怀疑是否有可能在本地获取您正在寻找的 ID。 【参考方案1】:这是有意的。它返回一个 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个字节。 测试 整数(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 正式集成(如果有的话),或者没有)。如果您根本不感兴趣,我将停止更新我的答案。 -- 问候埃里克。
【讨论】:
我添加了一种在 PHP 中获取 shmid 的方法。我不相信有一种方法可以通过纯 PHP 实现(除了创建扩展)来获得它。我很想被证明是错的。 +1 以获得好的答案。不幸的是,我需要使用 0。我正在重新创建一个遗留的 C 程序,它使用IPC_PRIVATE
作为键。
啊,好的。我实际上很好奇为什么 PHP 开发人员从未认为将 shmid 暴露到 PHP 中是合适的。我得到了他们正在做的整个资源抽象,但是没有给你一种查看底层操作系统资源标识符的方法.....对于开发列表来说可能是一个好问题。
如果您对修补您的 PHP 版本感兴趣,我已经提交了一个引入 shmop_sys_shmid() 的版本。将您的 PHP shmop ID 传递给它,您将获得操作系统 shmid。 github.com/nedwidek/php-src/commit/…
干得好。我很感兴趣,但不幸的是,我无法在我的目标机器上修补 PHP。不过,如果您还没有提交此补丁,我建议您提交。以上是关于在 PHP 中使用共享内存的主要内容,如果未能解决你的问题,请参考以下文章