Я пытаюсь сделать систему журналов, используя mongodb в php и GridFS. Сначала я могу записать данные в свой файл, но как только я закрываю поток, я не знаю, как добавить данные позже. Вот как я пишу в него:
$bucket= DB::connection('mongodb')->getMongoDB()->selectGridFSBucket();
$stream = $bucket->openUploadStream('my-file-name.txt');
$contents = 'whatever text here \n';
fwrite($stream, $contents);
fclose($stream);
Я попытался получить его и добавить данные в поток, но это не работает. Это попытка:
$bucket= DB::connection('mongodb')->getMongoDB()->selectGridFSBucket();
$stream = $bucket->openDownloadStreamByName('my-file-name.txt');
fwrite($stream, $contents);
также пытался fopen
в потоке, но не повезло. Я также не знаю, как получить это Идентификатор файла после записи данных на него.
Я не мог найти простое решение для добавления, поэтому я в итоге заменил предыдущий файл новым и удалил старый.
$stream = $bucket->openDownloadStream($this->file_id);
$prev_content = stream_get_contents($stream);
//delete old data chunks
DB::connection('mongodb')->collection('fs.chunks')->where('files_id',$this->file_id)->delete();
//delete old file
DB::connection('mongodb')->collection('fs.files')->where('_id',$this->file_id)->delete();$new_content =$prev_content.$dt.$msg."\n"; // append to log body
$new_filename = $filename_prefix;
$stream = $bucket->openUploadStream($new_filename);
fwrite($stream, $new_content);
fclose($stream);
$new_file = DB::connection('mongodb')->collection('fs.files')->where('filename',$new_filename)->first();
ОБНОВИТЬ:
Для будущих читателей, после использования этой системы в течение нескольких месяцев, я понял, что это не очень хорошее решение. файлы & куски могут быть повреждены, а также процесс очень медленный. Я просто переключился на вход в txt-файл и просто лучше сохранил ссылку на мой файл в mongodb 🙂
Других решений пока нет …