Avatar ·

Как узнать, какой php.ini использует командная строка PHP?

Всем привет! Я начинающий PHP-разработчик, работаю на Windows, использую EasyPHP. У меня возникла странная ситуация: когда я запускаю скрипты через браузер (Apache), всё работает отлично, но когда я пытаюсь запустить тот же скрипт из командной строки (cmd), поведение отличается. Например, я включил расширение `openssl` в php.ini через панель EasyPHP — в браузере оно работает, а в консоли пишет "Fatal error: Uncaught Error: Call to undefined function openssl_encrypt()". Я проверил phpinfo() через веб — там openssl есть. А через `php -m` в командной строке этого расширения нет. Я понял, что, скорее всего, командная строка использует другой php.ini. Но как мне найти, какой именно файл конфигурации загружается при вызове `php` из консоли? У меня установлено несколько версий PHP (через EasyPHP и отдельно), и я путаюсь. Можете подсказать надёжный способ найти путь к php.ini для CLI? И как сделать так, чтобы CLI использовал тот же конфиг, что и веб-сервер? Пробовал гуглить, но советы вроде "скопируй файл" не помогают, потому что я не знаю, какой именно файл копировать. Заранее спасибо! Пример моего тестового скрипта: ```php >>

Как точно определить, какой php.ini использует командная строка

Проблема, с которой вы столкнулись, очень распространена среди разработчиков, особенно на Windows. Дело в том, что PHP, запущенный через веб-сервер (Apache, Nginx) и через командную строку (CLI — Command Line Interface) — это фактически два разных "экземпляра" PHP, каждый из которых может читать свой собственный конфигурационный файл. EasyPHP часто настраивает свой внутренний PHP для веба, но при этом в системе может быть установлен другой PHP, который подхватывается из PATH.

Вот несколько проверенных способов найти правильный php.ini для CLI:

Способ 1: Использование встроенной команды PHP (самый надёжный)

Запустите в командной строке следующую команду:

php --ini

Вы увидите вывод, похожий на этот:

Configuration File (php.ini) Path: C:\Windows
Loaded Configuration File:         C:\php-8.1.0\php.ini
Scan for additional .ini files in: C:\php-8.1.0\ext
Additional .ini files parsed:      (none)

Строка "Loaded Configuration File" — это и есть путь к тому самому php.ini, который сейчас использует ваша командная строка. Если там написано "(none)", значит PHP не нашёл ни одного php.ini и использует значения по умолчанию.

Способ 2: phpinfo() в командной строке

Вы уже пробовали этот метод, но давайте сделаем его более точным. Создайте файл info.php с одной строкой:

<?php phpinfo();

Затем выполните в консоли:

php info.php | findstr /I "php.ini"

На Linux/macOS используйте grep:

php info.php | grep -i "php.ini"

Вы увидите строку "Loaded Configuration File" с полным путём.

Способ 3: Проверка через переменную PHP_SELF (для продвинутых)

Можно выполнить однострочный скрипт прямо в консоли:

php -r "echo php_ini_loaded_file();"

Эта функция возвращает путь к загруженному конфигурационному файлу или false, если файл не найден.

Почему CLI и веб используют разные php.ini?

Это нормальное поведение. Обычно это происходит по нескольким причинам:

  • Разные бинарники PHP: EasyPHP хранит свой PHP в папке C:\Program Files\EasyPHP\binaries\php\, а в системной переменной PATH прописан другой PHP, например, из C:\php\.
  • Разные параметры компиляции: CLI-версия может быть собрана без поддержки некоторых расширений (хотя это редкость).
  • Разные директории поиска: PHP ищет php.ini в разных местах. По умолчанию он проверяет: текущую директорию, директорию с php.exe, системную директорию Windows, а также путь, указанный в переменной окружения PHPRC.

Как заставить CLI использовать тот же php.ini, что и веб-сервер?

Вот пошаговая инструкция:

  1. Сначала найдите путь к php.ini, который используется веб-сервером (через phpinfo() в браузере).
  2. Откройте командную строку и выполните php --ini, чтобы узнать, какой файл загружается сейчас.
  3. Скопируйте путь из п.1 и установите переменную окружения PHPRC:
    set PHPRC="C:\Program Files\EasyPHP\binaries\php\php81\php.ini"
    Чтобы это работало постоянно, добавьте эту переменную в системные переменные через "Свойства системы" -> "Дополнительно" -> "Переменные среды".
  4. Либо просто скопируйте нужный php.ini поверх того, что использует CLI (но это менее гибкий способ).
  5. Перезапустите командную строку и проверьте результат командой php --ini.

Также рекомендую проверить, какой именно PHP вызывается из командной строки:

where php

Эта команда покажет полный путь к исполняемому файлу. Если это не тот PHP, что вам нужен, измените порядок путей в переменной PATH.

<<>>

Альтернативный подход: Использование php -c для принудительного указания конфига

Если вам не нужно менять глобальные настройки, а требуется лишь временно запустить скрипт с определённым php.ini, используйте флаг -c (или --php-ini):

php -c "C:\Program Files\EasyPHP\binaries\php\php81\php.ini" test.php

Этот способ полезен для тестирования, когда вы хотите убедиться, что проблема именно в конфигурации, а не в чём-то ещё. Вы также можете указать директорию, а не конкретный файл — PHP будет искать php.ini в этой папке:

php -c "C:\Program Files\EasyPHP\binaries\php\php81" test.php

Проверка всех возможных мест поиска php.ini

Иногда полезно понять, где PHP вообще ищет конфигурацию. Запустите:

php -i | findstr /I "Scan this dir"

Вы увидите список директорий, которые PHP сканирует в поисках дополнительных ini-файлов. В EasyPHP часто используется механизм дополнительных конфигов (например, для включения расширений). Проверьте, нет ли там конфликта — возможно, в одном из дополнительных файлов расширение openssl отключено.

Также рекомендую проверить саму команду php -m (список загруженных модулей) с явным указанием конфига:

php -c "путь_к_вашему_php.ini" -m

Сравните вывод с тем, что показывает веб-версия. Если модуль появляется — проблема решена простым копированием конфига или настройкой PATH.