В блоке общей памяти должна постоянно обновляться информация, которая приходит часто (15 - 25 раз в секунду). Размеры каждой "порции" отличаются, и при чтении желательно иметь точный размер записанных в данный момент данных. При shmop_write
, если новые данные короче старых, они будут записаны с нулевого смещения, а сзади остаётся "хвост" от старых.
Можно ли как-то менять размер блока памяти без его постоянного создания/удаления при каждом поступлении данных? По типу realloc из C, чтобы "хвостов" не оставалось?
Что то типа такого:
<?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();
У меня есть модель AuthAssignmentphp и она связана с двумя моделями
Не могу понять как реализовать синхронизацию моего файла syncphp, который должен находиться на домене(сайте) mysite
Почему это регулярное выражение пропускает sitecom без слэша в конце?