2014-02-21 8 views
14

Когда я запускаю команду с PHP, она показывает мне ошибку. Например, когда я бегу php -v, чтобы увидеть мою PHP-версию он показывает мне ошибку тогда сведения о PHP:Предупреждение PHP: уже загружен модуль 'mcrypt'

модуль «Mcrypt» уже загружен в Unknown в строке 0

[email protected]:~$ php -v 

PHP Warning: Module 'mcrypt' already loaded in Unknown on line 0 

PHP 5.4.25-1+sury.org~quantal+2 (cli) (built: Feb 12 2014 11:11:30) 
Copyright (c) 1997-2014 The PHP Group 
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies 

ответ

35

Ваш php.ini содержит две или более из этих линий:

extension=mcrypt.so 

Удалите все, кроме одного.

php.ini обычно проживает в /etc/php.ini или /etc/php5/php.ini. Иногда дополнительные ini-файлы включены, вы можете увидеть все из них:

$ php -i | grep .ini\$ 
Loaded Configuration File => /usr/local/etc/php.ini 
Additional .ini files parsed => /usr/local/etc/php/extensions.ini 
user_ini.filename => .user.ini => .user.ini 
+6

Большое спасибо, я удалил строку ** extension = mcrypt.so ** в **/etc/php5/mods-available/mcrypt.ini **, и ошибка исчезла сейчас. Thnx –

-10

Отключить отчет об ошибках в развитии, вы можете отключить его от index.php файла, как показано ниже.

case 'development': 
     error_reporting(-1); 
     ini_set('display_errors', 0); 
break; 
+8

«Я получаю ошибки! Помощь» ... «Хорошо, не проблема ... просто игнорируйте их, они ничего не значат». Как и этот особенно глупый ответ, почему бы вы никогда не отключать ошибки только в процессе разработки. Вы отстаиваете, что разработчики должны игнорировать ошибки во время разработки и ТОЛЬКО показывать их, когда ваша система пошла вживую. –

+1

Плохой совет, я согласен. Смешно, что 'error_reporting (-1)' на самом деле в основном эквивалентно 'error_reporting (E_ALL)'. Конечно, они все равно не будут отображаться с помощью 'display_errors = off'. Если вы действительно хотели отключить отчет об ошибках (почему !?), это будет 'error_reporting (0)'. – helmbert

1

Иногда это происходит с php-fpm, и самое смешное, консоль php не complans об этом, используя один и тот же набор .ini-файлов в то же время, доказывая, что mcrypt на самом деле нет ссылок дважды.

Как оказалось, php-fpm имеет набор встроенных модулей по умолчанию, которые он пытается загрузить, по крайней мере, на Linux (так как это не воспроизводится на FreeBSD). mcrypt находится в этом списке, поэтому, когда у пользователя есть дополнительный .ini-файл в каталоге /etc/php.d, mcrypt, кажется, загружается дважды.

Грубый обходной путь для этого, чтобы добавить -n переключатель в PHP-FPM на старте, скопируйте pnp.ini в php-fpm.ini, включают в себя все свои модули в результирующей php-fpm.iniкроме Mcrypt и добавить дополнительный переключатель указывая на правильный ini-файл, поэтому все добавление выглядит так: -n -c /etc/php-fpm.ini.

Этот способ работает php-fpm не будет жаловаться.

Я пишу это здесь, потому что это наиболее ссылочный пост в поисковых системах о проблеме mcrypt. Я понимаю, что исходный вопрос касался консоли php.

Обновление: Я использовал это обходное решение, но это противно. Некоторое время назад я точно понял, почему это произошло. Я расскажу еще несколько слов, чтобы описать это, но это может быть скучно, поскольку это будет описывать определенный тип сбоя. Итак, в моем случае эта проблема была вызвана тем фактом, что я использовал собственную сборку php, сделанную мной, а иногда добавлял mcrypt в список встроенных статических модулей. И затем Я добавил его снова как встроенный модуль, поэтому он загрузился дважды.Это происходит с пользовательской сборкой, когда mcrypt указан в списке модулей для скрипта configure и не указан как общий (эта часть спецификации может быть легко найдена, так как %configure \ упоминается только один раз в спецификации). В моем случае решение заключалось в том, чтобы полностью удалить mcrypt из части конфигурации и добавить его к этапам build-cgi и build-ztscli. Можно было спросить «Как насчет стадии fpm?» - и это хороший вопрос, но, оказывается, fpm sapi сам построен с минимальным количеством модулей и использует общий общий.

0

У меня была такая же проблема, и это было связано с созданием PHP из источника с опцией ./configure --with-mcrypt. Похоже, что если PHP построен с флагом --with-mcrypt, тогда нет необходимости указывать extension=mcrypt.so в php.ini. Это вызывает предупреждение, упомянутое выше.