如何避免 php 解析整个 php 文件并包含并使其只解析将要使用的内容?
How to avoid php parsing the whole php file and includes and make it only parse what will be used?
我在某处读到 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;
?>
在此示例中,如果我请求 a,我希望 php 仅解析 func_a,如果我请求 b,则仅解析 func_b,等等。实际上有不止 3 个函数,每个都是一个很长的算法,也有很长的字符串和数组。
作为包含的替代方案,我正在考虑制作独立的 php 文件并执行它们并仅在需要时使用 shell_exec 检索它们的输出。但这会带来其他复杂性,比如格式化参数(我不知道如何传递带有特殊字符的很长的字符串,或者 JSON,作为 shell 中的参数)并调用函数在 shell 中执行。这些复杂性会使它比让 php 解析整个文件慢吗?
我知道 opcache 函数。每次都测试所有函数的所有ops就够了吗?
是否有其他方法可以使 PHP 网站模块化,而不是让 php 每次都解析整个 php 文件?
谢谢。
因为 php 使用了许多优化和缓存 apcu,即你不需要关心这个
include 不会在加载时被解析。它更像 file_get_contents 并在相同的上下文中执行 - 这些将由内部 php 缓存
优化
我做了一个基准测试,似乎 php 确实不解析条件包含。我使用提到的示例脚本进行了测试,并将每个脚本定义为:
func_a:它只是声明了变量$x的值为'war and peace'.
这句话
$x = 'war and peace';
func_b:它只声明变量$x的值是小说war与和平的全文,长约3.2MB(整个文本粘贴在 php 文件中)。这将是一个非常长的文件来解析。
$x = 'War and Peace, by Leo Tolstoy...(the whole novel...)...';
func_c:它包含不正确的语法,应该立即从 php 启动错误消息。这是为了保证 php 实际上没有解析未包含的内容。
我用函数 shell_exec() 测量了另一个 php 脚本的执行时间。结果是(以秒为单位):
- func_a ≈ 0.122
- func_b ≈ 0.152
- func_c ≈ 0.119
因此我得出结论:
- 除非实际需要,否则不会解析 switch 语句中的包含。
- include 中的语法错误(在 switch 语句中)如果实际上不需要,则不会引发任何错误,因为它没有被解析。
- 无论如何,处理时间的差异非常小(对于 3.3 MB 的额外文本大约需要额外 0.03 秒;或者粗略地说,每 1 MB 要解析的文本需要额外 0.01 秒)。然而,如果有许多用户同时请求该网站,考虑这一点可能很重要,因此如果脚本实际上那么大,则划分模块(包含)可能很有用。此外,不要求不解析错误编写的包含这一事实有助于在不相关时不启动错误。
对我来说,在模块非常大的 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;
?>
在此示例中,如果我请求 a,我希望 php 仅解析 func_a,如果我请求 b,则仅解析 func_b,等等。实际上有不止 3 个函数,每个都是一个很长的算法,也有很长的字符串和数组。
作为包含的替代方案,我正在考虑制作独立的 php 文件并执行它们并仅在需要时使用 shell_exec 检索它们的输出。但这会带来其他复杂性,比如格式化参数(我不知道如何传递带有特殊字符的很长的字符串,或者 JSON,作为 shell 中的参数)并调用函数在 shell 中执行。这些复杂性会使它比让 php 解析整个文件慢吗?
我知道 opcache 函数。每次都测试所有函数的所有ops就够了吗?
是否有其他方法可以使 PHP 网站模块化,而不是让 php 每次都解析整个 php 文件?
谢谢。
因为 php 使用了许多优化和缓存 apcu,即你不需要关心这个
include 不会在加载时被解析。它更像 file_get_contents 并在相同的上下文中执行 - 这些将由内部 php 缓存
优化我做了一个基准测试,似乎 php 确实不解析条件包含。我使用提到的示例脚本进行了测试,并将每个脚本定义为:
func_a:它只是声明了变量$x的值为'war and peace'.
这句话$x = 'war and peace';
func_b:它只声明变量$x的值是小说war与和平的全文,长约3.2MB(整个文本粘贴在 php 文件中)。这将是一个非常长的文件来解析。
$x = 'War and Peace, by Leo Tolstoy...(the whole novel...)...';
func_c:它包含不正确的语法,应该立即从 php 启动错误消息。这是为了保证 php 实际上没有解析未包含的内容。
我用函数 shell_exec() 测量了另一个 php 脚本的执行时间。结果是(以秒为单位):
- func_a ≈ 0.122
- func_b ≈ 0.152
- func_c ≈ 0.119
因此我得出结论: - 除非实际需要,否则不会解析 switch 语句中的包含。 - include 中的语法错误(在 switch 语句中)如果实际上不需要,则不会引发任何错误,因为它没有被解析。 - 无论如何,处理时间的差异非常小(对于 3.3 MB 的额外文本大约需要额外 0.03 秒;或者粗略地说,每 1 MB 要解析的文本需要额外 0.01 秒)。然而,如果有许多用户同时请求该网站,考虑这一点可能很重要,因此如果脚本实际上那么大,则划分模块(包含)可能很有用。此外,不要求不解析错误编写的包含这一事实有助于在不相关时不启动错误。
对我来说,在模块非常大的 PHP 中设计模块化应用程序似乎是一种很好的方式。