2016-07-23 15 views
1

私はPHPには新しく、何百ものページですべての手続きを継承しています(ファイルのテキスト検索を行うとどこでも関数定義さえありません)。私はC#とJavaの世界から来ています。私は徐々にOOPを追加する方法を探しています。 (彼らは私にフロントエンドを更新したいと同時に、バックエンドの修正を彼らに説得しようとしており、フレームワーク(dammit)を使用したくない)。php - オートローダの実装では、すべてのクラスをプリロードします

オートローダを見ているうちに...まあ、ここに私の理解です。これは、クラスが格納されているフォルダを登録する方法です。クラス、特性などをインスタンス化すると、クラス/ファイル名/名前空間に基づいてフォルダが検索され、適切な定義がロードされます。

私はいくつかの質問があります:

オートローダは、フォルダを検索し、すべてのページのライフサイクル上の適切な定義をロード(またはそれはそれらをキャッシュしない)していましたか?

プリロード: はオートローダ、またはいくつかの代替を使用する方法がありますが、メモリにすべてのクラス定義をプリロードし、すべてのセッションにわたってそれらを利用できるようにするには?

もしそうなら、クラスファイルを更新するとき、私はクラスファイルを変更するときに、このメカニズムを使ってすべてをメモリにリロードする方法を教えてください。質問へ

UPDATE:

は、両方のあなたの答えをありがとう、それは少し役立ちますが、...私はStackOverflowの上で間違った質問(複数可)ポーズの悪い癖を持っています。

私が避けたいのは、クラスを追加することでページを遅くすることです。つまり、ライブラリを追加し、オートローダーでパスを登録するとしましょう。ページは、複数の依存関係を持つクラスをインスタンス化します。依存グラフに15ファイルが含まれているとします。要求ライフサイクルごとに、サーバーはそのページに15の他のファイルをロードします。

私はコンパイルされた言語から来ているので、私はこれらのクラスをメモリにロードしないで少し奇妙に感じます。すべてのクラスが一緒に5MBを超えてはいけません。

(または多分私はRAMディスクを作成し、起動時にそこにあるすべてのファイルをコピーし、ちょうどシンボリックリンクを持っている必要がありますか?)

+0

[PHP-FIG:Autoloader](http://www.php-fig.org/psr/psr-4/)と[Composer](https://getcomposer.org)をご覧ください/doc/01-basic-usage.md)にアクセスしてください。 – ldg

+0

私はこのルートに行く必要があると思います: https://en.wikipedia.org/wiki/List_of_PHP_accelerators –

+0

@PaulPerrickリンクをありがとう。私自身の展開設定について考えさせてくれます。 – BeetleJuice

答えて

0

誰も私が探していたものを掲載しないが、最適なルートは、PHP 5.5にして(私のクライアントはので、私はそれについて知らなかった5.3を使用している)の上に構築済みだOptCacheあるようです。

https://github.com/zendtech/ZendOptimizerPlus

ZendのOPcache

ZendのOPcacheは、オペコードキャッシュ と最適化により高速化PHPの実行を提供します。プリコンパイルされた スクリプトバイトコードを共有メモリに保存することにより、PHPのパフォーマンスが向上します。これにより、 のコードをディスクから読み込み、将来のアクセス時にコンパイルする段階がなくなります。 では、コード実行の高速化を実現するバイトコード最適化パターンをいくつか適用しています( )。

1

私はあなたがオートローディングの目的を誤解かもしれないと思います。 PHPが認識できないクラスをコードが呼び出すときに何をすべきかについての指示です。それでおしまい。自動ローダーはrequires /path/to/classfileを呼び出して、PHPがそのクラスを参照するようにします。

オートローダはフォルダを検索し、ページライフサイクルごとに適切な定義 をロードしますか(またはキャッシュしますか)?

リクエストにはキャッシュがありません。ファイルを変更すると、次のhttpリクエストに変更が反映されます。それは、あなたがあなたのスクリプト内で他の命令を変更しているかのようだ例えばecho 1

プリロード

echo 2には変更: 予圧にオートローダーを使用する方法、またはいくつかの代替、ALLクラス定義にはありますすべてのセッションで を利用できるようにしますか?

この必要はありません。よく書かれたオートローダーはクラスを見つける場所を指示するので、可能なすべてのクラスをあらかじめロードするのは無駄です。まだundefined classesのエラーが発生している場合は、オートローダを改善するか、現在のオートローダの指示に従ってクラスファイルを配置する必要があります。

クラスをすべて事前にロードする場合は、php.iniauto_prepend_fileの設定を使用します。 The docs say

は自動的に初期化スクリプトに メインファイル

設定し、それが前に解析されたファイルの名前を指定します。そのスクリプトには次のようなものがあります:

//put all your class files in this folder 
$dir = '/path/to/classes/folder'; 
$handle = opendir($dir); 

//require all PHP files from classes folder 
while (false !== ($item = readdir($handle))){ 
    $path = $dir.'/'.$item; 
    if(is_file($path) && pathinfo($path,PATHINFO_EXTENSION)==='php') 
     require_once $path; 
} 

これは単純化されています。どんなディレクトリのすべてのファイルをあなたのスクリプトに含めるだけで、私はこれをしないでしょう。また、サブディレクトリにファイルを含める場合は、これを調整する必要があります。

基本的には、このをしません。ちょうど良いオートローダーを持っています。

1

PHPの自動ローダーは怠惰です。 PHPが知らないクラスの使用に遭遇すると、登録されたオートローダー(またはオートローダーのチェーン)にそれを見つけるように頼みます。クラスが定義されているファイルをどこに取得して含めるかを調べるのはオートローダーの仕事です。あなたのクラスに名前をつけ、クラスファイルを整理するための何らかの種類の規約を持つことは、有用なオートローダーを持つための鍵であり、PSR-4のようなPHPコミュニティではいくつかの規約があります。

オートローダは、フォルダを検索し、ページのライフサイクルごとに適切な定義をロードしますか(またはキャッシュしますか)?

オートローダーは、すべての要求に対して呼び出されますが、クラスを自動ロードする必要が生じた場合にのみ呼び出されます。

プリロード:オートローダーを使用して、すべてのクラス定義をメモリにプリロードし、すべてのセッションで使用できるようにする方法はありますか?

私はそれほど信じられませんが、クラスの数が増えるにつれて、これはますます無駄になります。

素晴らしいへようこそレガシィPHPの世界をチェックアウトすることを強くお勧めします。モルドールからシャイアに戻るための戦略ガイドのようなものです。

関連する問題