Я поддерживаю сделанное на заказ подобное CMS приложение.
Каждый раз, когда документ отправлен, несколько задач выполняются, который может быть примерно сгруппирован в следующие категории:
Категория 1 включает обновления различных таблиц MySQL, касающихся содержания документа.
Категория 2 включает парсинг содержимого HTML, сохраненного в полях MySQL LONGTEXT для выполнения некоторых автоматических преобразований тега привязки. Я подозреваю, что много времени вычисления проведено в этой задаче.
Категория 3 включает обновления простого основанного на MySQL поискового индекса, использующего просто горстку полей, соответствующих документу.
Все эти задачи должны завершиться, чтобы представление документа считали завершенным.
Машина, которая размещает это приложение, имеет двойные четырехъядерные процессоры Xeon (в общей сложности 8 ядер). Однако каждый раз, когда документ отправляет, весь код PHP, который выполняется, ограничивается к единственному процессу, работающему на одном из ядер.
Мой вопрос:
Какие схемы, если таковые имеются, Вы раньше разделяли Ваше веб-приложение PHP/MySQL, обрабатывающее загрузку среди нескольких ядер процессора? Мое идеальное решение в основном породило бы несколько процессов, позволить им выполниться параллельно на нескольких ядрах и затем блоке, пока все процессы не сделаны.
Связанный вопрос:
Какова Ваша любимая производительность PHP профильный инструмент?
PHP не совсем ориентирован на многопоточность: как вы уже заметили, каждая страница обслуживается одним процессом PHP - который делает что-то одно за раз, включая просто "ожидание", пока SQL-запрос выполняется на сервере базы данных.
К сожалению, с этим мало что можно поделать: так работает PHP.
Тем не менее, вот пара мыслей:
Так что, фактически, 8 ядер вашего сервера в конечном итоге будут использованы ;-)
И, если вы думаете, что ваши страницы генерируются слишком долго, возможное решение - разделить ваши вычисления на две группы:
Для ситуаций, описанных во втором пункте, когда вам не нужно делать эти вещи немедленно... Ну, просто не делайте их немедленно ;-)
Решение, которое я часто использую - это механизм очередей:
И для некоторых других манипуляций, вы просто хотите, чтобы они запускались каждые X минут - и здесь cronjob - идеальный инструмент.
Это может быть не ответ на вопрос, который вы ищете, но решение, которое вы ищете, касается многопоточности. Многопоточность необходима для многоядерного программирования, а многопоточность не реализована в PHP.
Но, в некотором смысле, вы можете имитировать многопоточность в PHP, полагаясь на многозадачность операционной системы. Я предлагаю сделать краткий обзор Стратегии многопоточности в PHP , чтобы разработать стратегию для достижения того, что вам нужно.
Мертвая ссылка: Стратегии многопоточности в PHP