Как напечатать большие строки в PHP - PullRequest
1 голос
/ 05 мая 2019

Я создаю веб-сервер и хочу, чтобы мой php-скрипт передавал большие объемы данных.Какой метод я должен использовать?

Я говорю о строках размером более 20 МБ.Я попытался повторить их, но скрипт не может распечатать больше 5-6 мб через 1-2 минуты.После этого я попытался разбить строки на блоки и распечатать их, но все же не повезло.Сжатие также не сработало, поскольку строки закодированы в base64.

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

$payload = "my large string";
file_put_contents("payload.txt", $payload);
$download_rate = 100;
$file = fopen("payload.txt", "r");
while(!feof($file)) {
    print fread($file, round($download_rate * 1024));
    flush();
    ob_end_clean();
}
fclose($file);

1 Ответ

0 голосов
/ 05 мая 2019

Передача данных и печать данных (вы имеете в виду вывод в браузере?) - это две совершенно разные вещи. Для передачи вы должны использовать соответствующие заголовки.

Я имею в виду что-то вроде этого:

if (ob_get_level()) ob_end_clean(); // switch output buffering off

$path = "payload.txt";

header("Content-Disposition: attachment; filename=\"" . basename($path) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($path));

readfile($path);

Ничего сложного. Обратите внимание, что файл загружен (= передан) и не отображается в браузере. Это заголовки, которые делают трюк и, конечно, readfile () .

Цитата со страницы readfile ():

Примечание:
readfile () сам по себе не создает проблем с памятью, даже при отправке больших файлов. Если вы столкнулись с ошибкой нехватки памяти, убедитесь, что выходная буферизация отключена с помощью ob_get_level ().

Там также есть немного более продвинутый пример с большим количеством заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...