ホームページ >バックエンド開発 >PHPチュートリアル >PHP で仮想プロキシを使用して遅延読み込みテクノロジを実装する、phploading_PHP チュートリアル
ちなみに、私はこれを Martin の「Enterprise Application Architecture Patterns」から学びました。これは PHP 動的言語の機能を支援し、仮想プロキシ プレースホルダーを通じて Java よりもはるかに簡単に遅延読み込みを実装できます。唯一の欠陥は、組み込みの基本タイプではなく、オブジェクトのみをプロキシできることです。
私が試した PHP ドメイン モデルの設計では、これを使用して DomainObject の遅延読み込みを実装しました。
/**
* * 仮想プロキシ。メンバーにアクセスされた場合にのみクロージャ関数が呼び出され、ターゲット オブジェクトが生成されます。
*
* @param Closure $loader はプロキシオブジェクトのクロージャ関数を生成します
*/
パブリック関数 __construct(Closure $loader)
{
$this->loader = $loader;
}
/**
* * プロキシメンバーメソッドの呼び出し
*
* @param string $method
* @param 配列 $arguments
* @throws BadMethodCallException
* @return 混合
*/
パブリック関数 __call($method, 配列 $arguments = null)
{
$this->check();
if (!method_exists($this->holder, $method)) {
throw new BadMethodCallException();
}
return call_user_func_array(
array(&$this->holder, $method),
$arguments);
}
/**
* プロキシメンバー属性の読み取り
*
* @param string $property
* @throws ErrorException
* @return 混合
*/
パブリック関数 __get($property)
{
$this->check();
if (!isset($this->holder->$property)) {
throw new ErrorException();
}
return $this->holder->$property;
}
/**
* プロキシメンバー属性の割り当て
*
* @param string $property
* @param 混合 $value
*/
パブリック関数 __set($property, $value)
{
$this->check();
$this->holder->$property = $value;
}
/**
※プロキシオブジェクトが既に存在するか確認し、存在しない場合は生成します。
*/
プライベート関数 check()
{
If (null == $this->holder) {
$loader = $this->loader;
$this->holder = $loader();
}
}
}
// テスト
$v = 新しい VirtualProxy(function(){
echo 'Now, Loading', "n";
$a = 新しい ArrayObject(range(1,100));
$a->abc = 'a';
//実際の使用ではここでDataMapperのfindXXXメソッドを呼び出します
// ドメイン オブジェクトのコレクションを返します
$a を返します;
});
//プロキシオブジェクトはオリジナルオブジェクトとして直接アクセスされます
// この時、コンストラクターで渡されたコールバック関数が呼び出されます
//これにより、オブジェクト操作の読み込みの遅延が実現します
echo $v->abc . $v->offsetGet(50);
最初に表示されたコンテンツをバッファからプッシュします。後続のコンテンツが出てくるかどうかは、前のコンテンツには影響しません。 . .
簡単なコードは次のとおりです:
//重要
echo rand(),'最初に出てきたもの
';
ob_flush();
flush();
/ /重要ではありません。 . .
include "big.avi";
sleep(3);
ob_flush();
?>
追加した質問から、上記のコードが無駄に書かれていることがわかりました。
裸の馬~ 結局のところ、必要なのは ajax 遅延ロードだけです!
PHP での遅延ロードは、最終的にはオンデマンドでファイルをロードし、オンデマンドでオブジェクトをインスタンス化することです。
オンデマンドでのインスタンス化は、上記のメソッドを使用して実装できますが、より多くの場合、プロキシが使用されます。ローダーが処理します