Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Share variables/memory between all PHP processes

Tags:

Is it possible to share variables and arrays between all PHP processes without duplicating them?

Using memcached, I think PHP duplicates the used memory:
$array = $memcache->get('array');
$array will contain a copy from memcached.

So my idea is, there could be a static variable that was already defined, and shared between all processes.

like image 383
Nuno Avatar asked Apr 09 '11 14:04

Nuno


2 Answers

Using Shmop:

Shmop is an easy to use set of functions that allows PHP to read, write, create and delete Unix shared memory segments.

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

No external libraries are needed to build this extension.

The shared Memory Functions

  • shmop_close — Close
  • shared memory block
  • shmop_delete — Delete shared memory block
  • shmop_open — Create or open shared memory block
  • shmop_read — Read data from shared memory block
  • shmop_size — Get size of shared memory block
  • shmop_write — Write data into shared memory block

Basic usage

// 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); 
like image 54
RafaSashi Avatar answered Sep 27 '22 17:09

RafaSashi


One way to share memory between PHP processes is to install a PHP-bytecode cache like APC. APC is primarily used for storing the bytecode into an OS managed shared-memory segment, but it also has an API for sharing anything you want between processes (like a local version of memcache).

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

Then elsewhere:

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

The big problem with sharing-memory is that it becomes very easy for two processes to step on each other's foot. So shared memory is best for things that don't change too much, like big global arrays.

like image 31
wm_eddie Avatar answered Sep 27 '22 19:09

wm_eddie