Shared memory - linx and PHP newbie
| From: | Richard W | Date: | Thu, 21 May 2009 14:15:40 +0000 |
| Subject: | Shared memory - linx and PHP newbie | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-292876@lists.php.net to get a copy of this message | ||
Hi
I have a query regarding shared memory created under Linux and then
accessing it by PHP script.
For my application, I have created a shared memory block in Debian Linux
using the shm_open(..), ftruncate(...) and mmap(...) function calls.
The shared memory block is of size 6304 bytes long. It is store 197 strings
of 32 characters long. I am confident that the shared memory block is
correctly created because when I go navigate to the /shm directory I
find the shared memory block called "/program.SCShared" present and it is of
size 6304 bytes. In addition to that, I have also written some strings to to
the shared memory, where each string starts at every 32 bytes. I have
verified that I can read these strings back successfully.
What I would like to do now is have some PHP script to read the strings out
of the shared memory so the strings can be displayed on a web page.
From what I can gather from the PHP web site, it appears that I need to use
the shared memory functions as given in
http://au.php.net/manual/en/ref.shmop.php.
Specifically, since my strings start at 32-byte boundaries, the function:
string *shmop_read* ( int $shmid , int $start , int $count);
seems to be the ideal read routine to use. For example, if I want to read
the third string, I believe i write:
$shm_data = shmop_read($shmid, 64, 32);
Below is my code:
==============================
<?php
$shm_key = ftok("/dev/shm/program.SCShared", 't');
if ($shm_key < 0)
{
echo "ftok failed\n";
}
$shm_id = shmop_open ($shm_key,"w",0,0);
if (!empty($shm_id))
{
echo "\n Shared memory exists";
}
else
{
echo "\n Shared memory doesnt exists";
}
$shm_size = shmop_size ($shm_id);
echo "\n the size of shared memory is $shm_size";
$shm_data = shmop_read($shm_id, 0, 32);
$shm_data = unserialize($shm_data);
echo "\n read is $shm_data";
$i = strpos($shm_data, "\0");
if ($i === false)
{
echo "\n String is NULL";
}
else
{
$result = substr($shm_data, 3904, $i);
print_r($result);
}
shmop_close($shm_id);
echo "\nDetached from shared memory";
?>
==============================
Running this script shows, it appears that I'm connecting to my shared
memory "/dev/shm/program.SCShared" because "Shared memory exists" is
displayed.
However, I get the following which I would like some help with:
1) The size of the memory block is returning 10000 and not 6304 bytes as
expected. I believe 10000 is the default size if the memory block is created
from scratch using *shm_attach. Does the same apply to shmop_open. If so,
why is it being created?*
2) The call $shm_data = shmop_read($shm_id, 0, 32), which reads the first
string, returns no result. Does any know why this is the case when I know
that there is a string there because I have added it there using some C
code.
3) Is there another way I can access these strings without using the
shmop_<blah> routines? I have tried using shm_attach(...), shm_get_var(...),
but this seems to be too hard because it requires variable keys. Should I be
using MySQL?
Any help will be greatly appreciated, especially answering 2) as to why I
can't read the data.
Regards,
Richard.