2012-07-22 49 views
1

我有一個PHP腳本,我用它來發送圖像到移動設備的請求。在當前版本的腳本運行,並在年底前我用imagePNG()輸出圖像的設備,但這樣做在PHP手冊的例子一些閱讀網上我看到這個例子:PHP - 使用fpassthru發送圖像到手機圖像PNG

<?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,這是否意味着該文件被鎖定,意味着沒有其他設備,但那個人將能夠訪問它的那一刻,它的流媒體?

對此事的任何意見將不勝感激。

回答

1

我認爲緩存生成的圖像是一個好主意,如果你有一個繁忙的網站。它肯定會節省內存和CPU週期以換取一些硬盤空間。

關於在使用fpassthru後關閉文件,當腳本終止時PHP不會關閉文件。由於下一行稱爲exit,因此不需要顯式關閉文件。如果輸出圖像後出現更多問題,我建議在不再使用時關閉文件。

至於你的第三個問題,由於你沒有調用flock,所以文件沒有被鎖定。如果一個流程開放閱讀,另一個流程可以同時打開閱讀。

只是最後一個提示,您可以使用函數readfile來輸出文件。這樣可以節省您不必撥打fopen,但內部readfilefpassthru調用相同的PHP函數php_stream_passthru,因此根據您使用哪一個函數,時間或效率幾乎沒有差別。

+0

非常酷:)感謝您確認我對使用fclose的想法我只是沒有把握,我無法找到關於此事的任何文檔。因此,如果我在服務器上有文件,使用readfile會爲我節省一個必須用fopen打開文件的步驟?那麼只要使用readfile,它甚至可能更有效率?我沒有嘗試過,所以我不知道,但會讀文件流圖像到移動設備。 – 2012-07-23 05:41:51

+1

關於釋放資源[這裏]有一些小提及(http://php.net/manual/en/language.types.resource.php)。我記得一些更具體的事情,但可能與相同規則適用的mysql連接有關。 Readfile與'fpassthru'完全相同,只是readfile不需要文件句柄(保存你的步驟),PHP會在內部打開它並按照'fpassthru'的方式將數據寫入輸出緩衝區。如前所述,在內部,它們都調用相同的函數,因此它們的表現完全相同。 – drew010 2012-07-23 15:38:58

+0

再次感謝:) – 2012-07-23 17:46:20