20

私は過去にrails、merb、django、asp.netmvcアプリケーションを使用してきました。彼らに共通しているのは(質問に関連している)、フレームワークを設定するコードがあるということです。これは通常、Webサーバーがリサイクルされるまで持続するオブジェクトと状態を作成することを意味します(ルーティングの設定、使用可能なコントローラーの確認など)。

私の知る限り、PHPは、実行されるたびにバイトコードにコンパイルされ、要求後に破棄されるCGIスクリプトに似ています。もちろん、セッションを作成して、同じユーザーからのリクエスト間でデータを永続化することもできます。また、APCのような拡張機能があり、サーバーレベルでリクエスト間でオブジェクトを永続化できます。

私の質問は、レールなどのように機能するPHPアプリケーションをどのように作成できるかということです。つまり、最初のリクエストでフレームワークをセットアップし、2番目以降のリクエストですでにセットアップされているオブジェクトを使用するアプリケーションを意味します。mod_phpに組み込みのキャッシュ機能はありますか?(たとえば、実行されたphpアプリケーションのコンパイルされたバイトコードを格納します)または、この問題を解決する唯一の方法は、APCまたは同様の拡張機能を使用していますか?どうしますか?

ありがとう。

編集:別の質問:セットアップ時間が非常に長いが実行時間が短い(上記のフレームワークのように)大きなPHPアプリケーションを作成する場合、すでにセットアップされているものをどのように「キャッシュ」する必要がありますか(これはおそらくデータベース接続を除いて、多くのことを意味します。そのため、PHPにはすでに永続的な接続があります)。

長いセットアップ時間を正当化するには:PHPリフレクションを使用して、使用可能なオブジェクトを確認し、それに応じてランタイムを設定するとどうなりますか。多くのリフレクションを行うのは通常遅いですが、1回だけ行う必要があります(そしてソースコードが変更された場合にのみ再評価します)。

EDIT2:それはAPCのようです。バイトコードを自動的にキャッシュするという事実は知っておくとよいでしょう。

4

3 に答える 3

7

APCが唯一の解決策であるかどうかはわかりませんが、APCがすべての問題を処理します。

まず、スクリプトはAPCで1回コンパイルされ、バイトコードはメモリに保存されます。

セットアップに時間がかかる場合は、ユーザーデータとしてAPCにキャッシュすることもできます。たとえば、私はいつもこれをします、

            $table = @apc_fetch(TABLE_KEY);

            if (!$table) {
                    $table = new Table(); // Take long time
                    apc_store(TABLE_KEY, $table);
            }

APCを使用すると、テーブルを作成するタスクはサーバーインスタンスごとに1回だけ実行されます。

于 2010-05-30T23:03:51.200 に答える
4

PHP(そしてそのことについてはruby)は解釈言語です。つまり、要求されるたびにファイルを解析し、疑似バイトコードに変換されていると言えるでしょう。PHPはRoRと言うよりもこのようなものであると言えますが、どちらも同じように動作します。

リクエスト間でデータを永続化する機能は、言語自体ではなくサーバーの機能です。たとえば、あなたが話しているRoRルーティングは実際にはキャッシュされていますが、それはサーバーのローカルメモリにキャッシュされています。読み込みを高速化するためにコンパイルおよび保存されることはありません。サーバー(およびサーバーとは、ボックスとWebサービスインスタンスの両方を意味します)が再起動すると、この情報はなくなります。あなたが話す「フレームワークのセットアップ」には、フレームワークに含まれる各ファイルの解析が含まれます。Railsはリクエスト中に各ファイルを何度も解析します。本番レベルの機能は実際にはこのデータをメモリにキャッシュする場合がありますが、開発中はキャッシュしません。私が言及する唯一の理由は、それが言語ではなくサーバーの機能であることを示しているからです。

PHPで同じことを実現するには、ZendServerを使用できます。私の知る限り、これは「コンパイル」され、指示されたときにバイトコードを使用する唯一のPHPインタープリターです。それ以外の場合は、リクエストに対して保持するデータを保存する方法を見つける必要があります。おっしゃるように、APCは非常に強力な機能であり、より分散されたものはMemcachedであり、もちろん、ディスクやSQLなどのより永続的なフォームがあります。

この特定の機能が必要な理由を知りたいと思います。これを行うことで「解決」されるパフォーマンスの問題に気づいていますか?

于 2010-05-30T22:51:00.457 に答える
0

私はあなたがいくつかの間違った一般化をしていると思います。これらのフレームワーク(例:Rails)はすべて、さまざまな構成で実行できます。一部では、リクエストごとにプロセスが作成されます。これは明らかにパフォーマンスを低下させますが、これらのフレームワークが長時間実行されるプロセスに依存していないことを示しています。必要に応じて、リクエストごとに設定(構成ファイルの再解析、オブジェクトの作成など)を行うことができます。

もちろん、mod_php(PHPが通常使用される方法)は、CGIとは異なり、Webサーバープロセス内で実行されます。したがって、CakePHP(たとえば)とRailsの間で根本的な違いは見られません。

おそらくあなたはPythonのWSGIやRubyのRackのようなものを探していると思いますが、PHP用です。これは、アプリケーションのインターフェース(言語の実行方法とは関係ありません)を指定します。新しいリクエストの場合、アプリケーションオブジェクトの新しいインスタンスが作成されます。私の知る限り、これはPHPには存在しません。

于 2010-05-30T22:41:24.373 に答える