Я изучаю PHP и Laravel. Компания, в которой я работаю, имеет веб-приложение, построенное на чистом PHP. Я заметил, что когда вы выполняете что-то вроде обновления базы данных из большого CSV-файла, который требует значительных ресурсов процессора и памяти, с веб-приложением практически ничего нельзя сделать. Например, обновление чьей-либо учетной записи чем-то незначительным и не требующим значительных ресурсов процессора и памяти. В основном, делая первые кирпичи системы, пока это не будет сделано. Смотря на TOP
на сервере Linux показывает использование процессора на уровне 99% и использование памяти значительно выше.
В любом случае, это действительно не корпоративная система, а то, что несколько пользователей используют для управления пользователями другого веб-приложения, написанного в среде Python, которую используют клиенты. Но это заставило меня задуматься о том, каким будет подход к корпоративной системе на основе PHP?
Очевидно, не может быть одного пользователя, выполняющего интенсивную задачу, которая блокирует систему, пока это не будет сделано. Я полагаю, что в реальном мире существует множество примеров, когда PHP выполняет очень сложные задачи, требующие большого объема памяти, и это незаметно для других пользователей.
РЕДАКТИРОВАТЬ: И когда я говорю «брикет системы», я имею в виду сам сервер, так что веб-приложение администратора PHP и веб-приложение клиента Python действительно не отвечают на запросы.
Я бы поставил на все мои Quatloos, что у вас есть открытый сеанс для долгосрочного запроса, делающего вставки базы данных, который препятствует последующим запросам открыть сеанс. Что вам нужно сделать, это:
<?php
session_start();
/* pre-game stuff that depends on $_SESSION */
session_write_close();
/* long-running stuff that doesn't need to update $_SESSION */
Или, еще лучше, просто пропустите открытие сессии для этой задачи, если это возможно.
Приложение:
В корпоративной системе первое, с чем вы сталкиваетесь, это избыточность. Все должно быть излишним. В случае приложения, основанного на PHP, установка имеет решающее значение.
Если мы говорим о веб-сайте, это шаги
DNS обновлен, поэтому он разрешает более 1 IP. Таким образом, не имеет значения, какой IP-адрес возвращается браузеру или один из серверов в пуле DNS умирает первым. Amazon Route 53 — это то, что мы используем. И это круто.
Далее идет веб-сервер. Когда IP-адрес «попал», запрос поступает на веб-сервер. Мы используем nginx
(так как nginx
это — как вы уже догадались — потрясающе). Поскольку в пуле DNS имеется несколько IP-адресов, доступно несколько веб-серверов. Опять же, не имеет значения, какой веб-сервер будет обрабатывать запрос клиента — избыточность для выигрыша.
nginx
либо обслуживает статический контент, либо передает запрос в PHP, если выполняется правило. Мы используем php-fpm
, Каждый из nginx
серверы прокси HTTP-запрос к кластеру php-fpm
узлы. На обычном языке — он выбирает еще один компьютер в кластере компьютеров, который обслуживает PHP. Не имеет значения, какой узел PHP будет обрабатывать запрос — избыточность для выигрыша.
PHP теперь выполняет некоторую работу, подключается к базе данных и — как вы уже догадались — он «говорит» с кластером баз данных. Базы данных синхронизированы, есть целые книги на эту тему, поэтому я не буду вдаваться в подробности. Опять же, неважно, какой БД получает запрос — избыточность для выигрыша (на самом деле есть много способов справиться с этим).
Серверы баз данных оптимизированный для типа работы, которую они делают — это означает, что они оптимизированы для чтения или письма. База данных или любое другое решение для хранения данных — это не бесконечная черная дыра, которую вы можете заполнить просто так. Вы должны тщательно выбрать, что сервер будет делать — он напишет? Будет ли он использоваться для чтения? Сколько писем это сделает? Сколько чтений это сделает? Каков план увеличения объема работы? По сути, вам нужно оптимизировать сервер базы данных — вы определенно не может использовать конфигурацию MySQL по умолчанию. Если у вас есть большие рабочие нагрузки, которые могут перегружать базу данных, вы используете механизм организации очередей, который может сопоставлять несколько вставок и сбрасывать их в одной транзакции — этот метод использует пропускную способность жестких дисков и обменивает ее на ввод-вывод (в основном это означает, что это хорошо и работает быстро).
Итак, поехали. Это краткий обзор того, как вы подходите к корпоративному уровню в PHP. Каждая часть должна быть избыточной, горизонтально масштабируемой и оптимизированной для того типа работы, который она выполняет.
Вы определенно не хотите, чтобы ваше приложение зависало или становилось непригодным для использования всякий раз, когда кто-то что-то портит.
Процессы с высокими требованиями не должны выполняться по веб-запросу.
Например, вам следует использовать очереди.
Таким образом, вы разрешаете выгрузку файла и создаете процесс очереди, чтобы обработать это, затем запрос завершается и через мгновение после запуска процесса на сервере, но пользователь получил запрос обратно.
Затем вы можете настроить очередь с низким приоритетом ЦП или добавить время ожидания между обработкой данных, что позволит ЦП обслуживать другие процессы.
Или вы можете вместо этого записать файл после его загрузки и настроить консольное задание, чтобы каждую минуту проверять наличие ожидающих обработки данных, а затем обрабатывать пакет и разрешать обработку следующего пакета при проверке в следующую минуту, сохраняя текущий строка обрабатывается где-то.
Но, опять же, постарайтесь избежать выполнения таких длительных сложных процессов в веб-запросе, используйте веб-запрос для получения информации, а затем запускайте процесс отдельно.
Laravel очень хорошо поддерживает консольные задания или очереди в фреймворке.