PHP MySQLi Singleton для Ajax-запросов заканчивается во многих процессах - PullRequest
0 голосов
/ 01 июля 2011

У меня есть PHP-приложение, которое использует AJAX для получения информации - сзади оно использует PHP MySQLi singleton. AJAX-запросы отправляются каждые 0,5 секунды, они считывают некоторые данные из базы данных и доставляют их в виде строки JSON обратно на веб-сайт. Когда я открываю веб-сайт несколько раз (на разных вкладках), я получаю сообщение об ошибке, потому что PHP, или, скорее, apache, не может «разветвлять другой процесс». На моем сервере достаточно оперативной памяти, но проблема в том, что достигнут предел процесса в 130 процессов.

cat /proc/user_beancounters
---------------------------
        | held  | maxheld |
numproc |  130  |     130 |

Итак, я хотел бы знать, возможно ли, что синглтон является ошибкой (например, "почему синглтоны плохие") или вы можете представить себе другой источник ошибок? Источник ошибки, что так много MySQL-процессов запускаются и достигают максимума. ограничение

Ответы [ 4 ]

1 голос
/ 07 июля 2011

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

Лучший подход - это так называемый длинный опрос. Это процесс, с помощью которого клиентский браузер отправляет запрос, но не ожидает немедленного ответа. Вместо этого сервер удерживается на этом запросе, пока ему не будет что-то отправить клиенту. Это гораздо более эффективно и фактически используется в проекте APE (Ajax Push Engine - http://www.ape -project.org / ).

Проверьте, что они делают. Я был бы готов поспорить, что это будет правильным для того, что вы пытаетесь достичь. И это уменьшит потребление ресурсов.

1 голос
/ 06 июля 2011

Я бы порекомендовал вам опубликовать код вашего синглтона и бэкэнда ajax. Трудно сделать заявление о том, что ваш синглтон или AJAX-сервер виноват, если мы не можем на это взглянуть.

Возможно, я бы посчитал количество соединений более вероятной причиной. Если это не локальное приложение, то весьма часто фактические запросы занимают более 0,5 с. Таким образом, один запрос может быть не выполнен до того, как вы позвоните другому. Это может со временем создать очередь, которую сервер SQLi не сможет обработать достаточно быстро, и число процессов начнет расти, поскольку новые запросы добавляются в очередь каждые 0,5 с для каждого подключенного клиента.

Как выглядит серверная часть Ajax? Запускает ли он запрос сразу? Это запускает другой экземпляр PHP? Для скольких одновременных соединений настроены веб-сервер и база данных? Все эти вещи в значительной степени будут определять поведение вашего приложения. Также как заявлено. Обратите внимание, что даже если вы используете синглтон, он НЕ доживает после выполнения вашего вызова ajax. Каждый раз, когда вы звоните, ваше php-приложение запускается с нуля, а ваш синглтон снова создается с нуля.

Вы можете настроить приложение (написанное на PHP или другом), которое будет фактически работать постоянно и использовать основной цикл. Затем вы можете либо заставить прослушивать определенный сокет, либо другим способом передать свои данные ajax-бэкэнду в это приложение. Затем работающее приложение может обработать серверную часть базы данных и вернуть данные в серверную часть ajax, которая будет возвращать ответ. Таким образом, обработчик базы данных не будет воссоздавать ваш синглтон все время. Но вы, скорее всего, все равно столкнетесь с проблемами в очереди, если множество клиентов будут отправлять запросы, требующие просмотра базы данных каждые 0,5 с.

Удачи!

1 голос
/ 01 июля 2011

Это не имеет никакого отношения к вашему синглтону, так как вы отправляете запрос серверу каждые 0,5 секунды, страницы, отправляющие запросы, становятся доступными для пользовательской базы, тогда вы также должны умножить это на количество пользователей, имеющихоткрытые страницы, которые делают запросы.Если вам действительно нужно тянуть сервер с такой скоростью, возможно, вы захотите взглянуть на какую-то другую технологию, например Comet .

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

0 голосов
/ 01 июля 2011

Я не уверен, что понял это правильно ...

Когда AJAX-запрос обрабатывается, запускается новый процесс PHP;синглтон доступен только в этом процессе, синглтоны не разделяются между несколькими процессами PHP.Таким образом, каждый запрос заканчивается собственным соединением с базой данных, а синглтон просто проверяет, что на процесс приходится не более одного соединения.хотя я предпочитаю не использовать их;и я не уверен, что они вообще доступны с MySQLi.

...