PHP shmom - 可以写,无法读取

时间:2014-12-17 11:10:46

标签: php memory

我正在探索使用sh_mop在错误记录器和另一个服务器定期检查的另一个脚本之间交换短消息。 sh_mop看起来非常简单,所以我写了一个测试代码

记录器

$str = time()."\0";
$shmid = shmop_open(1091,'c',0666,strlen($str));
echo "$shmid\n";
$writes = shmop_write($shmid,$str,0);
echo "$writes\n";

日志阅读器

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Access-Control-Allow-Origin: *');

$shmid = shmop_open(1091,'a',0,0);
if ($shmid)
{
 $size = shmop_size($shmid);
 $str = shmop_read($shmid,0,$size);
 shmop_delete($shmid);
 echo trim($str);
}
flush();

从我的浏览器调用记录器我得到了预期的响应。但是,当我调用日志阅读器脚本时没有任何反应。在检查我的服务器错误日志时,我发现

PHP Warning:  shmop_open(): unable to attach or create shared memory segment 

我一点也不清楚为什么会发生这种情况。我找到的例子使用ftok来修复shmop_open的shmop键。但是,我需要一个预定义的密钥才能从日志阅读器脚本访问相同的内存块。

我正在使用shmop因为它足以达到目的 - 一个Memcache解决方案可以工作,但似乎是OTT。如果我在这里做错什么怎么办?我非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

PHP文档在解释中的内容时不太清楚

shmop_open(key,flags,mode,size)

应该是。事实证明,您不能随意使用数字键。这种方法的唯一方法是通过ftok生成密钥。我最终使用

$key = ftok('shmop.txt','t') 

在我的记录器和记录器中日志读取器脚本,其中shmop.txt是同一文件夹中的0字节文件。这有效!