目次
2。リソースの使用:ハンドルとの対話
3。リソースの破壊:ハンドルを解放します
手動のクリーンアップ
自動クリーンアップ(ガベージコレクション)
4.リソースを管理するためのベストプラクティス
ボーナス:リソースの検査
ホームページ バックエンド開発 PHPチュートリアル PHPのリソース管理:「リソース」タイプのライフサイクル

PHPのリソース管理:「リソース」タイプのライフサイクル

Jul 27, 2025 am 04:30 AM
PHP Data Types

PHPリソースのライフサイクルは、次の3つの段階に分けられます。1。リソース作成、Fopenやcurl_initなどの関数を介して外部システムハンドルを取得します。 2。リソースの使用、操作のための関連関数にリソースを渡す、PHPはリソースIDを介して基礎となるシステム構造にマップします。 3。ファイル記述子が消耗しないように、自動ガーベージコレクションに依存しないように、リソースをリリースするために、Fclose、curl_close、およびその他の機能を手動で呼び出すリソースの破壊を優先する必要があります。ベストプラクティスには、常に明示的にリソースを閉じ、試してみてください...最後にクリーニングを確保し、__デストラクトをサポートするPDOでオブジェクトのカプセル化を優先し、グローバルストレージリソースを避け、get_resources()を介してアクティブリソースを監視して漏れをトラブルシューティングします。要するに、それは遅れて取得し、早期にリリースされ、常に掃除されるべきです。

PHPのリソース管理:「リソース」タイプのライフサイクル

PHPでは、 resourceタイプは、ファイルハンドル、データベース接続、画像キャンバスなど、PHPランタイムの外側の外部リソースへの参照を保持する特別な変数です。リソースの作成、使用、およびクリーンアップの理解を理解することは、効率的でリークフリーのPHPコードを作成するための鍵です。

PHPのリソース管理:「リソース」タイプのライフサイクル

標準データ型(整数、文字列、配列)とは異なり、リソースは、システムレベルのエンティティへのステートフルな接続またはハンドルを表します。このため、ライフサイクルは外部システムにしっかりと結び付けられており、適切なクリーンアップが重要です。

PHP resourceのライフサイクルが通常どのように機能するかは次のとおりです。

PHPのリソース管理:「リソース」タイプのライフサイクル

1。リソース作成:外部ハンドルの取得

PHP関数がオペレーティングシステムまたは拡張機能からシステムレベルのリソースを要求するときに、リソースが作成されます。

一般的な例は次のとおりです。

PHPのリソース管理:「リソース」タイプのライフサイクル
 $ handle = fopen( 'data.txt'、 'r'); //ファイルハンドル
$ connection = curl_init(); // curlセッション
$ imagick = imageck_new_image(); //画像リソース(Imagicick経由)
$ pdo = mysqli_connect( 'localhost'、...); // mysql接続

この時点で、PHPはresource IDを内部的に割り当て、基礎となるシステムリソースと関連付けます。変数$handleファイルデータが含まれていません。これは、OSによって管理されたオープンファイル記述子へのポインターです。

overすべての拡張機能が同じようにリソースを使用するわけではありません。 PDOmysqliなどの最新の拡張機能(オブジェクトモード)は、より良いカプセル化のために生のリソースの代わりにオブジェクトを使用します。


2。リソースの使用:ハンドルとの対話

作成したら、リソースを動作する他の機能に渡します。

 while(!feof($ handle)){
    $ line = fgets($ handle);
    echo $ line;
}

これらの関数は、リソースIDを使用して、実際のシステムハンドルを検索して操作を実行します(たとえば、ファイルからバイトを読み取ります)。リソースは、変数によって参照され、明示的に閉じられていない限り、アクティブのままです。

内部的には、PHPはルックアップテーブルマッピングリソースIDを実際のCレベル構造(CのFILE*ポイントなど)に維持しています。


3。リソースの破壊:ハンドルを解放します

漏れを避けるためにもはや必要ない場合、リソースは明示的に解放されるべきです。

手動のクリーンアップ

適切なクローズ/フリー関数を使用します:

 fclose($ handle); //ファイルを閉じます
curl_close($ connection); //カールセッションを終了します

fclose()を呼び出すと、リソースが無効になります。その後それを使用すると、警告がトリガーされます。

 echo fgets($ handle); //警告:提供されたリソースは有効なストリームではありません

自動クリーンアップ(ガベージコレクション)

