#php #apache #webserver
#php #apache #веб-сервер
Вопрос:
Я попытался выполнить действие, чтобы проверить, является ли
> ЦИКЛ FOR / WHILE
сбой или нет, если он перебирает несколько миллионов записей….
Моя активность
У меня более 1000000 записей в таблице, и если я извлеку их и распечатаю
через цикл for и выполнил этот скрипт с командной строкой, он успешно сработал..
но когда я попробовал это в веб-браузере, он застрял и закрыл мой браузер…
Итак, я хочу знать, является ли это сбоем PHP (очевидно, не так, как это работало в командной строке)..
или это сбой ВЕБ-СЕРВЕРА???
Что делать, если у меня должна возникнуть такая ситуация в веб-приложении реального времени??
Должен ли я переключиться на более мощный веб-сервер, если да, то какой …??
Комментарии:
1.
in real time web application
, его нет. Вы никогда не хотите печатать миллионы строк, слышали о разбивке на страницы?2. что, если мне нужно будет объединить данные из нескольких таблиц, объединение бесполезно, потому что мне нужно извлекать / обрабатывать эти записи вручную, потому что они требуют специальных операций для выполнения … очевидно, я не буду печатать миллион записей, но мне нужно их посчитать (для получения количества страниц), для этого требуется один и тот же цикл … я понимаю, что это немного неперевариваемо, но это единственный способ, которым я могу это сделать … в любом случае спасибо…
3. чтобы обойти это, вы возвращаете только то, что хотите, из набора данных, для получения общего количества для разбивки на страницы вы делаете,
SELECT COUNT..
вы не получаете все строки, а затем подсчитываете их в php.4. я должен выполнить некоторые специальные логические фильтры для записей, поэтому в этом случае я не могу использовать SQL-операцию where, поэтому COUNT не будет работать в этом сценарии.
5. Так что это действительно просто проблема XY , потому что вы не можете оптимизировать SQL-запросы к вашему ненормализованному набору данных.
Ответ №1:
Я предполагаю, что вы столкнулись с максимальным ограничением времени выполнения, которое не ограничено в командной строке, но имеет значение по умолчанию 30 секунд на веб-сервере. Попробуйте добавить следующую строку в начале вашего скрипта, чтобы снять ограничение:
set_time_limit(0);
Из официальных документов по php
max_execution_time
Это устанавливает максимальное время в секундах, которое разрешено запускать скрипту, прежде чем он будет завершен анализатором. Это помогает предотвратить привязку сервера к плохо написанным скриптам. Значение по умолчанию равно 30. При запуске PHP из командной строки значение по умолчанию равно 0.
Комментарии:
1. Спасибо за такую полезную информацию, это сработало по крайней мере для 1 миллиона записей (я пробовал). Еще раз спасибо
Ответ №2:
Если вы хотите напечатать 1 000 000 записей в браузере, у вас будут плохие времена…
Первое — что сказал FuzzyTree — время выполнения. Но если вы говорите, что это работает в cli
, я думаю, что это не проблема.
Проблема с таким объемом данных, вероятно, в браузере, который просто не может обработать столько! Проверьте свое CPU
и RAM
использование при попытке посетить эту страницу.
Если вам ДЕЙСТВИТЕЛЬНО нужно отобразить миллион записей пользователя, используйте разбивку на страницы или загружайте новые записи, когда пользователь достигает нижней части страницы с помощью ajax
.