Un unico process php-fastcgi blocca tutte le altre richieste PHP

Recentemente ho cambiato l'installazione di FastCGI per PHP (Apache2-worker e mod_fcgid ). Tuttavia, quando un singolo script PHP è molto occupato, sembra bloccare tutte le altre richieste PHP. Cosa sarebbe sbagliato con la mia configuration?

Il mio motivo principale per utilizzare mod_fcgid è mantenere sotto controllo l'utilizzo della memory PHP. Con mod_php , tutte le forcelle Apache individuali crescono in memory dopo aver servito PHP.

  • cosa significa "***" quando traceroute
  • E-mail a sms usando modem gsm
  • Come rimuovere una directory non vuota che non è di properties; dell'utente in Linux?
  • Come parallelizzare il for loop mentre scp i file?
  • get le statistiche del server da un momento specifico
  • Che cosa può causare l'errore del kernel out_of_memory?
  • Ho anche commutato al model apache2-worker, in quanto esiste fuori tutto il codice PHP a filo-pericoloso al di fuori di Apache.

    Il mio script FastCGI sembra:

     #!/bin/sh #export PHPRC=/etc/php/fastcgi/ export PHP_FCGI_CHILDREN=5 export PHP_FCGI_MAX_REQUESTS=5000 global_root=/srv/www/vhosts.d/ exec /usr/bin/php-cgi5 \ -d open_basedir=$global_root:/tmp:/usr/share/php5:/var/lib/php5 \ -d disable_functions="exec,shell_exec,system" 

    Il mio Apache config ha il seguente aspetto:

     <IfModule fcgid_module> FcgidIPCDir /var/lib/apache2/fcgid/ FcgidProcessTableFile /var/lib/apache2/fcgid/shm FcgidMaxProcessesPerClass 1 FcgidInitialEnv RAILS_ENV production FcgidIOTimeout 600 AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 MaxRequestLen 16777216 <FilesMatch "\.php$"> AddHandler fcgid-script .php Options +ExecCGI FcgidWrapper /srv/www/cgi-bin/php5-wrapper.sh .php </FilesMatch> DirectoryIndex index.php </IfModule> 

  • Limitare Apache log su Mac OS X 10.6
  • Strategia di logging di Apache sul server web occupato: scrivere contestazioni?
  • Problemi di certificato con l'accesso LDAPS Apache
  • ServerName non funziona in Apache2 e Ubuntu
  • Come posso aggiungere x-forwarded-for nel file di registro degli errori Apache?
  • Domini multipli (tra cui www- "sottodominio") su apache?
  • 2 Solutions collect form web for “Un unico process php-fastcgi blocca tutte le altre richieste PHP”

    Trovato la risposta all'indirizzo: https://stackoverflow.com/questions/598444/how-to-share-apc-cache-between-several-php-processes-when-running-under-fastcgi/1094068#1094068

    Il problema non è PHP, ma mod_fcgid. Mentre PHP crea più figli, mod_fcgid è ignorante e servirà una richiesta per figlio. Di conseguenza, quando viene utilizzato FcgidMaxProcessesPerClass 1 , tutte le esecuzioni PHP vengono eseguite l'una dopo l'altra. *

    La soluzione presentata in cui i collegamenti a: http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ spiega come utilizzare mod_fastcgi che non ha questa limitazione. Invia più richieste allo stesso figlio.

    [*] Si noti che non utilizzare FcgidMaxProcessesPerClass 1 in molteplici istanze separate di PHP, ruby, ecc., Mentre sono tutti in grado di elaborare molte richieste internamente in un unico process.


    Quindi una nuova configuration Apache per utilizzare PHP con fastcgi:

     <IfModule mod_fastcgi.c> # Needed for for suEXEC: FastCgiWrapper On FastCgiConfig -idle-timeout 20 -maxClassProcesses 1 -initial-env RAILS_ENV=production FastCgiIpcDir /var/lib/apache2/fastcgi AddHandler php5-fcgi .php Action php5-fcgi /.fcgi-bin/php5-wrapper.sh DirectoryIndex index.php ScriptAlias /.fcgi-bin/ /srv/www/cgi-bin/ <Location "/.fcgi-bin/php5-wrapper.sh"> Order Deny,Allow Deny from All #Allow from all Allow from env=REDIRECT_STATUS Options ExecCGI SetHandler fastcgi-script </Location> # Startup PHP directly FastCgiServer /srv/www/cgi-bin/php5-wrapper.sh # Support dynamic startup AddHandler fastcgi-script fcg fcgi fpl </IfModule> 

    Innanzitutto, il tuo script di wrapper e l'installazione sono semplicemente piani errati, a less che i documenti di Apache non siano aggiornati. Leggere le "Considerazioni speciali PHP" nei mod_fcgid docs e utilizzare le impostazioni di script e di esempio. La tua configuration corrente genera in primis un mucchio di processi infantili inutilizzabili, quindi each richiesta di 5001st PHP verrà errata poiché PHP uscirà dopo la richiesta 5000, ma manca la direttiva FcgidMaxRequestsPerProcess 5000 che dice a mod_fcgid che avrà bisogno di avviare un nuovo Processo PHP dopo 5000 richieste.

    Per quanto riguarda i processi PHP simultanei, each richiesta simultanea richiede il proprio process PHP, per cui è necessario aumentare la vostra direttiva FcgidMaxProcessesPerClass su un numero maggiore.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.