如何检查ini_set在服务器上是否可用?

10

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

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

如何在PHP脚本中检查一个配置项是否可更改?这里有一份php.ini指令列表,但我不太清楚如何在修改配置项值之前进行检查。


阻塞?谁会更改您服务器上的ini设置? - Damien Pirsy
我认为你不能阻止它们。你可以在运行时设置的设置是允许设置的。 - djot
@Polmonino,你的更新完全改变了你最初的问题;那么你为什么要问如何 阻止 使用 ini_set() 呢? - Damien Pirsy
@DamienPirsy 因为我可以测试它阻止并尝试更改指令。 - user1098965
并非所有设置都可以在您的代码中更改,upload_max_filesize就是其中之一 - 从逻辑上讲,在脚本执行时,文件已经被上传/拒绝为太大 - 在设置列表中,只有那些标记为PHP_INI_USER或PHP_INI_ALL的设置可以使用ini_set()从您的脚本中进行设置。 - Mark Baker
显示剩余3条评论
3个回答

11

如何检查是否允许使用ini_set来设置某些选项

当成功时,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,它将为您提供有关每个可用选项及其访问级别的详细信息。
$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 name 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 的值为 1,因此我们应该使用这个值而不是常量。 - Filip Roséen - refp
使用魔法数字而不是常量从来都不是一个好主意,如果常量缺失,那一定有其原因。根据ini_get_all()的文档,$details参数是在PHP 5.3中引入的。看起来Polmonino正在使用较早版本的PHP。 - soulmerge
@soulmerge 是的,我同意你的观点。尽管文档中没有说明 PHP_INI_USER 实际上被定义为常量,这是我的一个假设,结果证明是错误的。通过适当的注释(您可以使用“神奇数字”,或者只需定义您自己的常量 - 并使用描述正在发生的内容的注释),可以解决这个问题。 - Filip Roséen - refp
2
你是对的,这看起来是php.net上的文档错误:常量实际上被称为INI_USER(http://www.php.net/manual/en/reserved.constants.php),而不是`PHP_INI_USER`(http://www.php.net/manual/en/configuration.changes.modes.php)。 - soulmerge
据我所知,它应该可以工作,并且我在suhosin的文档中找不到任何阻止此功能的内容。 - Filip Roséen - refp
显示剩余6条评论

3

除非您尝试设置所需的值,否则不可能知道您的真实限制。例如,可能已安装了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,上述代码可能会由于隐式转换规则而产生误导。 - Filip Roséen - refp

-3
echo ini_get (<BLA>);
ini_set (<BLA>);
echo ini_get (<BLA>);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接