Jim
Jim

Reputation: 851

What is the default path for PHP extensions in php.ini?

I'm getting back in to web development so have decided to re-install my Mac's dev environment from scratch with homebrew (I'm following the tutorial at https://getgrav.org/blog/macos-sierra-apache-multiple-php-versions which is probably the best tutorial on the subject that I've ever read).

Everything is going fine apart from using PECL to install extensions like APCU and Xdebug. I think I can get extensions working in a slightly hacky way, but I'd rather properly understand what's going on here.

My php.ini file is located at /usr/local/etc/php/7.1/php.ini. When PECL installs an extension, it seems to add a line to the top of php.ini immediately above the [PHP] line, e.g.:

1 zend_extension="xdebug.so"
2 extension="apcu.so"
3 [PHP]
4 
5 ;;;;;;;;;;;;;;;;;;;
6 ; About php.ini   ;
7 ;;;;;;;;;;;;;;;;;;;
8 ; PHP's initialization file, generally called php.ini, is responsible for
9 ; configuring many of the aspects of PHP's behavior.

The tutorial advises going to /usr/local/etc/php/7.1/conf.d/ and creating individual config files for each extension. i.e., lines 1 and 2 in php.ini would be deleted, and /usr/local/etc/php/7.1/conf.d/ext-apcu.ini and /usr/local/etc/php/7.1/conf.d/ext-xdebug.ini would be created, with config settings for each extension included in the relevant ext-xx.ini file.

Neither the default PECL approach of referencing the extension in php.ini nor the recommended approach of using an ext-xx.ini file for each extension seems to load the extensions successfully. I can hack round this by specifying a path to the extensions (/usr/local/lib/php/pecl/somedatestamp/extension.so), but I'd rather not have to. So:

  1. (I'm pretty sure the answer to this is "yes", but just to be sure): does the server just scan through the conf.d folder and try to load any extension.so that is described in every ext-extension.so file it finds?
  2. How do I set the equivalent of $PATH for my PHP configuration? phpinfo() refers to an extension_dir variable and gives the value as /usr/local/Cellar/[email protected]/7.1.20/lib/php/20160303, and there's an extension_dir variable set in php.ini but it's commented out. So where is PHP getting the value it's displaying through phpinfo(), and is it possible to specify multiple directories where PHP will look for extensions?

Upvotes: 5

Views: 16800

Answers (1)

Karim
Karim

Reputation: 2638

  1. Server doesn't scan for *.so files automatically, it loads extensions mentioned in php config files in extension=extension.so and zend_extension=extension.so configurations. To check all config files which are loaded during server start run the command php --ini, my example output is:
$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/7.1
Loaded Configuration File:         /usr/local/etc/php/7.1/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.1/conf.d
Additional .ini files parsed:      /usr/local/etc/php/7.1/conf.d/ext-opcache.ini,
/usr/local/etc/php/7.1/conf.d/ext-phalcon.ini,
/usr/local/etc/php/7.1/conf.d/ext-xdebug.ini,
/usr/local/etc/php/7.1/conf.d/php-memory-limits.ini

In you case it looks like you might have messed versions: your config file is located in /usr/local/etc/php/7.1/php.ini (version 7.1) but you are trying to put additional config files in /usr/local/etc/php/5.6/conf.d/ (version 5.6). Try to put them in /usr/local/etc/php/7.1/conf.d

  1. You should specify extension dir path in your php.ini, I have the value
extension_dir = "/usr/local/lib/php/pecl/20160303"

This value is valid for php version 7.1, timestamp 20160303 specifies PHP API version for the extensions. You can also check that PECL configuration for the extension dir has the same value as in php config using the command

pecl config-get ext_dir

After these steps you can check if extension is loaded with the command

php -m

It lists all the loaded php modules and extensions. If some extension is mentioned in config file but could not be loaded, you will get warning.

Upvotes: 11

Related Questions