2013-05-11 106 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