Я пытаюсь запустить скрипт php (скрипт magento reindexer) из командной строки. Сценарий потребляет много памяти, поэтому я получаю следующую ошибку: PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 72 bytes) in /home/karanta/www/karanta.fr/lib/Zend/Db/Adapter/Abstract.php on line 691
Чтобы исправить эту проблему, я отредактировал /etc/php5/cli/php.ini
файл и набор memory_limit = 2048M
,
Чтобы проверить конфигурацию, я запускаю скрипт, содержащий phpinfo();
из кли и я вижу: memory_limit => 2048M => 2048M
Так что, похоже, конфигурация учтена правильно. ini_get('memory_limit);
также возвращает 2048M.
Однако, когда я повторно запускаю скрипт переиндексации, я все еще получаю PHP Fatal error: Allowed memory size of 536870912 bytes exhausted
как будто memory_limit был все еще 512M. Скрипт не может быть завершен, у меня нет идей, как увеличить memory_limit, чтобы скрипт мог завершиться.
Изменить: я также попытался добавить инструкцию ini_set("memory_limit", -1);
непосредственно в сценарий PHP, и он все еще висит с тем же PHP Fatal error: Allowed memory size of 536870912 bytes exhausted
,
Дополнительная информация:
Сервер — это выделенная машина, работающая под управлением Debian GNU / Linux 7.5 с 64 ГБ ОЗУ!
php -v
возвращает:
PHP 5.6.12-1 (cli) Copyright (c) 1997-2015 PHP Group Zend Engine
v2.6.0, Copyright (c) 1998-2015 Zend Technologies
с Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, Zend Technologies
free -k -h
во время выполнения скрипта возвращается:
total used free shared buff/cache available
Mem: 62G 1,8G 48G 84M 12G 60G
Swap: 1,0G 0B 1,0G
ps -aux
возвращает:
karanta 25568 5.6 0.0 229484 41824 pts/1 S 07:54 0:04 php shell/indexer.php --reindex catalog_url
Следуя рекомендации @ IgorGreg, я попытался установить ограничение памяти с помощью Zend_Memory. Я написал этот php-скрипт, который я запускаю из cli вместо скрипта shell / indexer.php.
<?php
require_once 'app/Mage.php';
$app = Mage::app('admin');
umask(0);
$memoryManager = Zend_Memory::factory('none');
$memoryManager->setMemoryLimit(-1);
$process = Mage::getModel('index/process')->load(3);
$process->reindexAll();
?>
Все еще получаю ту же ошибку.
Magento в режиме CLI анализирует .htaccess
файл и, если он находит ограничение памяти или какие-либо другие настройки PHP там, применяет их (да, серьезно ….)
Ответственный код находится в shell/abstract.php
:
/**
* Parse .htaccess file and apply php settings to shell script
*
*/
protected function _applyPhpVariables()
{
$htaccess = $this->_getRootPath() . '.htaccess';
if (file_exists($htaccess)) {
// parse htaccess file
$data = file_get_contents($htaccess);
$matches = array();
preg_match_all('#^\s+?php_value\s+([a-z_]+)\s+(.+)$#siUm', $data, $matches, PREG_SET_ORDER);
if ($matches) {
foreach ($matches as $match) {
@ini_set($match[1], str_replace("\r", '', $match[2]));
}
}
preg_match_all('#^\s+?php_flag\s+([a-z_]+)\s+(.+)$#siUm', $data, $matches, PREG_SET_ORDER);
if ($matches) {
foreach ($matches as $match) {
@ini_set($match[1], str_replace("\r", '', $match[2]));
}
}
}
}
Не устанавливайте ограничение памяти и время выполнения через .htaccess
, использовать php.ini
или конфигурация виртуального хоста.
В системах Linux может быть три отдельных параметра ограничения памяти, один для экземпляра php модуля Apache DSO, один для экземпляра php командной строки и один для экземпляра cgi php.
Каждая установка будет иметь свой собственный файл php.ini, например /etc/php5/apache2/php.ini
а также /etc/php5/cli/php.ini
и может иметь возможность переопределить set memory_limit отключено (обычно находится на общем хостинге).
php.ini
файл для cli должен быть увеличен в memory_limit.
Другая проблема может возникнуть, если вы используете кэш apc. Его нужно включить, добавив следующее в файл конфигурации apc.
apc.enable-cli=1
Третий источник проблем, если вы работаете в cPanel / WHM, это то, что из-за ограничений безопасности могут быть установлены несколько разных версий php. Я должен был связаться с нашим поставщиком услуг хостинга, чтобы запустить тот. Попробуйте использовать which php
из командной строки, где у вас возникла ошибка, и убедитесь, что это та же версия, которая доступна через скрипты cron. Файл php.ini для этой конкретной версии также должен быть установлен.
Установка memory_limit в -1 означает отсутствие ограничения памяти. Однако, если вы установите это значение в php.ini или .htaccess, оно может быть перезаписано сценарием во время выполнения.
Чтобы убедиться, что это вступит в силу, лучше использовать ini_set("memory_limit", -1);
в сценарии.
Как правило, установка memory_limit в -1 в php.ini не очень хорошая идея. Это может привести к зависанию вашей системы при определенных обстоятельствах.
Magento построен на Zend Framework 1, который имеет свой собственный менеджер памяти. документация
говорит, что вы можете установить ограничение памяти следующим образом:
$memoryManager->setMemoryLimit(-1);
Это не должно быть -1, это может быть 1 073 741 824 или любое целое число в байтах.
Я не пробовал это все же.
Пожалуйста, следуйте следующему шагу.
1 измените следующее в .htaccess по вашему требованию
php_value memory_limit 256M => php_value memory_limit 2048M
php indexer.php —reindex catalog_product_price
Существует необходимость в увеличении лимита памяти через .htaccess, потому что вы можете увидеть в abstract.php, что он будет ссылаться на конфигурацию .htaccess.
Дайте мне знать, если у вас есть еще какие-либо вопросы
Спасибо