В настоящее время я использую это, чтобы открыть файл и прочитать его содержимое построчно.
<?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, и если я могу решить проблему, обновив мощность своих серверов, я могу это сделать.
это не должно занять более 30 секунд
см. статьи ibm.com/developerworks/library/os-php-readfiles






Используйте readfile() для чтения содержимого файла непосредственно в выходной буфер
<?php
$file = "TestScript.cs";
header('Content-Length: '.filesize($file));
readfile($file);
?>
вам не нужно возвращаемое значение, функция сама делает запись
ух ты! удивительно не только загружается за секунды, но и дает бонусные баллы за сокращение кода !!!!
эта функция хорошо выражается, потому что вместо того, чтобы пытаться загрузить весь файл в память, сохраняя его в переменной, она асинхронно отправляет данные файла непосредственно в ответ страницы
Ответ @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 здесь.
Цель состояла в том, чтобы показать, как получить доступ к данным из строки в файле, чтобы сказать, изменить их, но по-прежнему использовать выходной буфер.
как выглядит время обработки?
при условии, что не у каждого пользователя будет суперкомпьютер
определить эффективный?