Архитектура PHP: как мне это сделать? - PullRequest
4 голосов
/ 27 февраля 2010

Мне нужна помощь в понимании внутренней работы PHP.

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

Я хочу использовать аналогичную концепцию в веб-сервере / приложениях. Скажем, у меня есть common_functions.php, который состоит из общих функций (таких как Generate_City_Combo (), Check_Permission () или Generate_User_Permission_list () или аналогичных) для всех веб-приложений, работающих на этом сервере apache / php.

Во всех php-файлах модулей или приложений я могу написать:
require_once (common_functions.php);

, который будет включать этот общий файл во все модули и приложения и прекрасно работает.

Мой вопрос: как php справляется с этим внутренне?
Скажи, что у меня есть: Два приложения AppOne и AppTwo.
В AppOne есть две опции меню: AppOne_Menu_PQR и AppOne_Menu_XYZ
AppTwo имеет две опции меню: AppTwo_Menu_ABC и APPTwo_Menu_DEF

Все эти четыре пункта меню вызывают функции {например, Generate_City_Combo () или Check_Permission () или Generate_User_Permission_list ()} из common_functions.php

Теперь рассмотрим следующие сценарии: A) Пользователь XXX входит в систему и нажимает AppOne_Menu_PQR со своей персональной панели инструментов, а затем выполняет все экраны и инструкции. Это серия запросов из 8-10 страниц (экранов), и она является интерактивной. После того, как это закончится, пользователь XXX нажимает AppTwo_Menu_DEF со своей персональной панели инструментов, и снова, как и ранее, он / она выполняет все экраны и инструкции (около 8-10 страниц / экранов). Затем пользователь XXX выходит из системы.

B) Пользователь XXX входит в систему и выполняет все, что упомянуто в сценарии A. В то же время пользователь YYY также входит в систему (с некоторого другого клиентского компьютера) и выполняет аналогичные действия, упомянутые в сценарии A.

Для сценария A это тот же сеанс. Для сценария B есть два разных сеанса.

Предположим, что все опции меню вызывают Generate_User_Permission_list () и Generate_Footer () или многие опции меню вызывают Generate_City_Combo ().

Так сколько раз PHP будет выполнять / включать common_functions.php за запрос страницы? за сеанс? или за запуск / выключение PHP? Насколько я понимаю, common_functions.php будет выполняться один раз КАЖДЫЙ запрос страницы / цикл / загрузка / экран, верно? В основном один раз для каждого взаимодействия.

Помните, что такие функции, как Generate_City_Combo () или Generate_Footer (), выдают одинаковые выходные данные или делают одно и то же независимо от того, кто или когда звонит.

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

Это всего лишь примеры. Моя настоящая проблема намного сложнее и сложнее. В моих приложениях я хотел бы вызывать процедуры Application_Startup () только один раз, что создаст идеальную среду (такую ​​как все структуры поиска и справочные данные, данные только для чтения, матрица безопасности, опции меню, контекстно-зависимая логика бизнес-выполнения и т. Д. .). После этого все запросы, поступающие на сервер, не должны тратить время и ресурсы на создание среды, но могут мгновенно ссылаться на «уже созданную среду».

Это что-то выполнимое в PHP? Как? Не могли бы вы указать мне где-нибудь или несколько книг, которые объясняют внутреннюю работу PHP?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 27 февраля 2010

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

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

1 голос
/ 27 февраля 2010

Я бы сказал, что вы, вероятно, преждевременно оптимизируете, но есть надежда.

Вы очень часто хотите иметь несколько копий скомпилированного кода в памяти, так как вам нужна стабильность для каждого запроса; Вы не хотите, чтобы отдельные запросы работали в одном и том же пространстве памяти и подвергались риску состязания или повреждения данных!

Тем не менее, существует множество PHP ускорителей , которые будут предварительно компилировать код PHP, значительно ускоряя включение и выполнение вызовов.

1 голос
/ 27 февраля 2010

PHP (почти во всех случаях) ориентирован на страницы. Не существует Application_Startup (), который будет поддерживать состояние через HTTP-запросы.

Вы можете иногда эмулировать это, загружая / выгружая сериализованные данные из базы данных или $ _SESSION, но это требует дополнительных затрат. Кроме того, есть и другие случаи, когда сервер memcached также может оптимизировать это, но вы, как правило, не можете использовать те, которые используются с типичными службами виртуального хостинга, например cPanel.

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

Существует несколько модулей ORM для PHP, таких как Doctrine , которые упрощают сериализацию объектов в базу данных.

0 голосов
/ 06 октября 2014

Я здесь некромантирую, но с появлением PThread кажется, что может быть возможность нанести удар в направлении фактического решения для этого, а не просто сказать, по сути, «Нет , вы не можете сделать это с PHP. "

Человек может в основном создать свой собственный многопоточный веб-сервер на PHP, просто с помощью инструментов CLI, функций socket_ * и PThreads. Просто прослушайте порт 80, добавьте запросы в очередь запросов и запустите некоторое количество рабочих потоков для обработки очереди.

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

Вы должны будете выполнить весь свой собственный анализ uri, и вам придется собрать воедино HTTP-ответ самостоятельно и т. Д., Но рабочие потоки могут создавать экземпляры объектов, расширяющих Threaded, или повторно использовать ранее созданные экземпляры объектов Threaded.

Вуаля - PHP TomCat.

...