I have two websites with two codebases, yet when I change one codebase, I see the change in both.
I have two checkouts of the same website. They are set up to use PHP-FPM through Apache2 with FastCGI. The checkouts are in:
/var/www/site1
/var/www/site2
The Apache configs look like this:
<VirtualHost *:80>
ServerName site1.myserver.com
DocumentRoot /var/www/site1
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site1-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
<VirtualHost *:80>
ServerName site2.myserver.com
DocumentRoot /var/www/site2
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi-handler .php
Action php5-fcgi-handler /php5-fcgi-uri
Alias /php5-fcgi-uri fcgi-application
FastCgiExternalServer fcgi-application -socket /var/run/site2-fpm.sock -pass-header Authorization -idle-timeout 30000 -flush
</IfModule>
</VirtualHost>
The FPM pool configs look like these:
[site1]
user = site1-user
group = site1-group
listen = /var/run/site1-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited
[site2]
user = site2-user
group = site2-group
listen = /var/run/site2-fpm.sock
listen.owner = www-data
listen.group = www-data
chdir = /
pm = ondemand
pm.max_children = 5
pm.max_requests = 500 ;default to unlimited
I am not using the chroot feature of FPM (as far as I can tell).
When I change the code for site1 and restart PHP-FPM and visit site1 and site2 then I see the change on both sites.
If I restart PHP-FPM and visit site2 first (the unchanged site), followed by site1 then I don't see the change on either site.
What is wrong with my configs? I do see separate PHP-FPM processes running for site1 and site2 under the main FPM master.
When I've seen similar issues in our environments, it appears to have been because of the way that OpCache (by default) shares a single cache across all users on a shared hosting environment. A bug has been submitted (and you can, and should, go and vote to let the maintainers know how important this might be for your use case) though no commitment has been made on delivering a fix.
TL;DR : By default when OpCache is enabled, the cache that is used to store compiled byte-code is shared across all users. In an environment where hosting is shared between multiple sites / users, this can result in a site grabbing the cached output of php scripts from another site or, if specific security settings are enabled even generating errors.
Although no fix has been officially released, if you're using cPanel, this wiki has a documented way of configuring the php-fpm pools to be created and secured on a per-user basis and if you follow the instructions below as well as the IMPORTANT NOTES at the bottom of this answer you should be able to get the functionality you desire without any errors
That post also documents how you might configure this by hand on a per-site/per-user basis (though I'd wager that might become tedious if you're hosting a lot of sites). If you're not using cPanel, you may need to modify the scripts to specify your individual paths and usernames instead of the variables being used by cPanel's config engine.
IMPORTANT NOTES
During testing and additional research I came across this article which provide a few clarifications that may be relevant to your specific situation:
opcache.use_cwd
parameter is set totrue
for your application's configuration of OpCache - it's set tofalse
by default and leaving it set to default will probably cause collisions if you're hosting more than one PHP application on your system:opcache.load_comments
andopcache.save_comments
directives are set totrue
. You should double-check this suggestion with your application / framework documentation as most have now updated their docs with specific instructions on enabling the use of OpCache properly for their systems:IMPORTANT NOTES
Hopefully this helped - and if you're using cPanel, drop a comment to let us know how you tackled that portion of the configuration!