shmop_read

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

shmop_read从共享内存块读取数据

说明

shmop_read(Shmop $shmop, int $offset, int $size): string

shmop_read() 将从共享内存块读取字符串。

参数

shmop

shmop_open() 创建的共享内存块标识符

offset

开始读取的偏移量;必须大于或等于零,小于或等于共享内存段的实际大小。

size

要读取的字节数;必须大于或等于零,offsetsize 的总和必须小于或等于共享内存段的实际大小。 0 读取 shmop_size($shmid) - $start 个字节。

返回值

返回数据或在失败时返回 false

错误/异常

如果 offsetsize 超出范围,则会抛出 ValueError

变更日志

版本 说明
8.0.0 shmop 现在需要一个 Shmop 实例;以前需要一个 resource
8.0.0 如果 offsetsize 超出范围,则会抛出 ValueError;以前会发出 E_WARNING 并返回 false

范例

范例 #1 读取共享内存块

<?php
$shm_data
= shmop_read($shm_id, 0, 50);
?>

此示例将从共享内存块读取 50 个字节并将数据放在 $shm_data 中。

参见

添加注释

用户贡献注释 5 条注释

6
Craig Manley
19 年前
shmop_read() 读取并返回整个内存段的数据。如果您只处理字符串,这没有用。如果您需要从共享内存读取字符串,请在 shmop_read() 的结果上调用 str_from_mem()。类似地,在将字符串写入内存(而不是二进制数据)时,在将值传递给 shmop_write() 之前,请使用 str_to_nts() 以 null 终止您的字符串。

function str_to_nts($value) {
return "$value\0";
}

function str_from_mem(&$value) {
$i = strpos($value, "\0");
if ($i === false) {
return $value;
}
$result = substr($value, 0, $i);
return $result;
}
3
macmaster at pobox dot com
23 年前
当需要读取该 shm 指针处的整个字符串时,将计数参数设置为零 (0) 对我来说似乎有效。
1
michael dot wuertz at six dot de
3 年前
使用 shmop_read,您可能会得到一个 "\0" 填充的字符串。

$zero_padded = shmop_read($shm_seg, 0, 128);

$usable_string = rtrim($zero_padded, "\0");
-1
slavapl at mailandnews dot com
23 年前
您还可以使用 shmop_size() 函数来确定块大小。
-22
Milan Cvejic
15 年前
您应该始终序列化写入共享内存中的数据。
当您读取数据时,您应该始终反序列化。

<?php

$data
= 'test';
$shm_bytes_written = shmop_write($shm_id, serialize($data), 0);
$shm_data = unserialize(shmop_read($shm_id, 0, $shm_bytes_written));
?>
To Top