【问题标题】:Declaring global variable with php.ini用 php.ini 声明全局变量
【发布时间】:2011-06-30 11:14:14
【问题描述】:

是否可以将变量保存在 php.ini 文件中。就像我们对 .net 中的 web.config 所做的那样。我喜欢在 php.ini 中保留一个标志类型变量并将其用于不同的项目。

【问题讨论】:

  • 假设本地访问(考虑到您提到的 php.ini)只需使用本地文件并在您的项目中引用它(/usr/bin/local/myconfig.ini 或 C:\PHP\myconfig .ini)

标签: variables global php


【解决方案1】:

无法在普通的 php.ini 文件(或 .htaccess 等效文件)中设置用户级变量。有一些 PECL 模块确实允许这样做,例如 hidef (http://pecl.php.net/package/hidef) - 尽管在您使用的每个安装中都需要安装这些模块。

包含(或预包含)带有auto_prepend_file 的文件是很有可能的——尽管这将在每个 PHP 请求中。

经常做的是将环境变量设置为网络服务器进程的一部分,可以从 PHP 中读取。在 Apache 中,这很容易,使用 SetEnv 模块。

SetEnv PRODUCTION_SERVER 1

并在 PHP 中访问它:

if ($_ENV['PRODUCTION_SERVER']) {...}  // or getenv('PRODUCTION_SERVER')

【讨论】:

  • 顺便说一句,当两个值都是相同长度的字符串时,ini_getgetenv 采用 same 时间(在 10M 循环之后)。字符串稍长的字符串(等等)略有不同(时间更长)。
  • 这不适合我刚刚添加,因为我希望敏感密码只能由 root 读取,而我的 php 应用程序同时具有 cron 方面和 web 方面,因此,仅设置 apache env 暂时无法解决我的 cron .然而,这在 apache 方面很有用。
  • 如果您还使用 CLI 和 CRNS,则提供的解决方案不起作用,配置文件将是最灵活的方法。
  • 在我的系统 (php 5.4.22) 上,这不会出现在 $_ENV 中,而是出现在 $_SERVER 中。我的回答如下。
  • 看看@Ascherer 的回答。 get_cfg_var() 将从 php,ini 返回一个值
【解决方案2】:

你看过get_cfg_var()吗?

我需要做类似的事情,而这可以为我做。

【讨论】:

    【解决方案3】:

    没有。

    您可以使用auto_prepend_file 指令自动包含一个文件,尽管它使用include_path,但您需要指定完整路径。

    但是,仅显式包含/要求相关文件可能更透明。

    【讨论】:

      【解决方案4】:

      我发现将有限数量的全局变量传递给引导脚本很有用的一种技术是利用 .htaccess 文件中的 SetEnv 指令。优点是您设置的变量将可用于该目录中的任何脚本,以及该目录下的子目录中的任何脚本。

      您可以使用带有配置文件位置的 SetEnv 变量,例如:

      在 .htaccess 中:

      SetEnv init_path /home/hendepher/TestApp/init/init.php
      

      在您的 .php 脚本中:

      <?php
          if(!getenv('init_path')) throw new Exception('Must set init_path in .htaccess');
          require_once getenv('init_path');
          .
          .
          .
      
      ?>
      

      如果您有一个需要不同初始化或全局变量的测试目录,只需在您的测试目录中添加另一个 .htaccess 文件:

      SetEnv init_path /home/hendepher/TestApp/init/testing_init.php
      

      这样做,与使用'auto_prepend_file'指令相反,你的全局配置脚本不是由你服务器上的所有php应用程序运行的:有些可能不需要它。

      【讨论】:

      • CLI/CRON php 脚本怎么样?
      【解决方案5】:

      接受的答案也对我有用,但有一个变化。

      我没有在早期版本上对此进行测试,但在我的环境(php 5.4.22)中,这并没有出现在 $_ENV 中,而是出现在 $_SERVER 中。

      在我的 .htacess 文件中:

      SetEnv PRODUCTION_SERVER 0.  
      

      我的php代码:

      $production="PRODUCTION";
      if (!isset($_SERVER['PRODUCTION_SERVER']) || $_SERVER['PRODUCTION_SERVER'] != 1){
          $production="DEVELOPMENT";
      }
      

      【讨论】:

        【解决方案6】:

        我认为那不是存储变量的好地方。 php.ini 用于存储 PHP 本身的配置,而不是您的应用程序。您应该考虑将共享变量放入 .inc 文件中,然后将其包含在内。

        【讨论】:

        • $production="PRODUCTION"; if (!isset($_SERVER['PRODUCTION_SERVER']) || $_SERVER['PRODUCTION_SERVER'] != 1){ $production="DEVELOPMENT";这些是系统级别的应用程序配置——它有助于将详细信息移出应用程序并进入配置步骤。在一个代码库中工作真是太好了,所有代码都可以正常工作,因为它从应用程序代码库之外获取特定于环境的详细信息。
        • ^^ 用空格和换行符看起来好多了……悲伤的脸
        【解决方案7】:

        你考虑过hidef吗?

        允许在简单的 ini 文件中定义用户定义的常量, 然后像内部常量一样处理,没有任何 通常的性能惩罚。

        【讨论】:

        • php5-dev 是;之后,您可以使用pecl 命令进行安装。这是本网站的主题。
        【解决方案8】:

        补充@Ascherer 答案,使用get_cfg_var() 将自定义变量保存在自定义php.ini 中(由您创建的变量,不是官方的PHP ini 指令)。例如:

        在 php.ini 中:custom_variable = "abcde"
        在任何 php 脚本中:get_cfg_var('custom_variable') 返回 abcde

        我在本地开发的一个小项目中使用它。当我通过php -S localhost:8000 -c php.ini(不在本地运行Apache 服务器)运行本地服务器时,调用一些配置常量是一个不错的选择。在生产中,这些常量在.htaccess 中设置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-30
          • 1970-01-01
          • 2017-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多