【问题标题】:ini_set("memory_limit") in PHP 5.3.3 is not working at allPHP 5.3.3 中的 ini_set("memory_limit") 根本不起作用
【发布时间】:2011-07-01 00:29:45
【问题描述】:

我之前有这个工作:

echo ini_get("memory_limit")."\n";
ini_set("memory_limit","256M");
echo ini_get("memory_limit")."\n";

那会输入这个:

32M
256M

在命令行执行的 php 脚本上。 我从 5.2 更新到 5.3,从现在开始,这个指令根本不起作用:这给了我:

32M
32M

然后让我的脚本因致命错误而失败...

我检查了 php 文档,并在 google 上搜索了它,但我没有发现“memory_limit”已被弃用的任何地方。

有人有解决办法吗?

【问题讨论】:

  • 可以尝试:php_value memory_limit 256M to your .htaccess
  • 为此使用 php.ini,这对我来说是不幸的。

标签: php memory apache2 debian


【解决方案1】:

很可能您的 sushosin 已更新,这将 suhosin.memory_limit 的默认值从禁用更改为 0(这将不允许对 memory_limit 进行任何更新)。

在 Debian 上,更改 /etc/php5/conf.d/suhosin.ini

;suhosin.memory_limit = 0

suhosin.memory_limit = 2G

或任何您喜欢的值。你可以在http://www.hardened-php.net/hphp/changelog.html 找到 Sushosin 的更新日志,上面写着:

更改了 memory_limit 保护的实现方式

【讨论】:

  • 非常有帮助!此设置的 suhosin 文档表明它是一个整数,并且没有清楚地表明您可以使用 (MG) 后缀;因此,在我读到这篇文章之前,我被甩了。
【解决方案2】:

如果您启用了 suhosin 扩展,它可以防止脚本将内存限制设置为超出其起始值或某个定义的上限。

http://www.hardened-php.net/suhosin/configuration.html#suhosin.memory_limit

【讨论】:

    【解决方案3】:

    以下是值得检查的事项列表:

    Suhosin 安装了吗?

    ini_set

    • 格式很重要 ini_set('memory_limit', '512'); // DIDN'T WORK ini_set('memory_limit', '512MB'); // DIDN'T WORK ini_set('memory_limit', '512M'); // OK - 512MB ini_set('memory_limit', 512000000); // OK - 512MB

    当使用整数时,该值以字节为单位。速记 也可以使用FAQ 中描述的符号。

    http://php.net/manual/en/ini.core.php#ini.memory-limit

    • 是否在 .htaccess 或 virtualhost 文件中使用了 php_admin_value?

    设置指定指令的值。这不能用于 .htaccess 文件。任何用 php_admin_value 设置的指令类型都不能 被 .htaccess 或 ini_set() 覆盖。清除先前设置的 value 使用 none 作为值。

    http://php.net/manual/en/configuration.changes.php

    【讨论】:

    • ini_set('memory_limit', '512'); 确实有效,只是将内存限制设置为 512B
    【解决方案4】:

    对我有用,与 PHP 5.3 无关。就像许多此类选项一样,当启用安全模式时,它不能通过ini_set() 覆盖。检查你更新的php.ini(更好的是:也改变memory_limit)。

    【讨论】:

    • 很少比 php safe_mode() 更糟糕
    【解决方案5】:

    Ubuntu 10.04 仅附带 Suhosin 补丁,它不提供配置选项。但是你可以安装 php5-suhosin 来解决这个问题:

    apt-get update
    apt-get install php5-suhosin
    

    现在你可以编辑 /etc/php5/conf.d/suhosin.ini 并设置:

    suhosin.memory_limit = 1G
    

    然后使用 ini_set 将在脚本中工作:

    ini_set('memory_limit', '256M');
    

    【讨论】:

      【解决方案6】:

      让我们用 2 个例子做一个测试:

          <?php    
          $memory = (int)ini_get("memory_limit"); // Display your current value in php.ini (for example: 64M)
          echo "original memory: ".$memory."<br>";
          ini_set('memory_limit','128M'); // Try to override the memory limit for this script
          echo "new memory:".$memory;
          }
          // Will display:
          // original memory: 64
          // new memory: 64
          ?>
      

      以上示例不适用于覆盖 memory_limit 值。 但这会起作用:

          <?php
          $memory = (int)ini_get("memory_limit"); // get the current value
          ini_set('memory_limit','128'); // override the value
          echo "original memory: ".$memory."<br>"; // echo the original value
          $new_memory = (int)ini_get("memory_limit"); // get the new value
          echo "new memory: ".$new_memory;  // echo the new value
          // Will display:
          // original memory: 64
          // new memory: 128
          ?>
      

      您必须将ini_set('memory_limit','128M'); 放在文件顶部至少在任何回显之前

      对于我来说,suhosin 不是解决方案,因为它甚至没有出现在我的 phpinfo() 中,但这有效:

          <?php
          ini_set('memory_limit','2048M'); // set at the top of the file
          (...)
          ?>
      

      【讨论】:

      • 你的代码有缺陷,所以你的结论是错误的!
      • @DUzun 你能解释一下我的代码中的“缺陷”在哪里吗? (我不知道什么是“缺陷”,我不是以英语为母语的人)。对于我的有效代码(我已经对其进行了测试,并且我使用了它),你的观点的解释会比仅仅一个-1更好。谢谢
      • @DUzun 我已经修改了我用空白 php 文件再次测试的示例。我的结论有点不同,但我之前的解决方案仍然有效。
      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 2012-11-09
      • 1970-01-01
      • 2023-02-09
      • 2023-03-09
      • 1970-01-01
      • 2012-05-31
      • 2011-08-17
      相关资源
      最近更新 更多