Laravel cache memory driver which use shared memory functions.
Shmop is an easy to use set of functions that allows PHP to read, write, create and delete Unix shared memory segments.
Shared memory an IPC1 mechanism native to UNIX. In essence, it’s about two processes sharing a common segment of memory that they can both read to and write from to communicate with one another.
Locks and semaphores are used to ensure atomic access so that multiple PHP processes can concurrently use the same shared memory safely.
Require this package, with Composer, in the root directory of your project.
composer require sanchescom/laravel-cache-memory
After updating composer, add the ServiceProvider to the providers array in config/app.php
'providers' => [
...
Sanchescom\Cache\MemoryServiceProvider::class,
],
After updating composer add the following lines to register provider in bootstrap/app.php
$app->register(Sanchescom\Cache\MemoryServiceProvider::class);
Put new driver in config/cache.php
and set key and size for memory:
'memory' => [
'driver' => 'memory',
'key' => env('MEMORY_BLOCK_KEY', 1),
'size' => env('MEMORY_BLOCK_SIZE', 900000),
],
<?php
use Illuminate\Support\Facades\Cache;
Cache::store('memory')->put('some_key', ['value' => 'text']);
<?php
use Illuminate\Support\Facades\Cache;
$data = Cache::store('memory')->get('some_key');
Garbage collection (by removing expired items) will be performed when the cache is near the size limit. If the garbage collection fails to reduce the size of the cache below the size limit, then the cache will be invalidated and the underlying memory segment is marked for deletion.
Running out of memory will generate a warning or a notice in your logs, no matter if it is resolved by a garbage collection or by segment deletion.
Note: items that are stored as "forever" may be removed when the cache reaches its size limit.
When recreating the memory block, the newest size limit defined in the Laravel config file will be used.
There are use cases to this, such as wanting to refresh the memory block now instead of waiting for another "out of memory" event. In this case, you may do the following:
// the deletion will be managed by the OS kernel , and will happen at a future time
Cache::store('memory')->getStore()->requestDeletion();
This usage will not trigger any warnings or notices since this is an action taken deliberately.