PROVE for PHP FAQ

FAQ

PROVEは何ができるの?

PHPとPHPアプリが「正しく」実行されているか証明(PROVE)できます。

どういう仕組みで証明(PROVE)できるの?

PROVEはアプリケーションの実行状態を詳細に記録&比較できます。データベースやWebサービスといった外部リソースへアクセスした結果のオーバーライドも可能で記録した時点での実行状態を忠実に再現できます。忠実に再現できなかった場合、アプリケーション・PHP・OSやライブラリなどの環境に原因がある事が分かります。しかも、問題が発生した関数呼び出しがピンポイントで判ります。ブラウザやデータベースなどへの出力結果から原因を推測する必要もありません。

対象外のOSはサポートは?

RHEL類似のOSをサポートしています。Ubuntuや他のLinuxディストリビューションでのサポートやMacOS、Windowsへの対応はご要望に応じて検討します。Fedoraなどの類似環境でも問題が発生する場合も考えられます。お問い合わせください。

対象外のPHPバージョンのサポートは?

対象外のPHPバージョンや環境であっても可能な限り対応します。お問い合わせください。

どうして同じ結果になるの?リモートIPアドレスは変更できないでは?

PROVEはリクエスト情報の調整機能を持っています。現在の実装ではリクエストを送るクライアント(PROVEクライアント)が調整に必要なパラメータを拡張HTTPヘッダとして送信するようになっています。この為、IPアドレスやポート、リクエスト時間などクライアントや時間に依存する条件もサーバサイドで調整できるようになっています。追加のHTTP拡張ヘッダはPROVEに除去されるので処理への影響は全くありません。

どうして同じ結果になるの?セッション変数は?

$_POST, $_GET, $_COOKIEはリクエスト記録時と同じパラメータとなるようにPROVEクライアントが送信しています。セッション変数はリクエストが記録された時に割り当てられる一意なIDによりログから情報が取得され設定されます。セッションの状態に関わらず、リクエストが送信された時点と全く同じ$_SESSION配列が再現できます。

つまり、既にログインしている状態のリクエストを再生した場合、ログインした状態の処理が忠実に再現されます。PROVEを使えばHTTPセッションを利用したアプリケーションでもリクエスト単位で独立してテストが行えます。

どうして同じ結果になるの?時間や乱数関数は?

時間や乱数の結果を同じにするのは簡単です。リクエスト情報、セッション情報はログ記録時と全く同じになります。アプリケーションや環境に変更がなければ、関数呼び出しの順序は同じになります。PROVEは特定の関数の戻り値を自動的に記録された値に置き換える事(オーバーライド)ができます。時間関数や乱数関数以外の全ての関数の実行結果はログが記録された時と同じ値に書き換える可能です。この為、リクエストが送信された時点と全く同じ実行状態が再現できます。

どうして同じ結果になるの?ファイルやデータベースへのアクセスは?

ファイルやデータベース、Webサービスなど「外部リソース」はログを記録した時点と同じデータを返してくれるとは限りません。実際、同じである方が稀でしょう。PROVEではリソースを含む関数呼び出しの自動オーバーライドをサポートしています。リソースはログが記録された時点と同じ戻り値を返します。

いろいろ複雑な処理を行っているようだし、大丈夫?

PROVE自体の機能に不具合がある場合、通常の記録と再生で問題が発生します。この為、PROVEの問題や制限事項などは回帰テストで簡単に判別できます。

関数を実行しないので結局きちんとPHP本体のテストが出来ないのでは?

PROVEが実行しない関数は限られています。関数やメソッドの単機能テストはUNITテストが得意とする分野です。PHP本体には1万近いUNITテストが実装されています。PROVEと以前使っていたPHPのUNITテストを利用すればかなりの確度でテストが行えます。また、テスト用のデータベースサーバなどを準備してPROVEでオーバーライドを無効にすればログとは異なった動作をしても、差分情報から正しい実行状態であることを確認することも簡単です。

便利そうだけど遅いのでは?

実際に試用して頂ければ分かります。可能な限り最適化を行っているため十分な速度で実行できます。PROVEはZendエンジン拡張モジュールであるため、一部のバイトコードキャッシュシステムは利用できなくなりますが現在のAPCはZendエンジン拡張モジュールではないので利用できます。Proveを動作させると最適化は行っていますがパフォーマンスは低下します。高負荷な環境ではロードバランサで負荷分散を行うようにしてください。

しかし、戻り値が異なる関数を大量に呼び出すスクリプトの実行には多くの時間が必要となります。通常のWebアプリケーションのスクリプトではこのようなケースは少ないでしょう。

便利そうだけどメモリを使い過ぎでは?

トレースモードのメモリ使用量は最小限になるよう最適化されています。しかし、多くのメモリがある方が良いです。バリデーションモードでは大量のメモリを利用します。4GB以上のメモリをご用意ください。

オープンソースソフトウェアの開発に利用しても構わない?

個人としてオープンソースソフトウェア開発に関わっている方は無償ライセンス版をご自由にお使いください。

ログファイルを解析しても構わない?

ログファイル形式は変更される場合もあります。ログファイルおよびプログラムの解析はご遠慮ください。API(PROVEモジュール関数)を用いてアクセスしてください。

沢山のファイルが出来すぎて消せない

Linux標準のrmコマンドは大量のファイルを削除しようとすると大量のメモリを消費します。特に32bit環境では4GBのメモリ上限を超えて消せない場合もあります。PROVEのログファイルは専用パーテションに保存しファイルシステムを再作成してください。ファイルシステムの再作成が無理な場合の為に削除ツールも用意しています。/usr/libexec/prove/remove-file/ディレクトリのでmakeコマンドを実行してremove-fileコマンドを作成し、remove-file /prove/trace などとコマンドを実行して削除してください。(シンプルなツールで最も速く削除できます。しかし、数時間、それ以上の時間がかかります。remove-fileは削除状況を出力しないので、削除状況はstat /prove/trace 等として確認してください)

ディスク容量に空きがあるのにログが保存できない

ext3ファイルシステムは単一のファイルシステムのファイル数にinode数以外の制限があるようです。Reiser4/Btrfs(推奨。ファイル数無制限)やext4(ファイル数40億まで)を利用してください。ただし、現在のファイルシステムはスペック上は大量のファイルも扱えるようにはなっていますが実際には大量のファイルがある場合、かなりパフォーマンス低下します。近い将来リリースされるデータベースをデータ保存先とするバージョンをお待ち下さい。

バグを見つけたのだけど?

バグトラッキングシステムを導入するまでは support@www.provephp.com にPROVEの不具合としてメールでご連絡ください。バグ報告の前にPHPの既知の問題のページ、PHPのエラーログ(Apacheのエラーログと記録されている場合もあります)を確認し、ディレクトリの有無、パーミッション関連、ディスク空き容量などに問題が無いか確認してください。またバグを再現する手順やログデータ、エラーメッセージを添付するようお願いします。

どこの誰が作ってるの?

岡山県総社市のエレクトロニック・サービス・イニシアチブ(有)で開発しています。エレクトロニック・サービス・イニシアチブの代表取締役社長の大垣靖男はPHPのコミッターでもあり、岡山大学大学院非常勤講師、PHP技術者認定機構顧問なども務めています。

· 最終更新: 2011/10/29 17:37

個人情報保護 | PROVE開発ブログ(Coming Soon) | GITレポジトリ(Coming Soon) | オンラインフォーラム(Coming Soon)

PROVE for PHP, produced by Electronic Service Initiative, Ltd.