On thing you might want to do is replace an old string with a shorter one, or to clear out the string altogether.
To replace the string, you can zero-byte pad the string you are writing:
<?php
// $shmid is from shmop_open()
$size = 128;
$string = 'something';
// write
$string = str_pad(string, $size, "\0");
shmop_write($shmid, $string, 0);
// read
print rtrim(shmop($shmid,0,0),,"\0");
// clear
$string = str_repeat("\0",$size);
shmop_write($shmid, $string, 0);
?>shmop_write
(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
shmop_write — Write data into shared memory block
Description
shmop_write() will write a string into shared memory block.
Parameters
shmop- The shared memory block identifier created by shmop_open()
data- A string to write into shared memory block
offset- Specifies where to start writing data inside the shared memory segment. The offset must be greater than or equal to zero and less than or equal to the actual size of the shared memory segment.
Return Values
The size of the written data.
Errors/Exceptions
If offset is out of range, or a read-only shared memory segment
should be written to, a ValueError is thrown.
Changelog
| Version | Description |
|---|---|
| 8.0.0 |
Prior to PHP 8.0.0, false was returned on failure.
|
| 8.0.0 |
shmop expects a Shmop
instance now; previously, a resource was expected.
|
Examples
Example #1 Writing to shared memory block
<?php
$shm_bytes_written = shmop_write($shm_id, $my_string, 0);
?>
This example will write data inside $my_string into
shared memory block, $shm_bytes_written will contain
the number of bytes written.
See Also
- shmop_read() - Read data from shared memory block
+add a note
User Contributed Notes 2 notes
mark at manngo dot net ¶
3 years ago
radupb at yahoo dot com ¶
5 years ago
I guess pack-unpack are the handy functions for encoding/decoding data as/from a binary string for shmop_write/shmop_read. Example:
$format='LLLLSSCCCC'; //data format for pack
$key=1;
if( !($shmid=shmop_open($key,'n',0660,30)) )
die('shmop_open failed.');
//my data to encode:
$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('write error $w='.$w);
And reading from some other process:
$key=1;
if( !($shmid=shmop_open($key,'w',0,0)) )
die('shmop_open failed.');
$formatR='L4ALIVE/SCRTPTR/SCRTSEQ/CCTW/CLOCK/CPLAY/CMISS'; //data format for unpack
$hd=unpack( $formatR, shmop_read( $shmid,0,24) );
echo'hd:<pre>';print_r($hd);echo'</pre>';