【问题标题】:How can i check if ini_set will work on the server?我如何检查 ini_set 是否可以在服务器上运行?
【发布时间】:2011-12-17 10:58:59
【问题描述】:

如何检查服务器配置是否允许我设置如下选项:

ini_set('upload_max_filesize', '8M');

在 PHP 脚本中?这是php.ini directives 的列表,但我真的不知道如何在更改该值之前进行检查。

【问题讨论】:

  • 阻塞?谁将更改您服务器上的 ini 设置?
  • 我认为你不能阻止他们。运行时可以设置的设置是允许设置的。
  • 这需要更多细节。您的问题到底是什么,您想“阻止”哪个选项以及您希望发生什么?
  • @Polmonino 您的更新完全改变了您原来的问题;为什么你问如何阻止 ini_set() 的使用呢??

标签: php administration


【解决方案1】:

检查我是否被允许使用ini_set 为一些option,如何?

ini_set 将在成功时返回旧值,false* 在失败时返回。有了这些知识,您可以编写一个语句来检查您的呼叫是否通过,如下所示。

$result = ini_set ("some_option", "some_value");
$failure = (version_compare(PHP_VERSION, '5.3.0') >= 0) ? false : '';
if ($result === $failure)
   echo "Unable to use ini_set to change 'some_option'!";

(*):请注意 PHP 5.3.0 中的返回值从 ''(一个空字符串)更改为 false。所以你还需要检查你当前的 PHP 版本。


另一种方法是使用ini_get_all,它将为您提供有关每个可用选项的详细信息,它是access level

$all_option_details = ini_get_all ();

/* see the comments in this post regarding PHP_INI_USER vs INI_USER
 * seems like someone writing the relevant PHP documentation fcuked up
 *
 * props to @soulmerge */

if ($all_option_details['upload_max_filesize']['access'] & INI_USER)
   echo "we are allowed to change upload_max_filesize from with ini_set!";

我想对某些选项禁用ini_set,如何操作?

有几种方法可以使选项在运行时不可更改(以禁用ini_set 的方式),其中有以下两种,您可以在提供的链接中阅读更多信息。

php_admin_value 名称值

设置指定指令的值。这不能在 .htaccess 文件中使用。任何使用 php_admin_value 设置的指令类型都不能被 .htaccess 或 ini_set() 覆盖。要清除以前设置的值,请​​使用 none 作为值。

 

php_admin_flag name on|off

用于设置布尔配置指令。这不能在 .htaccess 文件中使用。任何使用 php_admin_flag 设置的指令类型不能被 .htaccess 或 ini_set() 覆盖


示例(取自 this 文档)

<IfModule mod_php5.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>

<IfModule mod_php4.c>
  php_value include_path ".:/usr/local/lib/php"
  php_admin_flag engine on
</IfModule>

【讨论】:

  • 我正在尝试您的方法,但在我的系统(本地开发)上回显 PHP_INI_USER 给了我未定义的使用未定义的常量 PHP_INI_USER...
  • 根据文档PHP_INI_USER的值为1,因此我们应该使用这个值(即不要使用常量)
  • 使用幻数代替常量绝不是一个好主意,如果常量丢失,肯定是有原因的。根据ini_get_all() 的文档,$details 参数是在 PHP 5.3 中引入的。看起来 Polmonino 使用的是早期版本的 PHP。
  • @soulmerge 是的,我同意你的看法。尽管(在文档中)没有说 PHP_INI_USER 实际上被定义为常量,但这是我的假设,结果证明是不正确的。使用适当的评论(您可以使用“神奇的数字”,或者只是定义自己的常量 - 使用描述正在发生的事情的评论)
  • 你说得对,这看起来像是 php.net 上的一个文档错误:该常量实际上称为 INI_USER (php.net/manual/en/reserved.constants.php),而不是 PHP_INI_USER (php.net/manual/en/configuration.changes.modes.php)
【解决方案2】:

除非您尝试设置所需的值,否则不可能知道您的实际限制是多少。例如,可能安装了suhosin 补丁,这可能会阻止您更改值。

因此,检查是否可行的唯一选择是尝试并检查返回值(无论如何您都应该这样做):

$oldValue = ini_get('upload_max_filesize');
if (ini_set('upload_max_filesize', '8M') === false) {
    die("Couldn't update upload file size.");
}
if (ini_set('upload_max_filesize', $oldValue) === false) {
    die("Error resetting upload file size.");
}
// you can safely assume that it is possible to set
// upload_max_filesize to 8M from this line onward.

【讨论】:

  • 查看我的帖子以了解替代方法,您不必致电ini_set 来查看是否可以更改值。另外,您应该写ini_set (...) === false,由于隐式转换规则,上述内容可能存在。
【解决方案3】:
echo ini_get (<BLA>);
ini_set (<BLA>);
echo ini_get (<BLA>);

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 2021-08-14
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    相关资源
    最近更新 更多