ini_set ("memory_limit") в PHP 5.3.3 вообще не работает - PullRequest
43 голосов
/ 21 февраля 2011

У меня было это раньше:

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 и погуглил ее, и нигде не нашел, что «memory_limit» устарела

У кого-нибудь есть решение?

Ответы [ 6 ]

26 голосов
/ 10 марта 2011

Если у вас включено расширение suhosin, оно может помешать сценариям установить предел памяти сверх того, с которого он был запущен, или какой-то определенный предел.

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

24 голосов
/ 20 апреля 2011

Скорее всего, обновлен ваш sushosin, который изменил значение по умолчанию suhosin.memory_limit с отключенного на 0 (что не позволит обновлять memory_limit).

В Debian измените /etc/php5/conf.d/suhosin.ini

; suhosin.memory_limit = 0

до

suhosin.memory_limit = 2G

Или какое бы значение вы ни устраивали. Вы можете найти список изменений в Sushosin по адресу http://www.hardened -php.net / hphp / changelog.html , где написано:

Изменен способ реализации защиты memory_limit

12 голосов
/ 22 апреля 2015

Вот список вещей, которые стоит проверить:

Установлен ли 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

  • Используется ли php_admin_value в .htaccess или virtualhostфайлы?

Устанавливает значение указанной директивы.Это нельзя использовать в файлах .htaccess.Любой тип директивы, установленный с помощью php_admin_value, не может быть переопределен с помощью .htaccess или ini_set ().Чтобы очистить ранее установленное значение, не используйте ничего в качестве значения.

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

4 голосов
/ 21 февраля 2011

Работает у меня, не имеет ничего общего с PHP 5.3. Как и многие другие опции, его нельзя переопределить с помощью ini_set(), если включен safe_mode. Проверьте ваш обновленный php.ini (и еще лучше: измените там memory_limit).

3 голосов
/ 08 октября 2012

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');
0 голосов
/ 24 апреля 2015

Давайте проведем тест с двумя примерами:

    <?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
    (...)
    ?>
...