Linux

單個 php-fastcgi 程序會阻止所有其他 PHP 請求

  • August 25, 2011

我最近切換到 PHP 的 FastCGI 設置(Apache2-worker 和mod_fcgid)。但是,當單個 PHP 腳本非常繁忙時,它似乎會阻止所有其他 PHP 請求。我的配置有什麼問題?

我使用的主要原因mod_fcgid是控制 PHP 記憶體使用。使用mod_php,所有單獨的 Apache 分支在服務 PHP 後都會在記憶體中增長。

我也切換到了 apache2-worker 模型,因為所有執行緒不安全的 PHP 程式碼都存在於 Apache 之外。

我的 FastCGI 腳本如下所示:

#!/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"

我的 Apache 配置如下所示:

<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>

在以下位置找到答案:https ://stackoverflow.com/questions/598444/how-to-share-apc-cache-between-several-php-processes-when-running-under-fastcgi/1094068#1094068

問題不是 PHP,而是 mod_fcgid。雖然 PHP 產生多個孩子,mod_fcgid但對它一無所知,並且將為每個孩子提供一個請求。因此,當FcgidMaxProcessesPerClass 1使用時,所有 PHP 的執行都發生在彼此之後。*

連結到:http ://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ 的解決方案解釋瞭如何使用mod_fastcgi沒有此限制的解決方案。它將向同一個孩子發送多個請求。

$$ * $$請注意,不要FcgidMaxProcessesPerClass 1在 PHP、ruby 等的許多單獨實例中使用結果。雖然它們都能夠在單個程序中在內部處理許多請求。


因此,一個新的 Apache 配置將 PHP 與 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>

引用自:https://serverfault.com/questions/303535