php - передает содержимое файла в функцию, которая ожидает имя файла
У меня есть содержимое файла в строке. Мне нужно передать этот файл функции, где функция ожидает, что параметром будет имя файла, а не его содержимое. Очевидный и, вероятно, самый простой способ сделать это - записать содержимое во временный файл, затем передать это имя файла функции и отсоединить файл, как только я закончу.
Тем не менее, я ищу решение, которое не включает в себя запись файла в файловую систему и последующее чтение его обратно. Мне это требовалось во многих случаях, поэтому я не ищу работу - для определенной функции, но более универсального метода, который будет работать для любой функции, ожидающей имя файла (например, file_get_contents()
, например).
Вот некоторые мысли, но пока не уверены, как их преследовать:
- Можно ли записать содержимое где-нибудь в памяти, а затем передать это функции в виде имени файла? Возможно что-то используя
php://memory
, - Можно ли записать содержимое в канал, а затем передать имя канала в функцию?
Я сделал краткое доказательство концепции, пытаясь с php://memory
как следует, но не везет
$data = "This is some file data.\n";
file_put_contents( 'php://memory', $data );
echo file_get_contents( 'php://memory' );
Было бы интересно узнать о хороших способах решения этой проблемы. Поиск в Google ничего не придумал для меня.
3 ответа
Это в основном зависит от того, что целевая функция делает с именем файла. Если вам повезет, вы можете зарегистрировать свою собственную потоковую оболочку:
stream_wrapper_register('demo', 'DemoStream');
$data = "This is some file data.\n";
$filename = 'demo://foo';
file_put_contents($filename, $data );
echo file_get_contents($filename);
Почему бы не использовать файл в каталоге /tmp/? Как это:
<?php
$filename = '/tmp/mytmpfile';
$data = "This is some file.\n";
file_put_contents($filename, $data);
$result = file_get_contents($filename);
var_dump($result);
Ну, так как вы говорите, что не хотите использовать файл, вы не должны использовать file_get_contents(). Но вы можете достичь того же результата, используя stream_get_contents(), например так:
<?php
$data = "This is some file data.\n";
$handle = fopen('php://memory', 'r+'); // open an r/w handle to memory
fputs($handle, $data); // write the data
rewind($handle); // rewind the pointer
echo stream_get_contents($handle); // retrieve the contents