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
Другие вопросы по тегам