499

I need to enable pdo_mysql in my EasyPHP environment, so I went to the php.ini file and uncommented the following line:

extension=php_pdo_mysql.dll

Unfortunately I still have the same problem. I'm using the CLI so I suppose I need to locate the php.ini file used by the CLI. How can I find it?

4
  • Also see stackoverflow.com/q/8684609/632951 Commented Aug 11, 2015 at 17:06
  • @sjas It is not the wrong, it is correct and let you know the path of the loaded php.ini in the cli. Commented Feb 24, 2016 at 20:22
  • EasyPHP (probably) implies Windows. Perhaps tag it as such? Commented Aug 8, 2021 at 14:31
  • Some context: "The root cause of the problem is that in EasyPHP 5.3 there isn't any php.ini file in the php folder. Commented Aug 8, 2021 at 14:46

15 Answers 15

1133

Just run php --ini and look for Loaded Configuration File in the output for the location of php.ini used by your CLI.

Sign up to request clarification or add additional context in comments.

15 Comments

@BradFJacobs why use grep when this is now cross-platform?
@AntonyD'Andrea: which is exactly what the question is about. See? It does state so even in the title: How to find the php.ini file used by the command line?
@NineCattoRules if your cli php uses Apache's php.ini something is wrong with your setup
@Mchl: I have shamelessly edited your answer to include the informative not to look for Loaded Configuration File in output :)
@Fr0zenFyr: thank you. It's been so long time ago sine I worked with PHP I don't even recall if the output from php --ini was always this way, or it has changed since my answer.
|
408

You can get a full phpinfo() using:

php -i

And, in there, there is the php.ini file used:

$ php -i | grep 'Configuration File'
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

On Windows, use find instead:

php -i | find/i"configuration file"

15 Comments

Then this php instance used no php.ini at all but the default values. The Configuration File line of phpinfo() shows the last place where php looked for an ini file. That can either be the place where it found such a file or the last option which happens to be %SYSTEMROOT% on windows.
@pascal: php -i | find "Configuration file" should work on Windows. Definitely not as powerful as grep, but find will do basic string searching for you. Of course, if php -i dumps its output to stderr, you're probably SOL.
find is case-sensitive by default, so it has to be perfect (php -i | find "Configuration File") or made case-insensitive (php -i | find /i "Configuration file" - note the /i flag).
Consider adding php --ini as an alternative; available since PHP 5.2.3 :)
Nobody mentioned, that it's possible to take that value from script by calling php_ini_loaded_file and when needed php_ini_scanned_files
|
21

You can use get_cfg_var('cfg_file_path') for that:

To check whether the system is using a configuration file, try retrieving the value of the cfg_file_path configuration setting. If this is available, a configuration file is being used.
Unlike phpinfo() it will tell if it didn't find/use a php.ini at all.
var_dump( get_cfg_var('cfg_file_path') );

And you can simply set the location of the php.ini. You're using the command line version, so using the -c parameter you can specify the location for this particular run, e.g.

php -c /home/me/php.ini -f /home/me/test.php

1 Comment

Is it a permanent change or not? Can you be explicit about this in your answer?
20

Run php --ini in your terminal, and you'll get all details about ini files:

Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/apc.ini,
/etc/php.d/bcmath.ini,
/etc/php.d/curl.ini,
/etc/php.d/dba.ini,
/etc/php.d/dom.ini,
/etc/php.d/fileinfo.ini,
/etc/php.d/gd.ini,
/etc/php.d/imap.ini,
/etc/php.d/json.ini,
/etc/php.d/mbstring.ini,
/etc/php.d/memcache.ini,
/etc/php.d/mysql.ini,
/etc/php.d/mysqli.ini,
/etc/php.d/pdo.ini,
/etc/php.d/pdo_mysql.ini,
/etc/php.d/pdo_sqlite.ini,
/etc/php.d/phar.ini,
/etc/php.d/posix.ini,
/etc/php.d/sqlite3.ini,
/etc/php.d/ssh2.ini,
/etc/php.d/sysvmsg.ini,
/etc/php.d/sysvsem.ini,
/etc/php.d/sysvshm.ini,
/etc/php.d/wddx.ini,
/etc/php.d/xmlreader.ini,
/etc/php.d/xmlwriter.ini,
/etc/php.d/xsl.ini,
/etc/php.d/zip.ini

For more, use helping command php --help. It'll display all the possible options.

Comments

11

Sometimes things aren't always as they seem when in comes to configuration files in general. So here I'm applying my usual methods for exploring what files are opened by a process.

I use a very powerful and useful command-line program called strace to show me what's really going on behind my back!

$ strace -o strace.log php --version
$ grep php.ini strace.log

Strace digs out kernel (system) calls that your program makes and dumps the output into the file specified by -o.

It's easy to use grep to search for occurrences of file php.ini in this log. It's pretty obvious looking at the following typical response to see what is going on.

open("/usr/bin/php.ini", O_RDONLY)      = -1 ENOENT (No such file or directory)
open("/etc/php.ini", O_RDONLY)          = 3
lstat("/etc/php.ini", {st_mode=S_IFREG|0644, st_size=69105, ...}) = 0

1 Comment

php -i gave me incorrect results, but this one is perfectly fine. Thank you!
8

If you want all the configuration files loaded, this is will tell you:

