Есть ли в PHP функция для имитации записи файла в переменную вместо диска?

#php #security #phpword

#php #Безопасность #phpword

Вопрос:

Я использую библиотеку (PHPWord) для обработки данных, которые требуют записи файла на диск. Однако часть обрабатываемой информации потенциально конфиденциальна, и эта система предназначена только для обработки данных и отправки их туда, где они будут надежно сохранены. По этой причине я хочу избежать записи каких-либо данных на диск и работать только с данными в памяти.

Итак, мой вопрос: есть ли в PHP какая-то функция, которую я могу использовать, которая удовлетворит требованиям библиотеки к доступному для записи местоположению файла, не позволяя данным стать доступными в файловой системе, и позволит мне получить файл как переменную? Если нет, есть ли обходной путь, о котором я, возможно, не думаю для решения этой дилеммы? Я использую PHP7 в системе Debian Linux, но решение, зависящее от операционной системы, все равно было бы предпочтительнее.

Комментарии:

1. php://memory и php://temp или, возможно php://output , буферизовать его, а затем получить его после.

2. Пожалуйста, имейте в виду, что некоторые из предложений AbraCadaver могут фактически сохранять данные в файле при некоторых обстоятельствах. Смотрите: php.net/manual/en/wrappers.php.php

3. Да, temp может быть, если память заполнена.

Ответ №1:

Благодаря комментарию @AbraCadaver я нашел работоспособное решение.

При создании файла PHPWord выполняет внутреннюю запись во временное местоположение, поэтому требуется изменение конфигурации, чтобы избежать временной записи данных на диск.

Я добавил tempDir = "php://memory" в файл phpword.ini.dist конфигурации библиотеки, чтобы он записывал временный файл в память вместо временного каталога в файловой системе.

Теперь, очевидно, мне также нужно было сделать что-то подобное для местоположения, в которое он будет записывать конечный файл. Использование php://memory не было вариантом для этого, поскольку PHPWord закрывает дескриптор файла после завершения записи. Поэтому мне пришлось немного злоупотребить php://output . Вот примерно то, что я в итоге сделал в своем коде:

 $PhpWord = new PhpOfficePhpWordPhpWord();
$section = $PhpWord -> addSection();
$section -> addText("Test text");

// Write the document
$writer = PhpOfficePhpWordIOFactory::createWriter($PhpWord, 'Word2007');
ob_start();
$writer -> save('php://output');
$document = ob_get_clean(); // Document file is now contained in $document