我在某处读到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 在请求 a 时只解析func_a,如果我请求 b,则只解析func_b,等等。实际上不止 3 个函数,每个函数都是一个非常长的算法,还有很长的字符串和数组。
作为包含的替代方案,我正在考虑制作独立的 php 文件并执行它们并仅在需要时检索它们的输出,并带有shell_exec。但这需要其他复杂性,例如格式化参数(我不知道如何将带有特殊字符或 JSON 的很长的字符串作为 shell 中的参数传递(和调用函数在 shell 中执行。这些复杂性会不会比让 php 解析整个文件更慢?
我知道opcache函数。即使每次都测试所有函数的所有操作就足够了吗?
有没有其他方法可以使PHP网站模块化,而不是让php每次都解析整个php文件?
谢谢。
因为 php 使用了许多优化和缓存 apcu,即你不需要关心这个
包含不会在加载时被解析......它更像是file_get_contents并在同一上下文中执行 - 这些将通过内部PHP缓存进行优化
http://php.net/manual/en/intro.apc.php
我做了一个基准测试实验,似乎 php 确实不会解析条件包含。我使用提到的示例脚本进行了测试,并将每个脚本定义为:
-
func_a:它只声明变量$x的值是句子"战争与和平"。
$x="战争与和平";
-
func_b:它只声明变量$x的值是小说《战争与和平》的全文,长约3.2MB(全文粘贴在php文件中(。这将是一个非常长的文件。
$x=列夫·托尔斯泰的《战争与和平》...(整部小说......';
-
func_c:它包含不正确的语法,应该立即从 PHP 启动错误消息。这样做是为了保证 php 实际上不会解析未包含的内容。
我用函数 shell_exec(( 测量了另一个 php 脚本的执行时间。结果是(以秒为单位(:
- func_a ≈ 0.122
- func_b ≈ 0.152
- func_c ≈ 0.119
因此,我的结论是: - 除非实际需要,否则不会解析 switch 语句中的包含。 - 如果实际上不需要包含(在 switch 语句内(中的语法错误,则不会启动任何错误,因为它未被解析。 - 无论如何,该过程的时间差异很小(对于 3.3 MB 的额外文本大约需要 0.03 秒;或者粗略地说,每 1 MB 文本解析额外 0.01 秒(。但是,如果有许多用户同时请求网站,这可能很重要,因此,如果脚本实际上那么大,则划分模块(包含(可能会很有用。此外,不需要解析错误编写的包含有助于在不相关时不启动错误。
对我来说,用PHP设计一个模块化应用程序似乎是一个很好的方法,其中模块非常大。