【问题标题】:How to write more than 1 strings to shared memory using shmop_write php?如何使用 shmop_write php 将超过 1 个字符串写入共享内存?
【发布时间】:2014-06-20 00:56:45
【问题描述】:

我是新来的,需要帮助。 你知道如何使用 shmop_write php 将超过 1 个字符串写入共享内存吗?

这是我的 php 语法:

$key = 864;
$mode = 'c';
$permission = 0644;
$size = 1024;

$shmid = shmop_open($key, $mode, $permission, $size);

$string = "This is String 1";
$string2 = "String 2";

shmop_write($shmid, $string, 0);    
shmop_write($shmid, $string2, 0);

$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size);

shmop_delete($shmid);
shmop_close($shmid);

预期结果(想要的结果):这是 String 1String 2

但是,该语法的结果是:String 2String 1

如果我将 $string = "String 1"$string = "This is String 1" 更改为, 结果还是:String 2String 1(好像不能刷新内存块)

你能告诉我如何得到想要的结果吗?谢谢。

【问题讨论】:

  • shmop_write($shmid, $string . $string2, 0);?
  • 将它们写入不同的偏移量。

标签: php string shared-memory


【解决方案1】:

共享内存不是流,它只是一块内存。 shmop_read() 的第三个参数指定写入应该发生在内存块中的哪个位置。如果您写入相同的偏移量,它只会覆盖之前的内容。如果要一个接一个地写,需要指定不同的偏移量:

shmop_write($shmid, $string, 0);
shmop_write($shmid, $string2, strlen($string));

如果你想写很多东西到共享内存,更新一个变量来跟踪当前位置:

$offset = 0;
shmop_write($shmid, $string, $offset);
$offset += strlen($string);
shmop_write($shmid, $string2, $offset);
$offset += strlen($string2);
shmop_write($shmid, $string3, $offset);
$offset += strlen($string3);
shmop_write($shmid, $string4, $offset);
$offset += strlen($string4);

一个好主意是使用一个类来实现它,其中$offset 是一个类属性。

【讨论】:

  • Thx Barmar,这是我搜索的答案。哦,对了,我想再问你一个。你知道如何从共享内存中清除数据吗?假设 $string = "String 1", $string2 = "String 2", $string3 = "String 3",根据你的回答,结果是 = "String 1String 2String 3";但是,如果我更改 $string = "Str",结果 = "StrString 2String 3ing 3" - 但是,最后结果中的 "ing 3" 来自之前的实验,那么如何删除它呢?谢谢..
  • 因为你必须记录你写了多少,你应该使用它作为shm_read()的长度参数。
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多