問題のリソースは、キャッシュの本当の意味ではなく、実際にはキャッシュされていません。スクリプトが終了するか、スクリプトを閉じる適切な関数を呼び出すまで、接続は開いたままになります (mysql_close()
永続的な接続を使用する場合などは呼び出さないでください)。
さて、本当の問題は、「スクリプトが終了するまで」とはどういう意味かということです。これは、現在使用されている PHP SAPI によって異なる場合や、不可能な場合がありますが、HTTP/1.1 + mod_php をサポートする Apache を例に取りましょう - 最も人気があり、説明するのが最も簡単です ...
キープアライブがあるため、HTTP/1.1 が必要です。これは、ステートレス プロトコルとしてはかなり奇妙なことです。ページにアクセスすると、Apache はスレッドまたは新しいシステム プロセスの下で PHP スクリプトを実行します。ここにキャッチがあります-スクリプトは完全に実行されますが、Apacheは問題のスレッドまたはプロセスを終了せず、開いたままのリソースの永続性を維持できます. 正確にどのように行われるかはわかりませんが、Keep-Alive を使用すると、次の HTTP リクエストが Apache によって同じスレッドまたはプロセス ID にアタッチされ、そのリソースを再利用できるようになります。2 番目の部分は、基本的な健全性チェックにすぎません。永続的な接続を作成するために使用したのと同じ「オプション」や資格情報を使用している場合にのみ、永続的な接続に接続できます。mysql_connect()
別のユーザー名で - 新しい接続を作成し、古い接続を再利用しません (署名が一致しません)。しかし、おそらく同じスクリプトが再実行されることを考えると、これはほとんどの場合「形式的」にすぎません。
理解していただけると幸いです。そのしくみを完全に理解するには、数時間の実験が必要でした。詳細については、php.netを参照してください。この記事の名前は「永続的なデータベース接続」ですが、それは、もともと永続的な接続がデータベースでしか利用できなかったからです。説明されている動作は、他の同等のものすべてに当てはまります。
編集:
より具体的な質問に答えるのを忘れました:
しかし、たとえば pfsockopen の場合、ソケットがキャッシュされるとどうなるでしょうか?
何もありません - すでに上で説明したように、それは生き続けています。
まだ開いていて接続されていますか?
はい
その場合、「スリープ」時間中に受信した潜在的なデータはどうなりますか?
あなたがそれを読むのを待っています。
そのようなキャッシュされた接続の TTL は何ですか?
特に私は答えられません - p* 関数に渡すオプション、php.ini 設定、および/または接続先に依存する場合があります。また、ハードコードされた値であり、すべての値が異なる場合もあります。