Использование обложек памяти php: // вызывает ошибки

Я пытаюсь расширить класс почтовой программы PHP из Worx, добавив метод, который позволяет мне добавлять вложения с использованием строковых данных, а не путь к файлу.

Я придумал что-то вроде этого:

public function addAttachmentString($string, $name='', $encoding = 'base64', $type = 'application/octet-stream') { $path = 'php://memory/' . md5(microtime()); $file = fopen($path, 'w'); fwrite($file, $string); fclose($file); $this->AddAttachment($path, $name, $encoding, $type); } 

Тем не менее, все, что я получаю, это предупреждение PHP:

 PHP Warning: fopen() [<a href='function.fopen'>function.fopen</a>]: Invalid php:// URL specified 

Нет никаких достойных примеров с оригинальной документацией, но я нашел пару в Интернете (в том числе и здесь, на SO ), и мое использование кажется правильным в соответствии с ними.

Кто-нибудь имел успех в использовании этого?

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

    Быстро глядя на http://php.net/manual/en/wrappers.php.php и исходный код, я не вижу поддержки для «/». Md5 (microtime ()); немного.

    Образец кода:

     <?php print "Trying with md5\n"; $path = 'php://memory/' . md5(microtime()); $file = fopen($path, 'w'); if ($file) { fwrite($file, "blah"); fclose($file); } print "done - with md5\n"; print "Trying without md5\n"; $path = 'php://memory'; $file = fopen($path, 'w'); if ($file) { fwrite($file, "blah"); fclose($file); } print "done - no md5\n"; 

    Вывод:

     buzzbee ~$ php test.php Trying with md5 Warning: fopen(): Invalid php:// URL specified in test.php on line 4 Warning: fopen(php://memory/d2a0eef34dff2b8cc40bca14a761a8eb): failed to open stream: operation failed in test.php on line 4 done - with md5 Trying without md5 done - no md5 

    Это просто php://memory . Например,

     <?php $path = 'php://memory'; $h = fopen($path, "rw+"); fwrite($h, "bugabuga"); fseek($h, 0); echo stream_get_contents($h); 

    дает «бугабугу».

    Проблема здесь просто в типе и синтаксисе :

    php://memory и php://temp – это потоки чтения и записи, которые позволяют хранить временные данные в файловой оболочке . Единственное различие между ними заключается в том, что php://memory всегда будет хранить свои данные в памяти, тогда как php://temp будет использовать временный файл, как только объем данных будет достигнут предопределенного предела (по умолчанию это 2 МБ). Местоположение этого временного файла определяется так же, как sys_get_temp_dir() .

    Короче говоря, вам нужен тип temp а синтаксис, который вы хотите, – это:

     php://temp/maxmemory:$limit 

    $limit находится в байтах. Вы хотите посчитать, что с помощью функций безопасного байта .