手動でリソースを閉じないと、PHPは、変数が範囲外またはリクエストの最後に、次のようにクリーンアップしようとします。

 function readfirstline(){
    $ f = fopen( 'data.txt'、 'r');
    $ line = fgets($ f);
    $ lineを返します。
} // $ fがスコープから抜け出す→PHPはファイルハンドルを自動的に閉じます

ただし、特に長期にわたるスクリプトやループでは、ごみ収集に依存することは危険です

 for($ i = 0; $ i <1000; $ i){
    $ h = fopen( "file_ $ i.txt"、 &#39;r&#39;);
    //プロセスファイル...
    // no fclose()→「オープンファイルが多すぎる」エラーを押す可能性があります
}

PHPはスクリプトエンドでクリーンアップしますが、OSには同時オープンファイル記述子に制限があります。実行中にそれらを使い果たすことができます。


4.リソースを管理するためのベストプラクティス

漏れを避け、堅牢なコードを確保するには:

  • curtail常に使用後、常にリソースを明示的に閉じます

     $ handle = fopen( &#39;data.txt&#39;、 &#39;r&#39;);
    // ...それを使用してください
    fclose($ handle);
  • try ... finallyパターン(またはtry ... catch )を使用します。

     $ handle = fopen( &#39;data.txt&#39;、 &#39;r&#39;);
    if($ handle){
        試す {
            //プロセスファイル
        } ついに {
            fclose($ handle); //保証されたクリーンアップ
        }
    }
  • 可能な場合は、生のリソースを介したオブジェクトを可能にします(たとえば、 PDOmysqliGuzzleHttp\Client )。より予測可能なクリーンアップのために、破壊者( __destruct() )をサポートします。

  • conder長期にわたるスクリプトでのリソースの使用を監視してください

     echo gc_collect_cycles(); // gcを強制します
    var_dump(get_resources()); //すべてのアクティブリソースをリストします
  • cloverしている必要がない限り、グローバル/静的変数にリソースを保存することを避けます。追跡して清掃するのが難しいです。


ボーナス:リソースの検査

変数のリソースタイプとIDを確認できます。

 $ handle = fopen( &#39;data.txt&#39;、 &#39;r&#39;);
var_dump($ handle); //タイプ(ストリーム)のリソース(5)

get_resource_type($ handle); //「ストリーム」を返します
is_resource($ handle); // trueを返します

get_resources() (PHP 7.0)は、現在アクティブなすべてのリソースを返します。

 foreach(get_resources()as $ res){
    echo get_resource_type($ res)。 "\ n"; //例えば、「curl」、「mysql link」
}

リークのデバッグに役立ちます。


基本的に、覚えておいてください:遅れて取得し、早期にリリースし、常にクリーンアップしてください。リソースは外の世界への橋です。それらを開いたままにしないでください。

以上がPHPのリソース管理:「リソース」タイプのライフサイクルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHP 8のユニオンタイプでコードベースを近代化します PHP 8のユニオンタイプでコードベースを近代化します Jul 27, 2025 am 04:33 AM

upgradephp7.xcodebasestophp8 byreplacingphpdoc-suggestedtypeslike@paramstring | intwithnativeuniontypessuchasstring | intforparametersandreturntypes、whithemprovestypeSafetyandclarity;

PHP 8.1列挙:タイプセーフ定数の新しいパラダイム PHP 8.1列挙:タイプセーフ定数の新しいパラダイム Jul 28, 2025 am 04:43 AM

php8.1で導入された酵素は、魔法の価値の問題を解決するタイプセーフ定数コレクションを提供します。 1. enumを使用して、ステータス::ドラフトなどの固定定数を定義して、定義された値のみが利用可能であることを確認します。 2。列挙型をバックデナムに介して弦または整数にバインドし、スカラーと酵素間の()とtryfrom()からの変換をサポートします。 3。酵素は、ビジネスロジックのカプセル化を強化するために、color()やisedable()などの方法と動作を定義できます。 4。動的データではなく、状態や構成などの静的シナリオに適用できます。 5.タイプの制約のためにUnitenumまたはBackedenumインターフェイスを実装し、コードの堅牢性とIDEサポートを改善し、

精度の危険:PHPの浮動小数点数を処理します 精度の危険:PHPの浮動小数点数を処理します Jul 26, 2025 am 09:41 AM

0.1 0.2!== 0.3inphpduetobinary floating-precisionlimitations、sodevelopersmustavoiddirectcomparisonsandusepsilonベースのチェック、empluebcmathorgmtic、emplovebcmathorgmetic、storecurrencyinintegersegorsible、formatutcoputputputputputtutputpotised、およびneverrelelelyonfrocisis

「Mixed」から「void」まで:PHPリターンタイプ宣言の実用的なガイド 「Mixed」から「void」まで:PHPリターンタイプ宣言の実用的なガイド Jul 27, 2025 am 12:11 AM

returntypesinphpimprovecoderiability andclaritybysifyifiecifyive whatafunctionmusterturn.2.usebasictypeslikestring、array、ordatetimetoenforcorcreturnvaluesandcatcherrorsearly.3.ApplynullabletypeSwith?(E.G。、?

変数の寿命:PHPの内部「zval」構造が説明されています 変数の寿命:PHPの内部「zval」構造が説明されています Jul 27, 2025 am 03:47 AM

PHPはZVAL構造を使用して変数を管理します。答えは次のとおりです。1。ZValには、16バイトのサイズの値、タイプ、メタデータが含まれています。 2。タイプが変更されたら、組合とタイプ情報のみを更新する必要があります。 3。複雑なタイプは、ポインターを介した参照カウントを持つ構造を指します。 4.値を割り当てるとき、コピーを使用してメモリを最適化します。 5。参照変数が同じZVALを共有するようにします。 6.リサイクル参照は、特別なゴミコレクターによって処理されます。これは、PHP変数の動作の根本的なメカニズムを説明しています。

PHPのリソース管理:「リソース」タイプのライフサイクル PHPのリソース管理:「リソース」タイプのライフサイクル Jul 27, 2025 am 04:30 AM

PHPリソースのライフサイクルは、次の3つの段階に分けられます。1。リソース作成、Fopenやcurl_initなどの関数を介して外部システムハンドルを取得します。 2。リソースの使用、操作のための関連関数にリソースを渡す、PHPはリソースIDを介して基礎となるシステム構造にマップします。 3。ファイル記述子が消耗しないように、自動ガーベージコレクションに依存しないように、リソースをリリースするために、Fclose、curl_close、およびその他の機能を手動で呼び出すリソースの破壊を優先する必要があります。ベストプラクティスは次のとおりです。常に明示的にリソースを閉じ、試してみてください...最後にクリーンアップを確保し、__DestructをサポートするPDOなどのオブジェクトに優先順位を付け、グローバルストレージリソースを避け、get_resources()を介してアクティブリソースを監視する

PHPの二重性:ゆるいタイピングと厳密なタイプの宣言のナビゲート PHPの二重性:ゆるいタイピングと厳密なタイプの宣言のナビゲート Jul 26, 2025 am 09:42 AM

PHPは、ゆるいタイプと厳格なタイプの共存をサポートします。これは、スクリプト言語から最新のプログラミング言語への進化の中心的な特徴です。 1.ゆるいタイプは、迅速なプロトタイピング、動的なユーザー入力の処理、または外部APIでのドッキングに適していますが、暗黙のタイプ変換のリスク、デバッグの難しさ、ツールサポートの弱いなどの問題があります。 2。decrare(strict_types = 1)で厳密なタイプが有効になります。これは、事前にエラーを検出し、コードの読みやすさとIDEサポートを改善することができ、コアビジネスロジック、チームコラボレーション、データの整合性の高い要件を備えたシナリオに適しています。 3。実際の開発で混合使用を使用する必要があります。デフォルトでは厳密なタイプが有効になり、緩いタイプは入力境界で必要な場合にのみ使用され、検証とタイプ変換はできるだけ早く実行されます。 4.推奨されるプラクティスには、PHPSTAの使用が含まれます

`?`:PHPでヌル可能なタイプを効果的に利用する力 `?`:PHPでヌル可能なタイプを効果的に利用する力 Aug 08, 2025 am 01:50 AM

?PHPでは、タイプが空になる可能性があり、コードのタイプの安全性と読みやすさを向上させることができます。 1.オプションのパラメーターに使用する場合、着信値が指定されたタイプまたはnullであることを確認してください。 2。発見されないかもしれない返品値については、発信者にnullを返す可能性があることを明確に通知します。 3。APIなどのオプションのデータが存在するシナリオの場合、データ構造を正確にモデル化します。使用する場合は、nullが理にかなっている場合にのみ使用する必要があります。デフォルトのnullで繰り返し定義を避け、nullを組み合わせてnull値を処理しますか?および? - >演算子、およびボイドタイプには使用できないことに注意してください。 php8の後、文字列はstring | nullに相当しますが、前者はより簡潔であり、合理的な使用はランタイムエラーを大幅に減らすことができます。

See all articles