shell exec — Как избежать разбора php всего php-файла и включений и сделать его только для анализа того, что будет использовано?

Я где-то читал, что php анализирует весь файл .php каждый раз, когда он выполняется. Там было предложено какое-то решение (это не opcache), но я потерял сайт и не смог его найти.

Теперь у меня есть огромный php-сайт, на котором есть много длинных функций, которые часто используются в одиночку, и требуется, чтобы выполнение было быстрым.

Чтобы избежать разбора php всех других функций, которые не будут использоваться, я думал о создании модульной конструкции, в которую будут включены функции, хранящиеся в независимых файлах php, только если они будут фактически использоваться. Но я не смог подтвердить, что php не будет анализировать включение внутри функции или внутри условного оператора, если это не требуется. Разбирает ли php те, что включает?

Пример:

<?php
$func_to_execute = $_GET['func'];
$parameter = $_GET['parameter'];
switch($func_to_execute)
{
case 'a':
include 'func_a.php';
$output = func_a($parameter);
break;
case 'b':
include 'func_b.php';
$output = func_b($parameter);
break;
case 'c':
include 'func_c.php';
$output = func_c($parameter);
break;
};
echo $output;
?>

В этом примере я хотел бы, чтобы php анализировал только func_a, если я запрашиваю a, только func_b, если я запрашиваю b и так далее. На практике существует более 3-х функций, и каждая представляет собой очень длинный алгоритм с очень длинными строками и массивами.

В качестве альтернативы для включений я думал о создании независимых файлов php, их выполнении и получении их результатов, только если они необходимы, с помощью shell_exec. Но это потребовало бы других сложностей, таких как форматирование параметров (я не представляю, как передать очень длинную строку со специальными символами, или JSON, в качестве параметра в оболочке) и вызов функции для выполнения в ракушка. Могут ли эти сложности сделать это медленнее, чем просто позволить php разобрать весь файл?

Я знаю о функции opcache. Будет ли этого достаточно, даже если все функции всех функций будут проверяться каждый раз?

Существуют ли другие способы сделать сайт PHP модульным, и при этом php не будет анализировать все файлы php каждый раз?

Спасибо.

1

Решение

Поскольку php использует много оптимизаций и кэширование apcu, то есть вам не нужно заботиться об этом

include не будет анализироваться во время загрузки .. это больше похоже на file_get_contents и выполняется в том же контексте — и они будут оптимизированы внутренним php-кешем

http://php.net/manual/en/intro.apc.php

0

Другие решения

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

  • func_a: он только объявляет, что значением переменной $ x является предложение «война и мир».

    $ x = ‘война и мир’;

  • func_b: он только объявляет, что значение переменной $ x — это весь текст романа «Война и мир» длиной около 3,2 МБ (весь текст был вставлен в файл php). Это будет очень длинный файл для разбора.

    $ x = ‘Война и мир’ Льва Толстого … (весь роман …) … ‘;

  • func_c: он содержит неверный синтаксис, который должен немедленно запустить сообщение об ошибке от php. Это было сделано, чтобы гарантировать, что php на самом деле не анализирует то, что не было включено.

Я измерил время выполнения из другого php-скрипта с помощью функции shell_exec (). Результаты были (в секундах):

  • func_a ≈ 0.122
  • func_b ≈ 0.152
  • func_c ≈ 0.119

Поэтому я заключаю, что:
— Включения в оператор switch не анализируются, если они действительно не требуются.
— Синтаксическая ошибка во включении (внутри оператора switch) не вызовет никакой ошибки, если она на самом деле не требуется, потому что она не анализируется.
— В любом случае, разница во времени процесса очень мала (около 0,03 дополнительной секунды для дополнительного текста 3,3 МБ; или, грубо говоря, 0,01 дополнительной секунды на 1 МБ текста для анализа). Однако это может быть важно учитывать, если много пользователей запрашивают веб-сайт в одно и то же время, и поэтому было бы полезно разделить на модули (включая), если скрипт действительно такой большой. Кроме того, тот факт, что ошибочно написанные включения не были проанализированы, не анализируется, помогает не запускать ошибки, когда они не имеют значения.

Тогда мне кажется хорошим способом спроектировать модульное приложение на PHP, где модули будут очень большими.

0

По вопросам рекламы [email protected]