ホームページ >バックエンド開発 >PHPチュートリアル >SAE に PHP ラッパーを適用する方法、wrappersae_PHP チュートリアル
この記事では、SAE に PHP Wrapper を適用する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
1.PHPラッパーとは
PHP 4.3 以降、PHP では、ユーザーが stream_wrapper_register() を通じて URL スタイル プロトコルをカスタマイズできるようになりました。ユーザーが fopen() や copy() などのファイル システム関数を使用してカプセル化されたプロトコルを操作すると、PHP はプロトコルの登録時に提供されたクラス内の対応する関数を呼び出します。
PHP マニュアルには、VariableStream クラスを var:// プロトコルとして登録する例が記載されており、このプロトコルを通じて、ユーザーはファイル システム関数を使用してグローバル変数を直接読み書きできます。たとえば、ユーザーは「var://foo」を介して $GLOBALS['foo'] を読み書きできます。
2. SAE に PHP ラッパーが必要な理由
パフォーマンスとセキュリティ上の理由から、SAE プラットフォームではローカル ファイルの読み取りと書き込み、および外部データのキャプチャが無効になっています。したがって、同じことを行うために対応するサービスを提供します。
新しいサービスのインターフェースはPHP自体のインターフェースとは異なるため、当社のプラットフォーム専用に開発されたプログラムには確かに問題はありませんが、多数の既存プログラムやオープンソースプロジェクトは複雑な移行作業に直面することになります。 PHP Wrapper を使用してサービスのインターフェイスをカプセル化すると、ユーザーはプログラムを SAE プラットフォームに簡単に移行できるようになります。
3. PHPラッパーの書き方
PHP Wrapper を通じてプロトコルをカプセル化するには、まず、streamWrapper クラスを作成する必要があります。クラスの形式は次のとおりです。 リーリー
クラスの各メソッドの説明:
streamWrapper::__construct — コンストラクター、stream_open の前にのみ呼び出されます
streamWrapper::dir_closedir — ディレクトリハンドルを閉じ、closedir() 関数に応答します
streamWrapper::dir_opendir — ディレクトリハンドルを開き、opendir() 関数に応答します
streamWrapper::dir_readdir — readdir() 関数に応答して、ディレクトリ ハンドルからエントリを読み取ります
streamWrapper::dir_rewinddir — ディレクトリハンドルを巻き戻し、rewinddir() 関数に応答します
streamWrapper::mkdir — ディレクトリを作成し、mkdir() 関数に応答します
streamWrapper::rename — ディレクトリまたはファイルの名前変更、rename() 関数に応答します
streamWrapper::rmdir — ディレクトリを削除し、rmdir() 関数に応答します
streamWrapper::stream_cast — 基本的なリソースを取得し、stream_select() 関数に応答します
streamWrapper::stream_close — リソースを閉じて fclose() 関数に応答します
streamWrapper::stream_eof — feof() 関数に応答して、ファイル ポインターが既にファイルの末尾にあるかどうかを確認します
streamWrapper::stream_flush — 出力キャッシュをクリアし、fflush() 関数に応答します
streamWrapper::stream_lock — ファイルのロックを参照し、flock() 関数に応答します
streamWrapper::stream_open — fopen() 関数に応答して、ファイルまたは URL をストリームとして開きます
streamWrapper::stream_read — ストリームからコンテンツを読み取り、fread()、fgets() 関数に応答します
streamWrapper::stream_seek — fseek() 関数に応答して、ストリーム内のポインターを検索します
streamWrapper::stream_set_option — ストリーム設定を変更する
streamWrapper::stream_stat — ファイルリソース情報を取得し、fstat() 関数に応答します
streamWrapper::stream_tell — ftell() 関数に応答して、ストリーム内のポインターの位置を取得します
streamWrapper::stream_write — fwrite()、fputs() 関数に応答して、コンテンツをストリームに書き込みます
streamWrapper::unlink — ファイルを削除し、unlink() 関数に応答します
streamWrapper::url_stat — ファイル情報を取得し、file_exists()、is_dir()、is_file()、filesize()、fileinode() などのすべての stat() 関連関数に応答します。
詳細な手順については、PHP マニュアルを参照してください: http://cn2.php.net/manual/en/class.streamwrapper.php
bool stream_wrapper_register ( string $protocol , string $classname [, int $flags = 0 ] )
例: リーリー
SAE プラットフォームはローカル ファイルへの書き込み操作をサポートしていないため、ファイルをローカルに書き込む必要がある Smarty などの一部のオープン ソース プロジェクトは SAE プラットフォームで直接使用できません。saemc Wrapper を使用すると、ユーザーは Smarty テンプレートを MC に保存してコンパイルできます。これにより、Smarty を SAE プラットフォームに簡単に移行できます。添付ファイルには、SAE 上の Memcache Wrapper の実装コードが提供されています。この添付ファイルをテスト用にダウンロードできます。
テストする前に、ローカルでポート 22222 を使用して Memcached サービスを開始する必要があります:
リーリー
次に、次のコードを使用してテストします:リーリー
テストページの出力結果:リーリー
私たちが提供する Memcache Wrapper は、ディレクトリ操作と Memcache のタイムアウトの一部のメソッドを実装していません。PHP マニュアルを参照してディレクトリ操作を実装するか、コンテキストを通じてこの Wrapper が Memcache のタイムアウトをサポートするようにすることができます。さらに、次のアドレスにアクセスすると、SAE Stdlib の sae_include のソース コードを表示できます。これには、Storage サービス用にカプセル化した saestor Wrapper と、Fetchurl サービスを再カプセル化する http Wrapper の実装も含まれています。
http://stdlib.sinaapp.com/?f=sae_include.function.php
4. Wrapperを書く際の注意点
1. コンストラクター
streamWrapper クラスは非常に特殊で、そのコンストラクターは毎回呼び出されるものではありません。これは、file_get_contents() を使用する場合など、操作によって stream_open 関連の操作がトリガーされた場合にのみ呼び出されます。また、操作によってストリームと関係のない関数がトリガーされる場合 (file_exists が url_stat メソッドをトリガーする場合など)、この時点ではコンストラクターは呼び出されません。
2. 実装を読む
Wrapper には Position や Seek などの概念がありますが、多くのサービスは実際にすべてのデータを stream_open 中に一度に読み取って属性に入れることができ、将来的には Seek や Tell 中に属性を直接操作できるようになります。内部に保存されているデータは問題ありません。
3. 追加の書き込み実装
すべてのデータを一度に書き込み、追加書き込み機能 (Memcache など) をサポートしていないサービスが多数あります。そのため、Wrapper で独自に追加書き込みを実装する必要があります。値全体を一度に読み取り、読み取った内容の後に書き込む必要のあるデータを追加して、一度に書き戻すことができます。
ただし、この追加書き込み実装のパフォーマンスは、特にコンテンツのサイズが大きい場合に比較的低下します。そのため、すべてのコンテンツを一度に読み取ると多くのリソースが消費されるため、一部のサービスでは追加のサポートを放棄する必要があります。書く。
4. url_statの実装
streamWrapperクラスの実装で難しいのはurl_statの実装です。ファイルのメタ情報を照会する is_writable や is_readable などの関数が正しく動作するには、url_stat が正しく実装されている必要があります。
そして、仮想デバイス用にこれらの値を偽装する必要があります。 mcを例として、いくつかの参考データを提供します:
url_stat は、次の内容を含む 13 個の項目に分割された配列を返す必要があります:
dev デバイス番号 - 0 を書き込むだけです;
ino i ノード番号 - 0 を書き込むだけです
モード ファイル モード - これはファイルの権限制御シンボルであり、後で詳しく説明します
nlink リンク - 0 と書くだけです;
uid uid - Linux では posix_get_uid を使用して取得できます。Windows では 0 です。
gid gid - Linux では posix_get_gid を使用して取得できます。Windows では 0 です。
rdev デバイス タイプ - i ノード デバイスの場合は値を持ちます。
サイズ - ファイルサイズ
atime - 最終読み取り時刻の形式は Unix タイムスタンプです。
mtime - 最終書き込み時間
ctime - 作成時間
blksize - ファイルシステム IO のブロックサイズはゼロを書き込むだけです;
ブロック - 割り当てられた 512 バイトのブロックの数はゼロを書き込みます
mode の値は正しく記述する必要があります:
ファイルの場合、その値は次のとおりです:
0100000 + ファイル権限 (0100000 + 0777 など)。
ディレクトリの場合、その値は次のとおりです:
040000 + ディレクトリ権限 (0400000 + 0777 など)。
5.統計キャッシュについて
PHP は、同じページの実行中にファイルのメタ情報をキャッシュします。 PHP ドキュメントの clearstatcache() メソッドの説明によると、stat()、lstat()、file_exists()、is_writable()、is_readable()、is_executable()、is_file()、is_dir()、is_link を使用する場合()、filectime()、fileatime()、filemtime()、fileinode()、filegroup()、fileowner()、filesize()、filetype()、または fileperms() メソッドを使用してファイル情報をクエリします。PHP は改善のためにキャッシュします。パフォーマンス。 unlink() を実行すると、clearstatcache() メソッドを使用してこのキャッシュをクリアできます。統計キャッシュは自動的にクリアされます。
実際、PHP はローカル ファイルに対してリンク解除、名前変更、および rmdir 操作が実行された場合にのみ統計キャッシュをクリアしますが、リンク解除、名前変更、および rmdir 操作が他のラッパーを通じて実行された場合には統計キャッシュをクリアしません。したがって、ラッパーを作成するときは、unlink およびその他のメソッドの clearstatcache() を使用して統計キャッシュを自分でクリアする必要があります。
さらに PHP 関連のコンテンツに興味のある読者は、このサイトの特別なトピックをチェックしてください: 「PHP Curl の使用法の概要」、「PHP ソケットの使用法の概要」、「PHP ネットワーク プログラミング スキルの概要」、「PHP 基本構文の入門チュートリアル」、 「php操作」オフィス文書スキルまとめ(word、excel、access、ppt含む)」、「php日時使い方まとめ」、「phpオブジェクト指向プログラミング入門講座」、「php文字列(ストリング)使い方まとめ」、 「php+mysql 「データベース操作チュートリアル入門」と「PHP における一般的なデータベース操作スキルのまとめ」
この記事が PHP プログラミングのすべての人に役立つことを願っています。