Использование php: // обертки памяти вызывает ошибки - PullRequest
3 голосов
/ 07 июня 2010

Я пытаюсь расширить класс почтовой программы 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 ), и мое использование кажется правильным согласно им.

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

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

Ответы [ 3 ]

16 голосов
/ 07 июня 2010

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

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

выдает "bugabuga".

1 голос
/ 31 мая 2016

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

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

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

php://temp/maxmemory:$limit

$limit в байтах.Вы хотите посчитать это, используя безопасные байтовые функции .

1 голос
/ 07 июня 2010

Быстро просматривая 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
...