php -i | grep "\.ini"

Some systems load things from more than one ini file. On my Ubuntu system, it looks like this:

php -i | grep "\.ini"

Output

Configuration File (php.ini) Path => /etc/php5/cli
Loaded Configuration File => /etc/php5/cli/php.ini
Scan this dir for additional .ini files => /etc/php5/cli/conf.d
additional .ini files parsed => /etc/php5/cli/conf.d/apc.ini,
/etc/php5/cli/conf.d/curl.ini,
/etc/php5/cli/conf.d/gd.ini,
/etc/php5/cli/conf.d/mcrypt.ini,
/etc/php5/cli/conf.d/memcache.ini,
/etc/php5/cli/conf.d/mysql.ini,
/etc/php5/cli/conf.d/mysqli.ini,
/etc/php5/cli/conf.d/pdo.ini,
/etc/php5/cli/conf.d/pdo_mysql.ini

Comments

7

If you need to pass it to another app, you can do something like:

php --ini | grep Loaded | cut -d" " -f12

returns the path only. php -c $(php --ini | grep Loaded | cut -d" " -f12) will pass in the config file (useful for fpm)

Comments

7

On OS X v10.9 (Mavericks), running:

$ php -i | grep 'Configuration File'

Returned:

Configuration File (php.ini) Path => /etc
Loaded Configuration File:         (none)

In the /etc/ directory was:

php.ini.default

(as well as php-fpm.conf.default)

I was able to copy php.ini.default to php.ini, add date.timezone = "US/Central" to the top (right below [php]), and the problem is solved.

(At least the error message is gone.)

1 Comment

Indeed, macOS (and OSX before it) never ships a php.ini file and relies on the PHP developers to have made sensible default choices (which is usually the case). But if you need to change any setting, you have to do exactly what you've described. This actually saves a lot of time, since most users will never need to 'fix' their php.ini files...
6

The easiest way nowadays is to use PHP configure:

php-config --ini-dir

Output:

/usr/local/etc/php/7.4/conf.d

There's more you can find there. The --help sub command (macOS local install):

php-config --help

Output:

Usage: /usr/local/bin/php-config [OPTION]
Options:
  --prefixUsage: /usr/local/bin/php-config [OPTION]
Options:
  --prefix            [/usr/local/Cellar/php/7.4.11]
  --includes          [-I/usr/local/Cellar/php/7.4.11/include/php - …ETC…]
  --ldflags           [ -L/usr/local/Cellar/krb5/1.18.2/lib -…ETC…]
  --libs              [ -ltidy -largon2 …ETC… ]
  --extension-dir     [/usr/local/Cellar/php/7.4.11/pecl/20190902]
  --include-dir       [/usr/local/Cellar/php/7.4.11/include/php]
  --man-dir           [/usr/local/Cellar/php/7.4.11/share/man]
  --php-binary        [/usr/local/Cellar/php/7.4.11/bin/php]
  --php-sapis         [ apache2handler cli fpm phpdbg cgi]
  --ini-path          [/usr/local/etc/php/7.4]
  --ini-dir           [/usr/local/etc/php/7.4/conf.d]
  --configure-options [--prefix=/usr/local/Cellar/php/7.4.11 --…ETC…]
  --version           [7.4.11]
  --vernum            [70411]

2 Comments

Does that work for EasyPHP? It is Windows-specific.
@PeterMortensen I have no idea what EasyPHP is. The php-config command is distro and PHP version specific.+
5

Since PHP uses different php.ini paths for HTTP(S) and CLI (console command line) mode, easiest way is to find out really loaded php.ini file is by saving phpinfo() output into local file:

php -i >> phpinfo-cli.txt

Open saved file & find row Loaded Configuration File. It will contain path to actually loaded php.ini file e.g.:

Loaded Configuration File => D:\wamp\bin\php\php7.4.1\php.ini

The above assumes that PHP is properly installed, e.g. on Windows included in PATH env. variable.

2 Comments

How does that answer the question? Can you elaborate? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).
@PeterMortensen Sorry, I thought it was obvious. Answer updated.
4

Try this if it could help you all:

find / -type f -name "php.ini" 

This will output all files named php.ini.

Find out which one you're using, usually apache2/php.ini

2 Comments

This does not work if there is no php.ini file (some docker containers). Therefor the accepted answer is better suited.
No. apache2/php.ini is usually not used by CLI
3

From what I remember when I used to use EasyPHP, the php.ini file is either in C:\Windows\ or C:\Windows\System32

1 Comment

Right it's telling me C:\WINDOWS. But I didn't find it there seriously!
3

On Linux it is usually under /usr/bin/php

To find php.ini loaded in CLI on widows, run:

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

enter image description here

Ps. You can localize PHP installation folder with:

which php

enter image description here

or

whereis php

/c/laragon/bin/php/php-7.4.19-Win32-vc15-x64/php

Comments

1

In a Docker container, "phpmyadmin/phpmyadmin". there isn't any php.ini file. But there are two files: php.ini-debug and php.ini-production.

To solve the problem, simply rename one of the files to php.ini and restart the Docker container.

1 Comment

Do you have a reference for that Docker container/image, "phpmyadmin/phpmyadmin"?
-1

php -r 'var_dump(get_cfg_var("cfg_file_path"));'

Use PHP!

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.