How to Specify a Custom php.ini for a Website (Apache2 with mod_php)

This short article explains how to specify a custom php.ini for a website running on Apache2 with mod_php. That way, each website can have it's own php.ini instead of having to use the server's default one.

1 Preliminary Note

I'm using the website www.example.com here with the document root /var/www/web1/web here.

2 Getting Details About Your PHP Installation

We will now create a small PHP file (info.php) in the document root and call it in a browser. The file will display useful details about our PHP installation, such as the used php.ini file.

nano /var/www/web1/web/info.php
<?php
phpinfo();
?>

Now we call that file in a browser (e.g. http://www.example.com/info.php):

Apache php.ini file

As you see, the website is currently using the /etc/php/8.1/apache2/php.ini file.

3 Custom php.ini For a WebSite

I will copy the default php.ini (/etc/php/8.1/apache2/php.ini on Debian/Ubuntu; /etc/php.ini on Fedora/CentOS) to the /etc/php/web1/ directory and make www.example.com use the php.ini from the /etc/php/web1/ directory:

Debian/Ubuntu:

mkdir /etc/php/web1/
cp /etc/php/8.1/apache2/php.ini /etc/php/web1/

Fedora/CentOS:

mkdir /etc/php/web1/
cp /etc/php.ini /etc/php/web1/

(You can now modify /var/www/web1/php.ini to your liking.)

Then open the vhost configuration for the www.example.com website and add a PHPINIDir line to it:

<VirtualHost 1.2.3.4:80>
[...]
PHPINIDir /etc/php/web1
[...] </VirtualHost>

PHPINIDir must contain the directory where the php.ini file for the website is located.

Restart Apache afterward:

Debian/Ubuntu:

service apache2 restart

Fedora/CentOS:

service httpd restart

Now call the info.php file again in a browser (http://www.example.com/info.php):

using a custom php.ini path with Apache

The Configuration File (php.ini) Path line should now show the new php.ini.

Share this page:

Suggested articles

14 Comment(s)

Add comment

Comments

By: ahsiangsiang at: 2009-02-03 17:18:05

i use .htaccess to change certain php_value....

any comment about my method?

By: mhmd_1983 at: 2009-07-09 08:20:33

you can't change all values from htaccess , but it a simple way to change simple things , and i think using the php.ini itself decrease the load on apache

By: majo at: 2009-09-24 13:21:06

Hi,
This information is wrong. With Apache 2.2.10 + you can 't have INI for each virtual site. If specifiy in more than conf file you will get error that you can define PHPINIDIR only once and subsequent definitions will be ignored.

majo

By: Randy at: 2013-07-18 04:19:51

PHPINIDir can't be specified on a per host basis as this post says.  It's a global setting for all virtual hosts even if it's only declared in one virtual host file.  For me, the only reason I wanted separate php.ini files was to have a different include_path.  I was able to accomplish that by overrideing the include_path set in the php.ini file with a different one in the virtual site file.

 <VirtualHost *:8000>

     php_value include_path ".:/my/other/include/path"

    .... 

</VirtualHost> 

 


By: Carlo at: 2020-07-15 14:52:02

Perfect! That worked for me.

I managed to configure both PHPINIDir and include_path in my virtualhost.conf

Thank you

By: Vipul Batra at: 2012-07-13 09:14:45

You can use .htaccess to change certain php_values The syntax cab be: php_value setting_name setting_value php_value magic_quotes_gpc On

By: Anonymous at: 2009-10-12 19:34:12

My experience matches majo's. With my apache 2.2x, I could not set separate php.ini files for each site, even using httpd.conf.

However, it may be possible to set specific php variables on a per-site basis if you have access to httpd.conf.

I was able to set some php_value variables in .htaccess, but php_admin_value variables, such as "sendmail_path" must be set in httpd.conf. My only goal was to use separate msmtp accounts to send through Google Apps from different sites. 

 I did this by putting the following inside the root directory <Directory> tags for each site: 

 php_admin_value sendmail_path "/usr/bin/msmtp -C /path/to/msmtprc -t"

 For example: 

<Directory "/var/www/site1">

  php_admin_value sendmail_path "/usr/bin/msmtp -C /path/to/site1msmtprc -t"

</Directory> 

 <Directory "/var/www/site2">

 php_admin_value sendmail_path "/usr/bin/msmtp -C /path/to/site2msmtprc -t"

 </Directory>

In my case, I have separate conf files for each site, and I placed these strings inside each conf file between the <VirtualHost> tags. I am not sure if these commands would work outside of a virtual hosting situation, but it may be worth a try.  

 I know this is a bit off-topic, but I found this site looking for the information that I have written here; hopefully this may help someone else. 

By: Matt Flaherty at: 2013-05-03 09:51:22

In Apache 2.2 there is a directive called SetEnv that is available at the VIrtualHost level and seems to work like so:

 SetEnv PHPRC /path/to/ini

By: patrick at: 2013-10-22 15:50:47

Is this the reason that I can't seem to change my php settings?

 It's pointing to the file but not really doing anything with it.  Would explain a lot why I can't seem to fix the HTTP upload error in the back end of magento...

By: Paolo at: 2015-10-12 12:45:34

Ok, but I don't have a command shell access on server and I don't have the possibility to restart the server. All I have is the ftp access to public_html folder. Is it any way to increase some php value without to ask every time to the host company?

By: Kade at: 2017-06-25 20:29:27

Very helpful tutorial, thank you!

By: pankaj at: 2019-01-03 13:28:10

PHPINIDir not working

By: till at: 2019-01-03 13:36:34

This directive works fine, but you have to be aware that you can set it only for one website on a server.

By: Mauricio López at: 2019-03-18 03:24:19

Excellent article. It worked like a charm.

Regards.