1

要求に応じてモバイル デバイスに画像を送信するために使用する php スクリプトがあります。現在のバージョンではスクリプトが実行され、最後の前に imagePNG() を使用して画像をデバイスに出力しますが、オンラインのphpマニュアルの例を読んで、次の例を見ました:

<?php
 header("Content-Type: image/png");

 # Generate cachefile for image, if it doesn't exist
 if( !file_exists($cachefile) ) {
   $im = generateimage();     # some code generates an image resource
   imagepng($im, $cachefile); # store the image to cachefile

   # don't output it like this:
   /* imagepng($im);*/

   imagedestroy($im);
 }

 $fp = fopen($cachefile, 'rb'); # stream the image directly from the cachefile
 fpassthru($fp);
 exit;
?> 

この例をいくつか変更して使用し、画像をモバイルに送信しましたが、正常に動作しましたが、いくつか質問したいことがあります: 1) ファイルから画像を作成し、imagePNG を使用して送信するよりも効率的ですか?

2) また、fpassthru を使用した直後にファイルを閉じるべきではありませんか?

3) fopen を使用する場合、ファイルがロックされていることを意味しますか?つまり、他のデバイスはありませんが、ストリーミングされているその瞬間にファイルにアクセスできますか?

この件に関するご意見をお待ちしております。

4

1 に答える 1

1

忙しいサイトの場合は、生成された画像をキャッシュすることをお勧めします。ハードドライブの空き容量と引き換えに、メモリと CPU サイクルを確実に節約できます。

使用後のファイルクローズについてはfpassthru、スクリプト終了時にPHPがファイルをクローズするので不要です。次の行exitで が呼び出されるため、明示的にファイルを閉じる必要はありません。画像を出力した後にさらに処理が進む場合は、使用しなくなったらファイルを閉じることをお勧めします。

3 番目の質問については、flockを呼び出していないため、ファイルはロックされていません。あるプロセスが読み取り用に開いている場合、別のプロセスが同時に読み取り用に開くことができます。

最後に、関数readfileを使用してファイルを出力できます。これにより、 を呼び出す必要がなくなりますfopenが、内部的には同じ PHP 関数readfileを呼び出すため、どちらを使用しても時間や効率にほとんどまたはまったく違いはありません。fpassthruphp_stream_passthru

于 2012-07-23T04:48:40.807 に答える