2009-02-28 8 views
20

私は現在、Apache/mod_fastcgiの下でAPCを有効にしてPHP/FastCGIのコピーをいくつか実行しています。プロセス間でキャッシュを共有できますか?すでに共有されているかどうかを確認するにはどうすればよいですか? (私はapc.mmap_file_maskのini設定が関与するかもしれないと思うが、私はそれを使用する方法がわからない。)FastCGIで実行中の複数のPHPプロセス間でAPCキャッシュを共有するにはどうすればよいですか?

(によって報告されたように、私はそのは、現時点では共有されていないだと思う理由の一つは、そのapc.mmap_file_maskですapc.phpのWebインターフェイスは、リロード時に約3つの異なる値の間を反転します)。

答えて

20

APCはではありませんは現在、fastcgiまたはfcgidで動作する複数のphp-cgiワーカー間でキャッシュを共有しています。詳細については、this feature requestを参照してください。「この動作は現在のものです。

回避策の1つは、PHPが独自のワーカーを管理できるようにすることです。これは、ラッパースクリプト内のPHP_FCGI_CHILDREN環境変数を使用して行うことができます(Web上にたくさんの例があります)。また、このメソッドを使用する場合は、fastcgi/fcgidが複数のPHPプロセスを生成しないようにする必要があります。

PHP_FCGI_CHILDRENの欠点は、従業員の管理がfcgid/fastcgiで提供されているものほど良くないことです。

だから、そこにいる。 fcgid/fastcgi環境でのAPCは、各PHPワーカーに独自のキャッシュを与えたり、fcgid/fastcgiのプロセス起動を無効にしてPHPの組み込み管理を優先したりすることを意味します。これが将来変化することを祈っています。

+4

別のコメントによると、mod_fastcgiを設定してphp-cgiのインスタンスを1つだけ起動する(つまり、php-cgi自体がワーカーを処理し、キャッシュを共有するように)、httpd.confの "FastCgiConfig -maxClassProcesses 1"を使用します。 http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.htmlも参照してください。 – mjs

+0

バグ#57825が閉じられました。 PHPはこれを今サポートしていますか? – mgutt

+4

FPMはFPMをサポートしており、ほとんどのfcgid/fastcgiベースのソリューションは非推奨です。 APCには、大きなプール内のワーカー間で共有するときにロック(競合、デッドロック)が発生することがありますが、ファイル/オペコードキャッシングは非常にうまく動作しますが、FPMには安全機能が組み込まれています(segfault検出)を実行します。(ただし、デッドロックには役立ちません) –

0

キャッシュはプロセス間で共有する必要があります。 phpinfo()とapc.phpの間のmmapファイルの値が同じであることがわかります。これは、推奨されるデフォルトのAPC設定の設定で私のために働いています:

extension="apc.so" 
apc.enabled=1 
apc.shm_segments=1 
apc.shm_size=128 
apc.ttl=7200 
apc.user_ttl=7200 
apc.num_files_hint=1024 
apc.mmap_file_mask="/tmp/apc.XXXXXX" 
apc.enable_cli=1 

あなたの設定を投稿することができます。私は、mmap_file_maskが許可する値の1つでなければならないという警告を見ました。あなたがそれらのXのうちの1つを欠いているなら、あなたが得るものを言うことはありません。

あなたのfastcgi + apache設定が関係するかもしれません。

+0

率直に言って、私は実際にあなたのために働いているとは思わない。あなたがページをリフレッシュする場合は、通常、Keep Alive(おそらく?)の理由で、同じPHP-CGIワーカーがサービスを提供します。特にサーバーがヒープ全体にない場合はの負荷。 –

10

Domsterが提案した方法は完璧ではありませんが、最高です。私はいくつかの少量のサイトで短時間エラーなくこれをやってきました。私は最後の夜how to set up mod_fastcgi with a shared opcode cacheの詳細な説明を書きました。

mod_fcgidは、PHP_FCGI_CHILDRENを介して生成された子供の数にかかわらず、mod_fcgidが一度に1つのリクエストをPHPプロセスに送信するため、新しいmod_fcgidではなくmod_fastcgiを使用することが非常に重要であることがわかりました。

+0

あなたの記事が好きでした - このスレッドの上にgoogleで見つけました! – benlumley

+0

すばらしい答え!また、私は 'mod_fcgid'で同時性問題を解決できました! – vdboor

+0

すばらしい記事! http://whorka.github.com/blog/2012/02/08/apache-mod_fastcgi-suexec-php-apc-rhel.htmlも参照してください。 –

関連する問題