shmop_write

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

shmop_write将数据写入共享内存块

描述

shmop_write(Shmop $shmop, string $data, int $offset): int

shmop_write() 将字符串写入共享内存块。

参数

shmop

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

data

要写入共享内存块的字符串

offset

指定在共享内存段中开始写入数据的位置。偏移量必须大于或等于零,小于或等于共享内存段的实际大小。

返回值

写入的 data 的大小。

错误/异常

如果 offset 超出范围,或者试图写入只读共享内存段,则会抛出 ValueError

变更日志

版本 描述
8.0.0 在 PHP 8.0.0 之前,失败时返回 false
8.0.0 shmop 现在需要一个 Shmop 实例;以前需要一个 resource

示例

示例 #1 写入共享内存块

<?php
$shm_bytes_written
= shmop_write($shm_id, $my_string, 0);
?>

此示例将 $my_string 中的数据写入共享内存块,$shm_bytes_written 将包含写入的字节数。

参见

添加笔记

用户贡献的笔记 2 notes

mark at manngo dot net
1 年前
你可能想做的一件事是用一个更短的字符串替换旧字符串,或者完全清除字符串。

要替换字符串,你可以用零字节填充你要写入的字符串

<?php
// $shmid 来自 shmop_open()
$size = 128;
$string = 'something';

// 写入
$string = str_pad(string, $size, "\0");
shmop_write($shmid, $string, 0);

// 读取
print rtrim(shmop($shmid,0,0),,"\0");

// 清除
$string = str_repeat("\0",$size);
shmop_write($shmid, $string, 0);
?>
radupb at yahoo dot com
3 年前
我想 pack-unpack 是用于将数据编码/解码为/从二进制字符串用于 shmop_write/shmop_read 的方便函数。示例

$format='LLLLSSCCCC'; // 用于 pack 的数据格式
$key=1;
if( !($shmid=shmop_open($key,'n',0660,30)) )
die('shmop_open 失败。');

// 要编码的数据
$hd=array('ALIVE1'=>1,'ALIVE2'=>2,'ALIVE3'=>3,'ALIVE4'=>4,
'CRTPTR'=>5,'CRTSEQ'=>6,
'CTW'=>7,'LOCK'=>8,'PLAY'=>9,'MISS'=>10
);

$tmp=pack( $format, $hd['ALIVE1'],$hd['ALIVE2'],$hd['ALIVE3'],$hd['ALIVE4'], $hd['CRTPTR'],$hd['CRTSEQ'],$hd['CTW'],$hd['LOCK'],$hd['PLAY'],$hd['MISS'] );

if( ($w=shmop_write($shmid,$tmp,0))!=24 )
die('写入错误 $w='.$w);

从另一个进程中读取
$key=1;
if( !($shmid=shmop_open($key,'w',0,0)) )
die('shmop_open 失败。');

$formatR='L4ALIVE/SCRTPTR/SCRTSEQ/CCTW/CLOCK/CPLAY/CMISS'; // 用于 unpack 的数据格式

$hd=unpack( $formatR, shmop_read( $shmid,0,24) );
echo'hd:<pre>';print_r($hd);echo'</pre>';
To Top