Я пытаюсь расширить класс почтовой программы 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
находится в байтах. Вы хотите посчитать, что с помощью функций безопасного байта .