在所有 PHP 进程之间共享变量/内存

2022-08-30 18:24:23

是否可以在所有PHP进程之间共享变量和数组而不复制它们

使用memcached,我认为PHP复制了使用的内存:

$array将包含memcached的副本。$array = $memcache->get('array');

所以我的想法是,可能有一个已经定义的静态变量,并在所有进程之间共享。


答案 1

用:Shmop

Shmop是一组易于使用的函数,允许PHP读取,写入,创建和删除Unix共享内存段。

从: http://www.php.net/manual/en/intro.shmop.php

无需外部库即可构建此扩展。

共享内存功能

  • shmop_close — 关闭
  • 共享内存块
  • shmop_delete — 删除共享内存块
  • shmop_open — 创建或打开共享内存块
  • shmop_read — 从共享内存块读取数据
  • shmop_size — 获取共享内存块的大小
  • shmop_write — 将数据写入共享内存块

基本用法

// 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);

答案 2

在PHP进程之间共享内存的一种方法是安装像APC这样的PHP字节码缓存。APC主要用于将字节码存储到操作系统托管的共享内存段中,但它也有一个API,用于在进程之间共享您想要的任何内容(例如本地版本的memcache)。

<?php
   $foobar = array('foo', 'bar');
   apc_store('foobar', $foobar);
?>

然后在其他地方:

<?php
    $foobar = apc_fetch('foobar');
    var_dump($foobar);
?>

共享内存的最大问题是,两个进程变得非常容易相互踩踏。因此,共享内存最适合于变化不大的事物,例如大型全局数组。


推荐