PHP не хватает памяти на 200 МБ в CLI, но хорошо в браузере - PullRequest
0 голосов
/ 18 марта 2019

Недостаточно памяти при использовании командной строки при входе в систему через SSH от имени пользователя mike.

Когда я запускаю скрипт через браузер или через командную строку как root, все хорошои останавливается на 1000M, как и ожидалось.

Используемый мной тестовый скрипт:

<code><pre>
<?php 
echo //phpinfo();
error_reporting(E_ALL);
ini_set('display_errors', 'on');

for ($i=1; $i<1500; $i+=50) {
  $a = loadmem($i);
  echo "You have allocated ". $i . "M (". memory_get_usage() . ") memory in this php script" . "<br />";
  unset($a);
}

function loadmem($howmuchmeg) {
  $a = str_repeat("0", $howmuchmeg * 1024 * 1024); // alocating 10 chars times million chars  
  return $a;
}
?>

Когда я запускаю как пользователь mike, ошибки скрипта находятся на отметке 200M.

Я использую php-fpm и пробовал оба PHP 5.6 и 7.2 и пробовал обе memory_limit настройки как 1000M.

Когда я запускаю это как mike:

php -i | grep memory_limit

, я получаю:

memory_limit => 1000M => 1000M

Я не могу на всю жизнь понять, откуда он получает этот предел в 200 МБ.

Есть ли какая-то причина, по которой учетная запись пользователя будет ограничивать использование памяти из-за root?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Это может быть проблема с правами доступа к файлу php.ini.

Если вы обнаружите, что ограничения памяти у пользователя root и у других пользователей при запуске сценариев PHP из командной строки, могут бытьпроблема с вашим php.ini или вашим скриптом.Чтобы убедиться, что это не ваш скрипт, попробуйте следующее:

$ echo "<? var_dump(ini_get('memory_limit')); ?>" >> memtest.php
$ php -f memtest.php
string(3) "8M"
$ su -
# php -f memtest.php
string(3) "64M"

Если вы получаете одинаковые два значения от обоих пользователей, возможно, проблема в вашем скрипте.Убедитесь, что в вашем скрипте нет функций ini_set (), которые переопределяют файл php.ini.

Однако, если вы получаете результаты, подобные приведенным выше, проверьте разрешения в /etc/php.ini:

# ls -al /etc/php.ini
-rw-------  1 root root 27 Jun  6 18:39 /etc/php.ini

Как видите, php.ini доступен для чтения только пользователю root, что не позволяет парсеру командной строки PHP получить доступ к вашей пользовательской директиве memory_limit в php.ini.Общее значение по умолчанию для PHP - 8M, если в другом месте ничего не указано, и поэтому обычные пользователи не могут получить более высокий предел памяти, установленный в вашем файле php.ini.

Просто установите разрешения для файла на644, и вы должны быть настроены на:

# chmod 644 /etc/php.ini
# ls -al /etc/php.ini
-rw-r--r--  1 root root 45022 Jun  6 23:00 /etc/php.ini

Источник: https://major.io/2007/06/14/php-cli-memory-limit-is-different-between-users-and-root/

Поскольку вы работаете с Apache (я думаю), чем, возможно, этот пользователь не может получить доступфайл php.ini.Также обратите внимание, что для cli и для apache (запуска скрипта) есть два разных ini-файла.Также некоторые дистрибутивы разделяют INI-файлы, в этом случае будет применен последний набор переменных (если одно и то же значение было установлено в нескольких загружаемых файлах).

0 голосов
/ 18 марта 2019

Файлы ini , используемые для вашего сервера (браузера) и cli, различаются.Вы можете указать файл конфигурации, используя -c, или получить расположение файла конфигурации cli в php,
$ php -i |grep php\.ini

.
...