在所有 PHP 进程之间共享变量/内存
2022-08-30 18:24:23
是否可以在所有PHP进程之间共享变量和数组而不复制它们?
使用memcached,我认为PHP复制了使用的内存:
$array将包含memcached的副本。$array = $memcache->get('array');
所以我的想法是,可能有一个已经定义的静态变量,并在所有进程之间共享。
是否可以在所有PHP进程之间共享变量和数组而不复制它们?
使用memcached,我认为PHP复制了使用的内存:
$array将包含memcached的副本。$array = $memcache->get('array');
所以我的想法是,可能有一个已经定义的静态变量,并在所有进程之间共享。
用:Shmop
Shmop是一组易于使用的函数,允许PHP读取,写入,创建和删除Unix共享内存段。
从: http://www.php.net/manual/en/intro.shmop.php
无需外部库即可构建此扩展。
共享内存功能
基本用法
// Create 100 byte shared memory block with system id of 0xff3
$shm_id = shmop_open(0xff3, "c", 0644, 100);
if (!$shm_id) {
echo "Couldn't create shared memory segment\n";
}
// Get shared memory block's size
$shm_size = shmop_size($shm_id);
echo "SHM Block Size: " . $shm_size . " has been created.\n";
// Lets write a test string into shared memory
$shm_bytes_written = shmop_write($shm_id, "my shared memory block", 0);
if ($shm_bytes_written != strlen("my shared memory block")) {
echo "Couldn't write the entire length of data\n";
}
// Now lets read the string back
$my_string = shmop_read($shm_id, 0, $shm_size);
if (!$my_string) {
echo "Couldn't read from shared memory block\n";
}
echo "The data inside shared memory was: " . $my_string . "\n";
//Now lets delete the block and close the shared memory segment
if (!shmop_delete($shm_id)) {
echo "Couldn't mark shared memory block for deletion.";
}
shmop_close($shm_id);
在PHP进程之间共享内存的一种方法是安装像APC这样的PHP字节码缓存。APC主要用于将字节码存储到操作系统托管的共享内存段中,但它也有一个API,用于在进程之间共享您想要的任何内容(例如本地版本的memcache)。
<?php
$foobar = array('foo', 'bar');
apc_store('foobar', $foobar);
?>
然后在其他地方:
<?php
$foobar = apc_fetch('foobar');
var_dump($foobar);
?>
共享内存的最大问题是,两个进程变得非常容易相互踩踏。因此,共享内存最适合于变化不大的事物,例如大型全局数组。