ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能と埋め込み -- リソース データ型 2_PHP チュートリアル

PHP 拡張機能と埋め込み -- リソース データ型 2_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:31:32730ブラウズ

リソース変数に格納される複雑なデータ型は、多くの場合、初期化中にメモリ割り当て、CPU 時間、またはネットワーク通信を必要とします。ただし、リクエスト間のデータベース接続などのリソースの保持には耐久性が必要です。リソースの耐久性は考慮する必要がある要素です。
まずメモリ割り当ての問題を見てみましょう: PHP を使用する場合は、malloc の再利用バージョンである emalloc を使用することを好みます。ただし、リクエスト間に永続的なリソースが存在する必要があります。ファイル ハンドル クラス リソースの場合、ファイル名を保存する要件を追加する場合は、次のコードをヘッダー ファイルに追加する必要があります。

typedef struct _php_sample_descriptor_data {
    char *filename;
    FILE *fp;
} php_sample_descriptor_data;
は、この構造を使用してファイル名とファイル ハンドルのリソースを保存し、異なるリクエスト間でリソースを共有できるようにします。
同様に、ソース ファイルにも対応する変更を加えます。
static void php_sample_descriptor_dtor( //这个是进行资源回收的回调函数,定义在资源的初始化处。
                    zend_rsrc_list_entry *rsrc TSRMLS_DC)
{
    php_sample_descriptor_data *fdata =
                (php_sample_descriptor_data*)rsrc->ptr;
    fclose(fdata->fp);
    efree(fdata->filename);
    efree(fdata);
}
この静的関数はリソースをリサイクルするために使用され、リソースの初期化時に指定されたコールバックを必要とします。
変更されたファイルを開く関数を実行するには、リソースにスペースを割り当てる操作を追加する必要があります。 れーれー
ファイル書き込み関数 fwrite も変更する必要があります。 れーれー
Sample_fclose 関数は実際のリソースを操作しないため、何も変更する必要はありません。次の関数は、リソースから元のファイル名を取得できます。 れーれー

メモリ割り当てが完了した後は、永続性を維持する必要があるため、遅延破棄にする必要があります。
非永続リソースの場合、リソース ID を格納する変数が設定解除されるかスコープから外れると、それらは EG (regulator_list) から削除されます。 EGで使用されるインデックス(persistent_list)はkey-value型であり、リクエスト終了時に要素は自動的に削除されません。 zend_hash_del() が呼び出された場合、またはスレッド/プロセスが完全にシャットダウンされた場合にのみ削除されます。 EG (persistent_list) にも dtor メソッドがありますが、これは zend_register_list_descructors_ex() の 2 番目のパラメータです。一般に、非永続リソースと永続リソースは 2 種類として登録されますが、1 つに結合される場合もあります。次に、sample.c に永続リソース タイプを追加します。 れーれー
以下の fopen 関数は、永続リソース タイプと非永続リソース タイプの両方と互換性があります。 れーれー
非永続リソースの場合、数値インデックスが指定され、リクエスト依存のリストに保存されます。 永続リソースの場合、キー値タイプを指定すると、後続のリクエストでハッシュキーを取得できます。次に、リソースを永続リストに追加します。永続リソースがスコープ外になると、EG (regulator_list) のデストラクターは le_sample_descriptro_persist の registerlist デストラクターをチェックします。 NULL であることが判明した場合、操作は実行されません。これにより、永続的なリソースが解放されなくなります。リソースが EG (persistent_list) から削除されると、スレッド プロセスが終了するか、意図的に削除されます。この時点で、永続的なデストラクターを探します。

リソースが永続的として適用される理由は、他のリクエストで再利用できるようにするためです。 永続的なリソースを再利用したい場合は、hash_key を使用する必要があります。sample_fopen が呼び出されると、関数は要求されたファイル名とモードを使用して hash_key を再作成し、persistent_list での検索を試みます。 れーれー すべての拡張機能は同じハッシュ形式を使用してリソースを保存するため、名前付けが重要であることに注意してください。一般に、拡張機能とリソース タイプの名前はプレフィックスとして使用されます。


リソースの空き状況を確認する:
ファイルなどのリソースは長期間開いておくことができますが、リモート ネットワーク リソースなどのリソースは、リクエスト間で長期間使用されないと問題が発生します。したがって、永続リソースを使用する前に、まず可用性を判断する必要があります。 れーれー









http://www.bkjia.com/PHPjc/762935.html

tru​​ehttp://www.bkjia.com/PHPjc/762935.html技術記事リソース変数に格納される複雑なデータ型は、多くの場合、初期化中にメモリ割り当て、CPU 時間、またはネットワーク通信を必要とします。ただし、リクエスト間のデータベース接続などのリソースは保持します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。