【问题标题】:Optimize file include inside functions in PHP优化文件包含 PHP 中的内部函数
【发布时间】:2011-04-18 09:29:45
【问题描述】:

我有一个函数需要包含一个文件,但是这个函数被使用了200到300次,这显然会导致效率问题,有没有办法在函数内部优化这个? (我知道有很多方法可以解决这个问题,但它会对整个应用程序造成太大影响)

我只是举个小例子,这不是全部功能。

function getString(arrayName, strValue){
    inclue('stringArrays.php');
    return $$arrayName[strValue];
}

我尝试使用 include_once,但这也不起作用。

提前致谢。

【问题讨论】:

  • 什么效率问题?包含不会比将代码放在同一个文件中更影响效率。不管你叫多少次
  • 您的意思是 getString() 被调用了 200 到 300 次(在这种情况下包含不应多次发生)还是您有 200 到 300 个不同的函数,每个函数都包含 stringArrays .php(这是一个严重的性能问题)?
  • @Stewie:它使脚本变慢,因为 PHP 必须去获取文件并包含它,确定它是否发生 50 到 100 次没有问题,但是当你执行 700 次时(就像它是发生)你可以看到问题。
  • @Mark:它是一个函数,没有办法让文件只包含一次,或者在不使stringArrays.php中的每个var都全局的情况下形成外部,这会对应用程序造成一点影响.
  • 我不这么认为,无论如何,不​​要只提供文件名,而是提供完整路径或在 set_include_path(); 中设置正确的路径;这样 php 就不必四处寻找文件了。

标签: php function file include


【解决方案1】:

您可以在函数中使用静态变量来保存您的值:

function getString($arrayName, $strValue){
static $string_arrays = array();
if (empty($string_arrays)) {
    include('stringArrays.php');
    $string_arrays = array_diff_key(get_defined_vars(), array(
        'string_arrays' => true,
        'arrayName' => true,
        'strValue' => true,
    ));
}
return $string_arrays[$arrayName][$strValue];

}

应该只包含一次文件。

【讨论】:

    【解决方案2】:

    如果 stringArrays.php 只是一个数组的集合,那么在构造函数中创建一个包含 stringArrays.php 的 stringHandler 单例并将每个数组映射到一个类属性,然后是一个简单的方法来从该类中获取任何你想要的.然后,您的 getString() 函数只需引用 stringHandler 中的 getter 方法。

    stringArrays.php

    <?php
    
    $abc = array('def' => 'Hello',
                 'ghi' => ' '
                );
    
    $jkl = array('mno' => 'World',
                 'pqr' => '.'
                );
    
    ?>
    

    stringHandler.php

    <?php
    
    class stringHandler
    {
        private static $instance;
    
        private function __construct()
        {
            include('stringArrays.php');
            foreach(get_defined_vars() as $key => $val) {
                $this->{$key} = $val;
            }
        }
    
        public static function singleton()
        {
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
    
            return self::$instance;
        }
    
        public function getStringFromArray($arrayName, $strValue)
        {
            return $this->{$arrayName}[$strValue];
        }
    
    }
    
    function getString($arrayName, $strValue){
        return stringHandler::singleton()->getStringFromArray($arrayName, $strValue);
    }
    
    
    echo getString('abc','def');
    echo getString('abc','ghi');
    echo getString('jkl','mno');
    
    ?>
    

    Kludgy,但不应该是很大的性能开销。

    【讨论】:

    • 是的,我同意你的观点,这是一个更好的方法,专门用于面向对象的应用程序,但是,我们没有这样做,现在它变得一团糟,在未来的应用程序中,我们将使用它,对吧现在很遗憾,我们不得不感谢您的帮助
    【解决方案3】:

    是否有什么阻止您将当前的“一堆”数组包装在一个数组中,然后通过引用将该包装器数组传递给函数?然后,您可以在函数之外执行单个要求/包含。或者,您可以将数组集和函数包装在一个对象中,再次将您带到一个单独的 require/include。

    【讨论】:

    • 我们必须将数组从 $arrayName 转换为 $bigArray['arrayName'] 是的,这是一个解决方案,但是工作量太大,感谢您的帮助。
    【解决方案4】:

    安装 APC、eAccelerator、XCache 或任何其他代码加速器,这样 PHP 就无需在每次调用时都从磁盘检索包含文件。代码加速器将文件保存在共享内存中。这将显着提高性能。

    【讨论】:

      【解决方案5】:

      如果您的函数只是包含一个文件,您应该首先评估是否应该首先调用该函数,或者让该函数确定是否需要包含。如果您确实不需要包含文件,则基本上不要盲目地包含文件。 include_once 会导致性能下降。

      【讨论】:

      • 不,它不仅包含一个文件,就像我说的那样,这只是整个函数的一个小例子,我只是输入了基本概念。
      【解决方案6】:

      您可以尝试全局化 stringArrays.php 中的内容,以便在包含文件之前检查该全局变量是否已设置。如果不查看 stringArrays.php 中的结构,很难判断。

      【讨论】:

      • 是的,如果在开发之初就完成了,那可以,但是在这个阶段有点烦人。
      • 糟糕,并不是要提交它。在 stringArrays 中,只有具有许多 key=>Value 的不同数组,但是没有包含所有内容的大数组,每个数组都是不同的。 $values_1=array('test' => '这是一个测试');现在它有大约 200 个数组。
      • 您可以将 stringArrays.php 更改为 $GLOBALS['values_1'] = array(... 从而确保当您从函数中包含它时,它将全局设置并且可以从所有其他该函数的调用。您必须通过以下方式访问它: return $GLOBALS[$arrayName][$strValue]; 但您可以轻松检查 if(!isset($GLOBALS['values_1'])) inclue('stringArrays .php');
      【解决方案7】:

      您总是可以添加另一个参数,也许是一个布尔值,来告诉函数是否包含它。

      function getString(arrayName, strValue, includeFile)
      { 
          if (includeFile)
          {
              inclue('stringArrays.php');
          }
      
          return $$arrayName[strValue]; 
      }
      

      【讨论】:

      • 每次调用函数时都需要包含文件,否则无法从中获取任何值。
      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2020-10-19
      • 2015-06-01
      • 2020-06-28
      • 1970-01-01
      相关资源
      最近更新 更多