【问题标题】:PHP Bootstrapping better method?PHP Bootstrapping 更好的方法?
【发布时间】:2009-02-01 20:23:07
【问题描述】:

引导您的 PHP 应用程序是一个好习惯吗? 我找到了两种方法来引导我的 PHP 应用程序。需要一些更好的建议。

首先。
为文件夹结构定义一个常量

$controllerPath = 'controller';
define('CONTROLLER', str_replace('\\', '/', realpath($controllerPath)).'/');

//usage
require_once CONTROLLER . 'somecontroller.php';

第二
使用 ini_set 设置应用程序根目录的包含路径

$rootPath = $_SERVER['DOCUMENT_ROOT'];
$includePath = ini_get('include_path');
ini_set('include_path', '.'.PATH_SEPARATOR.$rootPath.PATH_SEPARATOR.$includePath);

//usage
require_once 'controller/somecontroller.php';

请告诉我哪种方法更好。

如果是高负载应用程序,哪种方法是最好的方法??

【问题讨论】:

    标签: php bootstrapping


    【解决方案1】:

    使用 ini_set 将其设置到您的应用程序之上的目录。这就是为什么您可以在 require 语句中使用文字字符串的原因。此外,它使复用代码更容易使用

    require 'coolapp/class/Model.php'
    require 'coolapp/display/Router.php'
    require 'spinoff/display/JsView.php'
    // etc
    

    这类似于 java 中完全限定导入 com.whatever.app.more 的想法,或者在 python 中,所有应用程序的导入对于该应用程序来说应该是绝对的。

    回复:高负载应用

    除非您要加载数千个文件,否则包含文件所需的时间可能不是瓶颈。但是,如果是这种情况,您有几个选择。一种是APC,它将include的结果缓存在内存中。另一种方法是从单个文件加载所有内容,类似于如何将 javascript 文件连接成一个文件以获得更好的性能(巧合的是,APC 有一个功能可以为您提供此信息)。 APC 非常容易设置并且完全透明,可以提升~50% better performance

    【讨论】:

      【解决方案2】:

      最好使用绝对路径,而不是让 PHP 在给定的包含路径之一中查找文件。

      所以我倾向于第一种方式,使用一个常量来保存应用程序根目录的绝对路径。

      【讨论】:

        【解决方案3】:

        这就是我的工作:

        • 将 /include 目录放在文档根目录(或任何您想调用的名称)的顶部,用于所有类、辅助函数等;
        • 使用 mod_rewrite 使其不服务于 /include 目录;
        • 在其中有一个名为 setup.php 的文件,用于设置相关的 ini 参数、路径等;
        • 该文件按相对路径包含在每个页面中;和
        • 然后其他一切都可以依赖于它创建的设置。

        顶级.htaccess 的重写规则示例:

        RewriteEngine On
        RewriteBase /
        RewriteCond %{THE_REQUEST} ^[A-Z]+\ /include/
        RewriteRule ^include/ - [R=404,L]
        

        我可能有点走神了。我手头没有我的标准规则。您会注意到这是我创建的 404 错误,而不是 403(禁止)。这是故意的。当您登录到系统时,它不会说“未知用户”或“密码不正确”,因为这会告诉您一些信息。我宁愿假装根本没有 /include 目录,也不愿说它在那里,但你就是看不到它。

        此时您可以设置所有您需要的东西,以便您的其余代码可以执行:

        require 'Class.php';
        

        甚至定义一个__autoload(),这样它就会自动发生。

        【讨论】:

          【解决方案4】:

          这是我的引导加载程序的示例:

          if (!defined('APPLICATION_PATH')) {
              define('APPLICATION_PATH', realpath(getcwd() . '/../application'));
          }
          
          /**
           * Add the APPLICATION_PATH and the library dir to the include_path
           */
          set_include_path(get_include_path() . PATH_SEPARATOR . APPLICATION_PATH . PATH_SEPARATOR . realpath(APPLICATION_PATH . '/../library'));
          
          /**
           * Load the file loader to setup the class autoloader
           */
          include_once 'Loader.php';
          if (!class_exists('Loader')) {
              die('Could not load class loader.');
          }
          
          spl_autoload_register('Loader::autoload');
          

          我个人会选择第二种方式。我已经学会了喜欢 include_path:查看大量目录可能会对性能造成一些影响,但我怀疑这会很重要。它还可以防止错误忘记包含路径常量。

          顺便说一句,我将我的控制器等放在/application/ 中,并在/library/ 中有一些库。这一切都在网络根目录之上。它完全阻止用户访问这些文件,如果您将所有内容都放在文档根目录下,则必须采取预防措施。如果您的主机支持此功能(某些共享主机不支持),请利用它!

          更新

          如果是高负载应用程序,是否可以使用第二种方法??

          在我看来,如果您要密切关注 include_path 中的内容(例如,在我的 Windows 开发机器上,我有各种我不需要的东西:SQL Server、Ruby 等)和去掉不需要的东西,那么第二种方法就可以了。

          您可以做的另一件事是在脚本末尾转储include_path 并将其硬编码到您的 php.ini 文件中。

          不过,真的。我认为这不会成为您系统性能的瓶颈。使用对你来说更容易的东西。

          您正在运行的网站是否存在性能问题,或者这是预防措施?我明白你为什么要预先优化(我必须阻止自己这样做),但要认真。当它们出现时处理这些问题。当您幸运地拥有一个受欢迎的网站来处理它时。归根结底,如果您必须更换几个requires,这不是一场噩梦。

          【讨论】:

          • 是的,那是另一回事:如果您使用的是 PHP5(应该是),自动加载类(不需要,只需实例化类)是一个非常有用的工具。 php.net/autoload
          • 这是一种预防措施。但是这个应用程序很大,所以我没有几个'require_one',所以这对我来说将是一场噩梦:)
          • 我建议你还是看看自动加载。这意味着类在使用时被加载。您可能必须使用一些命名约定,但我通常使用目录结构。例如。 Zend_Form = Zend/Form.php
          【解决方案5】:

          我更喜欢第二种方式——在一个大型 PHP 项目中使用它并且非常喜欢它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-29
            • 1970-01-01
            • 2015-09-14
            • 2011-10-31
            • 1970-01-01
            • 1970-01-01
            • 2015-12-31
            • 2015-06-16
            相关资源
            最近更新 更多