ini_set ("memory_limit") в PHP 5.3.3 вообще не работает

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

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» устарел.

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

Скорее всего, ваш 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 , в котором говорится:

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

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

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

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

Установлен ли Сухосин?

  • Как проверить, установлен ли 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 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

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

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'); 

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

  <?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'); в верхней части файла или, по крайней мере, перед любым эхом .

Что касается меня, сухозин не был решением, потому что он даже не появился в моей phpinfo (), но это сработало:

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