У меня были те же проблемы, когда я работал на транспорте enqueue / fs .Я не смог изменить небольшую часть в начале файла, не скопировав его в память и не сохранив обратно.Вместо этого, но это возможно сделать с концом файла.Вы можете прочитать часть, а затем обрезать ее.Это не очередь, а стек.Так что, если вы полагаетесь на порядок сообщений, это не будет решением.В моем случае я блокирую файл, когда файл был прочитан из файла, блокировка снята.
Вот как вы можете записывать сообщения в файл очереди:
<?php
$rawMessage = 'this your message to put to the queue as a string';
$queueFile = fopen('/path/to/queue/file', '+a');
// here it may add some spaces so the message length is multiples of modular.
// that make it easier to read messages from a file.
// lock file
$rawMessage = str_repeat(' ', 64 - (strlen($rawMessage) % 64)).$rawMessage;
fwrite($queueFile, $rawMessage);
// release lock
Вот как вы можете читать сообщения из файла очереди:
<?php
$queueFile = fopen('/path/to/queue/file', '+c');
// lock file
$frame = readFrame($file, 1);
ftruncate($file, fstat($file)['size'] - strlen($frame));
rewind($file);
$rawMessage = substr(trim($frame), 1);
// release lock
function readFrame($file, $frameNumber)
{
$frameSize = 64;
$offset = $frameNumber * $frameSize;
fseek($file, -$offset, SEEK_END);
$frame = fread($file, $frameSize);
if ('' == $frame) {
return '';
}
if (false !== strpos($frame, '|{')) {
return $frame;
}
return readFrame($file, $frameNumber + 1).$frame;
}
ДляБлокировка Я бы предложил использовать Symfony LockHandler или просто взять enqueue / fs.