1

我在某处读到 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 中的参数传递)并调用函数以在壳。这些复杂性会让它比让 php 解析整个文件更慢吗?

我知道 opcache 功能。即使每次都测试所有功能的所有操作是否足够?

是否有其他方法可以使 PHP 网站模块化,而不是每次都让 php 解析整个 php 文件?

谢谢你。

4

2 回答 2

0

因为 php 使用了许多优化和缓存 apcu 即你不需要关心这个

include 不会在加载时被解析.. 它更像 file_get_contents 并在相同的上下文中执行 - 这些将通过内部 php 缓存进行优化

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

于 2018-07-09T13:57:33.280 回答
0

我做了一个基准测试实验,似乎 php 确实不解析条件包含。我使用提到的示例脚本进行了测试,并将每个脚本定义为:

  • func_a:它只声明变量$x的值是句子'war and Peace'。

    $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 语句中的包含。- 如果实际上不需要,include 中的语法错误(在 switch 语句中)不会引发任何错误,因为它没有被解析。- 无论如何,处理时间的差异非常小(对于 3.3 MB 的额外文本,大约需要额外的 0.03 秒;或者粗略地说,每 1 MB 的文本要解析额外的 0.01 秒)。但是,如果有许多用户同时请求网站,这可能很重要,因此如果脚本实际上那么大,划分模块(包含)可能很有用。此外,不需要不解析的错误写入的包含有助于在它们不相关时不启动错误。

对我来说,在 PHP 中设计一个模块非常大的模块化应用程序似乎是一种很好的方式。

于 2018-07-09T16:31:25.330 回答