Эффективный способ чтения файла php

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

<?php
    $scriptText = "";

    $file_handle = fopen("TestScript.cs","r");
    while(!feof($file_handle)){
        $line = fgets($file_handle);
        $scriptText = $scriptText . $line;
    }
    fclose($file_handle);

    $size = strlen($scriptText);

    header('Content-type: text/html');
    header("Content-length: $size");

    echo $scriptText;
?>

Для файла < 1mb это приемлемо, но, допустим, у нас есть файл 40mb, это просто способ замедлить

Есть ли более быстрый способ сделать это?

Обновлено:

Чтобы прояснить эффективность, я не хочу, чтобы время выполнения превышало лимит тайм-аута 30 секунд. Я мог бы увеличить время выполнения, но я бы предпочел сократить время, а не выделять больше времени.

Кроме того, я не использую общего хостинг-провайдера, это облачный сервер, который я использую, используя apache / xampp, и если я могу решить проблему, обновив мощность своих серверов, я могу это сделать.

определить эффективный?

ArtisticPhoenix 01.04.2018 10:39

это не должно занять более 30 секунд

FlamingGenius 01.04.2018 10:40

см. статьи ibm.com/developerworks/library/os-php-readfiles

Gufran Hasan 01.04.2018 10:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте readfile() для чтения содержимого файла непосредственно в выходной буфер

<?php
$file = "TestScript.cs";
header('Content-Length: '.filesize($file));
readfile($file);
?>

вам не нужно возвращаемое значение, функция сама делает запись

Meghan 01.04.2018 10:48

ух ты! удивительно не только загружается за секунды, но и дает бонусные баллы за сокращение кода !!!!

FlamingGenius 01.04.2018 10:51

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

Meghan 01.04.2018 10:53

Ответ @Sean Denny, вероятно, является наиболее эффективным способом, если все, что вам нужно сделать, это отправить файл на вывод.

Но если вам нужно получить доступ к файлу построчно, скажем, вам по какой-то причине нужно отфильтровать или изменить данные из файла. Вы все еще можете улучшить исходный код вопросов.

$size = filesize();

//open output buffer
$output_handle = fopen('php://output', 'w');

$file_handle = fopen("TestScript.cs","r");

header('Content-type: text/html');
header("Content-length: $size");

while(!feof($file_handle)){
    $line = fgets($file_handle);
    $line = strtolower($line);  //modify line, for examples sake
    fwrite($output_handle, $line);
}

Вы можете использовать php://output для прямой записи в выходной буфер. Это сокращает объем используемой памяти, поскольку каждая строка читается, модифицируется, выводится в выходной буфер и не сохраняется в PHP.

Тем не менее, вам все равно придется прочесть файл, поэтому readfile лучше в вашем случае. Я просто хотел привести пример того, как улучшить вывод, если вам по какой-то причине все еще нужен доступ к строковым данным файла.

Например, я использовал его для вывода данных CSV, где мне приходилось проверять данные определенного столбца, чтобы удалить данную строку (строки) из загрузки. (это тоже было около 250 МБ данных), за исключением того, что я использовал fgetcsv для чтения, но это в значительной степени не имеет отношения к тому, «как» его выводить.

Вы можете использовать stream_copy_to_stream здесь.

Federkun 01.04.2018 10:53

Цель состояла в том, чтобы показать, как получить доступ к данным из строки в файле, чтобы сказать, изменить их, но по-прежнему использовать выходной буфер.

ArtisticPhoenix 01.04.2018 10:55

как выглядит время обработки?

FlamingGenius 01.04.2018 10:59

при условии, что не у каждого пользователя будет суперкомпьютер

FlamingGenius 01.04.2018 11:00

Другие вопросы по теме