You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一PHP项目多实例错误调用错误目录类文件问题求助

Alright, let's tackle this multi-vhost class loading mix-up—this is a common gotcha when running identical PHP projects across separate Apache vhosts with PHP-FPM. I’ve debugged similar issues before, so here’s a step-by-step breakdown of the fixes you need to implement:

1. Isolate PHP-FPM Process Pools (Critical First Step)

The biggest culprit here is usually shared PHP-FPM processes caching file paths from other vhosts. You need to create a dedicated FPM pool for each country-specific instance to prevent cross-contamination:

  • Create pool configs: In /etc/php-fpm.d/, make a separate .conf file for each vhost (e.g., website_co_uk.conf, website_co_nz.conf). Here’s a template for one:
    [website_co_uk]
    user = www-data
    group = www-data
    listen = /run/php-fpm/website_co_uk.sock
    listen.owner = www-data
    listen.group = www-data
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 2
    pm.min_spare_servers = 1
    pm.max_spare_servers = 3
    # Lock this pool to its own directory (prevents cross-path access entirely)
    php_admin_value[open_basedir] = /var/www/website.co.uk/:/tmp/
    
  • Update Apache vhosts: For each vhost, point the PHP handler to its corresponding FPM socket:
    <VirtualHost *:80>
        ServerName website.co.uk
        DocumentRoot /var/www/website.co.uk/public_html
    
        <Directory /var/www/website.co.uk/public_html>
            AllowOverride All
            Require all granted
        </Directory>
    
        <FilesMatch \.php$>
            SetHandler "proxy:unix:/run/php-fpm/website_co_uk.sock|fcgi://localhost/"
        </FilesMatch>
    </VirtualHost>
    
  • Restart services: Run systemctl restart php-fpm and systemctl restart apache2 to apply changes.

2. Isolate Composer Autoloader Caches

Since you’re using PSR-0 with an empty autoload_classmap.php, Composer is dynamically resolving class paths—and if caches are shared or overlapping, it’ll pull classes from the wrong directory. Fix this by forcing per-instance caching:

  • Add a dedicated cache directory: In each project’s public_html/index.php, initialize the autoloader with a unique cache path for the instance:
    $loader = require __DIR__ . '/vendor/autoload.php';
    // Use a directory unique to this vhost (create it first and set proper permissions)
    $loader->setCacheDir(__DIR__ . '/../var/cache/composer');
    
  • Regenerate autoload files: For each instance, run this command in the project root to ensure the autoloader maps are fresh and instance-specific:
    composer dump-autoload --optimize
    
    The --optimize flag will generate a concrete class map (populating autoload_classmap.php), reducing dynamic path lookups and eliminating ambiguity.

3. Fix OPcache Isolation (If Enabled)

OPcache can cache class files across FPM processes if not configured properly. Make sure each pool has its own OPcache cache:

  • Add OPcache settings to each FPM pool: Edit each pool’s .conf file to include:
    php_admin_value[opcache.file_cache] = /var/www/website.co.uk/var/cache/opcache
    php_admin_value[opcache.validate_timestamps] = 1
    php_admin_value[opcache.revalidate_freq] = 2
    
    This ensures each instance’s cached classes are stored separately, and OPcache will refresh when files change.

4. Verify Directory Permissions & DocumentRoot

Double-check that each vhost’s DocumentRoot is correctly set to /var/www/[country-domain]/public_html, and that all project directories are owned by the Apache/PHP-FPM user (e.g., www-data):

chown -R www-data:www-data /var/www/website.co.uk/
chmod -R 755 /var/www/website.co.uk/

This prevents permission-related fallback to unexpected directories.

Quick Recap

Start with FPM pool isolation + open_basedir—this is the most effective way to block cross-path access entirely. Then handle Composer and OPcache caches to eliminate any residual caching issues. These steps should resolve the wrong-class-directory problem for good.

内容的提问来源于stack exchange,提问作者Adam Copley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:29:19