PHP shared memory - перезапись c изменением размера, или аналог realloc

332
19 января 2017, 06:35

В блоке общей памяти должна постоянно обновляться информация, которая приходит часто (15 - 25 раз в секунду). Размеры каждой "порции" отличаются, и при чтении желательно иметь точный размер записанных в данный момент данных. При shmop_write, если новые данные короче старых, они будут записаны с нулевого смещения, а сзади остаётся "хвост" от старых.

Можно ли как-то менять размер блока памяти без его постоянного создания/удаления при каждом поступлении данных? По типу realloc из C, чтобы "хвостов" не оставалось?

Answer 1

Что то типа такого:

<?php
class MemoryManager
{
    public function __construct($maxSize, $maxClients)
    {
        // Validation
        $shm_key = ftok(__FILE__, 't'); 
        $this->_memoryPointer = shmop_open($shm_key, "c", 0644, $maxSize * $maxClients);
        $this->_maxSize = $maxSize;
        $this->_maxClient = $maxSize;
    }
    public function writeClientData($clientId, $data)
    {
        $paddedData = str_pad($data, $this->_maxSize, $this->_padSymbol);
        shmop_write(
            $this->_memoryPointer,
            $paddedData,
            ($clientId - 1) * $this->_maxSize
        );
    }
    public function readClientData($clientId)
    {
        $data = shmop_read(
            $this->_memoryPointer,
            ($clientId - 1) * $this->_maxSize,
            $this->_maxSize
        );
        return trim($data, $this->_padSymbol);
    }
    public function readAll()
    {
        $data = shmop_read(
            $this->_memoryPointer,
            0,
            $this->_maxSize*$this->_maxClient
        );
        $string = preg_replace(
            sprintf("/(\%s+)/", $this->_padSymbol),
            $this->_padSymbol,
            trim($data, "\000" . $this->_padSymbol)
        );
        return explode($this->_padSymbol, $string);
    }

    public function close()
    {
        shmop_delete($this->_memoryPointer);
        shmop_close($this->_memoryPointer);
    }

    private $_padSymbol = "|";
}

$mem = new MemoryManager(100, 100);
$mem->writeClientData(1, 'aaaaa');
$mem->writeClientData(2, 'bbbbbbbb');
var_dump($mem->readClientData(1));
var_dump($mem->readClientData(2));

$mem->writeClientData(2, 'cc');
var_dump($mem->readClientData(2));
var_dump($mem->readAll());
$mem->close();
READ ALSO
Как в сгенерированной Search моделе сделать поиск в связанной таблице

Как в сгенерированной Search моделе сделать поиск в связанной таблице

У меня есть модель AuthAssignmentphp и она связана с двумя моделями

344
Web-терминал через SSH

Web-терминал через SSH

Доброго времени суток!

339
Синхронизация с файлами другого сайта

Синхронизация с файлами другого сайта

Не могу понять как реализовать синхронизацию моего файла syncphp, который должен находиться на домене(сайте) mysite

301
Слэш в регулярных выражениях, PHP

Слэш в регулярных выражениях, PHP

Почему это регулярное выражение пропускает sitecom без слэша в конце?

248