magento — запустить PHP скрипт из cli: php.ini memory_size, не учитывается

Я пытаюсь запустить скрипт 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();
?>

Все еще получаю ту же ошибку.

3

Решение

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 или конфигурация виртуального хоста.

6

Другие решения

В системах 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 для этой конкретной версии также должен быть установлен.

1

Установка 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 или любое целое число в байтах.
Я не пробовал это все же.

0

Пожалуйста, следуйте следующему шагу.

1 измените следующее в .htaccess по вашему требованию
php_value memory_limit 256M => php_value memory_limit 2048M

  1. Вместо того, чтобы переиндексировать все в одном, делайте переиндексацию один за другим, как

php indexer.php —reindex catalog_product_price

Существует необходимость в увеличении лимита памяти через .htaccess, потому что вы можете увидеть в abstract.php, что он будет ссылаться на конфигурацию .htaccess.

Дайте мне знать, если у вас есть еще какие-либо вопросы

Спасибо

0
По вопросам рекламы [email protected]