我在处理 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。