Фабричные классы против замыканий в Zend Framework 2
Лучше ли использовать фабричные классы или замыкания в Zend Framework 2 и почему?
Я знаю, что замыкания не могут быть сериализованы, но если вы вернете их из Module#getServiceConfig(), это не повлияет на кэширование остальных ваших данных конфигурации, и замыкания будут кэшироваться в вашем кеше кода операции в любом случае.
Чем отличается производительность при создании класса фабрики от выполнения замыкания? Обрабатывает ли PHP и создает экземпляры замыканий только тогда, когда вы их выполняете, или он будет делать это для каждого замыкания, определенного в файле конфигурации при каждом запросе?
Кто-нибудь сравнивал время выполнения каждого метода?
Смотрите также:
1 ответ
PHP будет преобразовывать анонимные функции в вашей конфигурации в экземпляры класса закрытия во время компиляции, поэтому он будет делать это при каждом запросе. Это непохоже create_function
который создаст функцию во время выполнения. Однако, поскольку замыкания делают это во время компиляции, они должны находиться в вашем кэше opcache и, следовательно, не должны иметь значения.
С точки зрения влияния на производительность построения службы с использованием фабрики против закрытия, во-первых, вы должны помнить, что служба будет создаваться только один раз за запрос независимо от того, сколько раз вы запрашивали службу. Я провел быстрый тест получения службы с использованием замыкания и фабрики, и вот что я получил (я запускал несколько раз, и все результаты были примерно одинакового значения):
Closure: 0.026999999999999ns
Factory: 0.30200000000002ns
Это наносекунды, то есть 10-9 секунд. В основном разница в производительности настолько мала, что эффективной разницы нет.
Также ZF2 не может кэшировать всю конфигурацию моего модуля с замыканиями. Если я использую только фабрики, тогда вся моя конфигурация может быть объединена, кэширована и простой файл может быть прочитан по каждому запросу, вместо того, чтобы беспокоиться о загрузке и объединении файлов конфигурации каждый раз. Я не измерял это влияние на производительность, но думаю, что оно в любом случае незначительно.
Тем не менее, я предпочитаю фабрики в основном для удобочитаемости и удобства обслуживания. На фабриках вы не получите массивный файл конфигурации с множеством замыканий повсюду.
Конечно, замыкания отлично подходят для быстрой разработки, но если вы хотите, чтобы ваш код был читабельным и обслуживаемым, то я бы сказал, придерживаться фабрик.