Как base64-декодировать большие файлы в PHP

В моем веб-приложении PHP есть API, который может получать достаточно большие файлы (до 32 МБ), которые кодируются base64. Цель состоит в том, чтобы записать эти файлы где-нибудь в моей файловой системе. Конечно, декодировано. Каким будет наименее ресурсоемкий способ сделать это?

Изменить: получение файлов через API означает, что у меня есть 32 МБ строка в моем приложении PHP, а не 32 МБ исходного файла где-то на диске. Мне нужно, чтобы эта строка была декодирована в файловую систему.

Использование собственного base64_decode () PHP не сокращает его, потому что оно использует много памяти, поэтому я продолжаю работать в пределе памяти PHP (я знаю, я мог бы повысить этот предел, но я не чувствую себя хорошо, что позволяет PHP использовать 256 МБ или около того за процесс).

Любые другие варианты? Могу ли я сделать это вручную? Или записать файл на диск, закодированный и вызвать некоторую внешнюю команду? Любая мысль?

Хотя у этого есть принятый ответ, у меня есть другое предложение.

Если вы извлекаете данные из API, вы не должны хранить всю полезную нагрузку в переменной. Используя завитки или другие сборщики HTTP, вы можете автоматически сохранять свои данные в файле.

Предполагая, что вы извлекаете данные через простой URL-адрес GET:

$url = 'http://www.example.com/myfile.base64'; $target = 'localfile.data'; $rhandle = fopen($url,'r'); stream_filter_append($rhandle, 'convert.base64-decode'); $whandle = fopen($target,'w'); stream_copy_to_stream($rhandle,$whandle); fclose($rhandle); fclose($whandle); 

Выгоды:

  • Должен быть быстрее (меньше копирования огромных переменных)
  • Очень мало памяти

Если вы должны захватить данные из временной переменной, я могу предложить такой подход:

 $data = 'your base64 data'; $target = 'localfile.data'; $whandle = fopen($target,'w'); stream_filter_append($whandle, 'convert.base64-decode',STREAM_FILTER_WRITE); fwrite($whandle,$data); fclose($whandle); 

Расшифруйте данные в меньших фрагментах. Четыре символа данных Base64 равны трем байтам данных «Base256».

Таким образом, вы можете группировать каждые 1024 символа и декодировать их до 768 октетов двоичных данных:

 $chunkSize = 1024; $src = fopen('base64.data', 'rb'); $dst = fopen('binary.data', 'wb'); while (!feof($src)) { fwrite($dst, base64_decode(fread($src, $chunkSize))); } fclose($dst); fclose($src);