coreserverでのAPC(Alternative PHP Cache)について調べてみた

ちょっとCoreserverで動かしてるphpアプリで、APCが使えるなら使ってみたいと思ったので調べてみました。

まとめ

その前に注意
  1. Coreserverはサーバーによって構成が異なるので、このエントリーが当てはまらないかも知れません。
  2. このエントリーの方法がCoreserverに許可されているかどうか分かりません。このエントリーの趣旨はAPCが使えたではなく、あくまで調べたまとめです。
一応うごいたっぽい

この通りphpinfo()APCについて確認できました。ただ、このAPC使って良いのかどうか謎です。

手順

複数ドメインを運用してて、Subにwww.example.comを設定しているとします。

AddHandler application/x-httpd-php5cgi .php

まずはPHPCGIモードで動くように、/public_html/www.example.com/.htaccessを置きます。一応、PHP4で動かすならちょっと内容が違い((x-httpd-php4cgiだったかな?))ます。

extension_dir = "/usr/local/lib/php/extensions/"
extension=apc.so

次にこの内容のphp.iniを/public_html/www.example.com/php.iniに設置します。APCを動かすだけならこれで一応完了です。ただ、APCの設定値をどうするかというのもあるし、前述の通り使って良いものなのかどうか分かりません。

詳細

PHPが白紙になる、正常に実行されない場合について

可能性として、運用されているPHPスクリプトと、サーバー側でのPHP高速化・キャッシュモジュールとの相性の問題が発生していることがあります。その場合は、下記コマンドを「.htaccess」に記載してください。
php_flag apc.cache_by_default off
※標準でキャッシュがOnになっており、高速化されております。明示的に有効にするには、下記コマンドを「.htaccess」に記載してください。
php_flag apc.cache_by_default on

<初期費用無料> 超高速・高安定レンタルサーバー コアサーバー(CORESERVER)- 30日間無料お試し

そもそも、このページを読む限り、CoreserverではAPCは元々導入されているはずです。にもかかわらず、自分が確認できる2つのサーバーでは、APCが動いていませんでした。php_flag apc.cache_by_default onを書いたり、phpをモジュールモード・CGIモードに切り替えたりしてみても、phpinfo()APCの項目は出てきません。

○「php.ini」を設置、カスタマイズして動かす

ご自身で「php.ini」を設置して動かすことができます。
設置場所は、呼び出すphpファイルを設置しているディレクトリ・フォルダ内になります。

中略

## SQLiteモジュールを使う
extension_dir = "/usr/local/lib/php/extensions/"
extension=sqlite.so
extension=sqlite3.so

http://sb.xrea.com/showthread.php?t=10744

ここを見ると/usr/local/lib/php/extensions/php拡張モジュールが置いてあるようです。

> ls /usr/local/lib/php/extensions/
apc.la  eaccelerator.so  no-debug-non-zts-20050922  php_ming.so  sqlite.so  xcache.so
apc.so  imagick.so       no-debug-non-zts-20060613  sqlite3.so   xcache.la

sshで見てみると*1apc.soも置いてありました。

extension_dir = "/usr/local/lib/php/extensions/"
extension=apc.so

前述の引用の通り、CGIモードでphpを動かすなら、php.iniを設置できるのでphp拡張モジュールを追加できます。SQLiteのケースを参考にapc.soを追加したところ、結果の通りAPCが動きました。

No cache info available. APC does not appear to be running.

APCPECLで配布されていますが、そこからダウンロードした場合はapc.phpという管理画面の様なスクリプトが付いてきます。この元から設置してあったapc.soは3.0.15なので、PECL :: Package :: APCからAPC-3.0.15.tgzをダウンロードして、それのacp.phpを置いてみたら上記エラー。

array(10) {
  [0]=>
  string(25) "apc_cache_info_digirockvv"
  [1]=>
  string(15) "apc_clear_cache"
  [2]=>
  string(12) "apc_sma_info"
  [3]=>
  string(9) "apc_store"
  [4]=>
  string(9) "apc_fetch"
  [5]=>
  string(10) "apc_delete"
  [6]=>
  string(20) "apc_define_constants"
  [7]=>
  string(18) "apc_load_constants"
  [8]=>
  string(16) "apc_compile_file"
  [9]=>
  string(7) "apc_add"
}
<?php
var_dump(get_extension_funcs('apc'));
?>
<hr />
<?php show_source(__FILE__); ?>

APCの関数を出力してみたところapc_cache_info()が無く、代わりにapc_cache_info_digirockvv()がありました。名前から察するにCoreserver側で何か手を入れているようです。apc.php内のapc_cache_info()を一通りapc_cache_info_digirockvv()に置き換えて、apc.phpも動きました。apc.phpの表示では、実際にAPCが動いてキャッシュされている事も確認できました。

と、こんな感じで、元々導入されてるはずなのに無かったり、でもapc.soだけは置いてあったりで、このまま使って良いのかどうかはちょっと謎です。一応こういう状況ですというまとめとして書いておきます。

環境

coreserver
Apache 1.3.37
php 5.2.5
APC 3.0.15

*1:rbashは回避済み