PHP Worker Limits and Process Management

osCommerce's legacy architecture relies heavily on PHP's synchronous request handling model. Each incoming request spawns a PHP worker process, which remains active until the page finishes rendering. On shared hosting environments, these workers compete with other accounts for limited PHP-FPM or mod_php slots, often leading to worker exhaustion.

To diagnose PHP worker exhaustion, check the server's error logs:

tail -n 100 /home/user/logs/error_log | grep 'MaxChildren'

If you see frequent 'MaxChildren reached' errors, implement these optimizations:

  1. Enable LiteSpeed's built-in caching via .htaccess:
    <IfModule LiteSpeed>
    CacheEnable public
    CacheLookup public on
    </IfModule>
  2. Reduce PHP's memory_limit in DirectAdmin or cPanel to 128M (osCommerce rarely requires more):
    ini_set('memory_limit', '128M');
  3. Optimize PHP-FPM settings via .htaccess:
    <FilesMatch ".+\\.php$">
    SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>

Database Performance and Query Optimization

osCommerce's database schema, especially in legacy versions, suffers from inefficient query patterns and lack of proper indexing. Common bottlenecks include:

  • Unoptimized product catalog queries
  • Excessive JOIN operations on order history
  • Missing indexes on frequently searched columns

To analyze slow queries, enable MySQL's slow query log:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

Key optimizations include:

  1. Add indexes to frequently searched columns:
    ALTER TABLE products_description ADD INDEX idx_products_name (products_name);
  2. Optimize the product catalog query:
    SELECT SQL_NO_CACHE p.products_id, pd.products_name
    FROM products p
    INNER JOIN products_description pd ON p.products_id = pd.products_id
    WHERE pd.language_id = 1
    LIMIT 100;
  3. Enable MySQL query cache:
    SET GLOBAL query_cache_size = 67108864;

File System and I/O Performance

osCommerce's file-based caching and session storage can create significant I/O pressure on shared hosting environments. Symptoms include:

  • High disk wait times in server monitoring
  • Slow page loads despite low CPU usage
  • Excessive inode usage

Optimization steps:

  1. Move sessions to Redis:
    ini_set('session.save_handler', 'redis');
    ini_set('session.save_path', 'tcp://localhost:6379');
  2. Enable LiteSpeed's cache for static assets:
    <IfModule LiteSpeed>
    RewriteCond %{REQUEST_URI} !\.(css|js|jpg|png|gif)$ [NC]
    RewriteRule .* - [E=Cache-Control:max-age=86400]
    </IfModule>
  3. Monitor inode usage:
    df -i /home/user/public_html

When to Consider Upgrading Hosting

After implementing these optimizations, monitor performance metrics for at least 72 hours. Consider upgrading to a VPS or Cloud plan if:

  • PHP worker exhaustion persists despite caching
  • Database queries consistently exceed 1 second execution time
  • Disk I/O wait times remain above 20%

For detailed guidance on migrating osCommerce to a Cloud environment, refer to our AbanteCart database optimization guide, as many principles apply to both platforms.