Я создал файл PHP, который настроен на чтение содержимого локального текстового файла, анализ в массив, а затем заполнить таблицу на главной странице. Однако даже для 53 строк этого текстового файла требуется около 10 секунд для загрузки страницы перед отображением любого содержимого.
Я понимаю, что это ограничение, когда серверу необходимо создать весь html-файл перед отправкой его клиентам, и это поколение требует времени в зависимости от размера генерируемого контента, то есть эти 10 секунд, вероятно, увеличатся с увеличением количества строк до процесс. Конечный продукт будет обрабатывать более 500 строк, поэтому его генерация займет несколько минут, а затем будет отправлена клиенту.
Мне было интересно, если бы я мог обойти это, отправить клиенту небольшой HTML-файл, содержащий пустую таблицу, а затем начать заполнять и заполнять эту таблицу с помощью PHP, но я не уверен, как это сделать. Буду ли я вызывать включение в отдельный php-файл, который будет вызывать код генерации, или заставлять сервер «транслировать» контент по одной строке таблицы за раз?
Страница, о которой идет речь: http://zionfox.net/cards.php. Текущее время загрузки занимает около 7-10 секунд, и я хотел бы уменьшить его, загружая только базовую таблицу, а затем отображая строки таблицы по мере их генерирования источником.
Изменить: Существует также причина для больших изображений: при увеличении на мобильных устройствах, я бы предпочел, чтобы изображения были такими же четкими и резкими, как и шрифты рядом. Я попробовал с изображениями реального размера (20 пикселей), и они стали почти нечитаемыми при увеличении. Я понимаю, что .png, вероятно, не лучший формат для использования, но я впервые использую file_put_contents()
и я не совсем уверен ни в изображении исходного файла, ни в том, чтобы убедиться, что изображения сохраняют прозрачность.
Редактировать: Редактировать: Источник к файлу: http://zionfox.net/cards.php.txt — Прошу прощения за неряшливость кода, он все еще интенсивно работает, и я хотел, чтобы сначала он заработал, прежде чем привести код в порядок.
Файл разбит на массив, разделенный символами, используя explode()
, Каждый из этих массивов затем разделяется на дополнительные массивы, используя больше explode()
s, а затем каждая часть этого массива обрабатывается, чтобы увидеть, соответствуют ли критерии, и возвращает правильные результаты, основанные на значениях, включая извлечение изображений из внешних источников, если у меня еще нет изображения. Это все то echo
Выделено в нижней части цикла for для создания новой строки таблицы, затем повторяется процесс для следующей строки.
Благодаря Tenhsor, решение этого:
$handle = fopen($pathToFile, "r");
if(ob_get_level() == 0) ob_start();
if($handle) {
while(($line = fgets($handle)) !== false) {
echo $row . "<br />";
//The code you want to process
ob_flush();
flush();
}
}
ob_end_flush();
fclose($handle);
Полное решение найдено в их ответе.
Я также хочу добавить, что один только этот код не решил мою проблему. Я работал под управлением IIS 7.5 и должен был выполнить команду, чтобы она работала правильно. Команда зависит от вашей версии PHP, которую вы сможете найти через IIS. Команда для выдачи cmd.exe:
%windir%\system32\inetsrv\appcmd.exe set config /section:handlers "/[name='PHP53_via_FastCGI':ResponseBufferLimit:0"
куда PHP53_via_FastCGI
это имя и версия вашего PHP.
Вы можете использовать промывать Функция php для отправки кусков информации клиенту.
например, если вы показываете таблицу html, используя цикл, вы можете сделать что-то вроде этого:
file = @fopen('path/to/my/file', 'rb');
$buffer = 1024 * 8;
echo '<table>';
while (!feof($file)) {
echo '<tr><td>'.fread($file, $buffer).'</td></tr>';
ob_flush();
flush();
}
echo '</table>';
ob_end_flush();
Если синтаксический анализ файла является простым (то есть не требует сложной логики), это не должно занять 10 секунд для обработки. Проверьте, можете ли вы как-то оптимизировать свой код или показать его здесь.
Если ваш контент меняется не очень часто, вы можете рассмотреть одну вещь — кеширование. Это означает, что вы вычисляете таблицу только один раз, повторно используете эти вычисленные значения и отправляете их обратно в браузер.
Увидеть: http://www.slideshare.net/anisniit/caching-new для дополнительной информации.