2017-07-19 77 views
1

我試圖找出足夠的數字來調整某些大小的圖像時調整ini_set('memory_limit', '*M')。我在測試時不明白的是,有時候我得到Fatal error(顯然分配的內存不夠),但是如果我刷新腳本幾次,它最終設法調整圖像大小。爲什麼PHP內存耗盡錯誤在圖像調整大小上不一致?

爲什麼調整特定圖像的內存要求不一致?爲什麼最終成功,如果我在瀏覽器中刷新php腳本(1次或更多次)?就好像PHP部分調整圖像的大小,並緩存結果,準備在下次執行時繼續執行。

如果我分配一個足夠高的值,它始終在第一次執行(明顯)上工作。但是,在分配較小的值時,它仍然有效,但值越低,我需要在瀏覽器中刷新腳本的次數越多,以避免出現錯誤。

實施例代碼

ini_set('memory_limit', '64M'); 

$image = 'image.jpg'; 
$image_size = getimagesize($image); 
$resize_height = round($image_size[1] * 1920/$image_size[0]); 
$image_create = imagecreatefromjpeg($image); 
$image_resized = imagecreatetruecolor(1920, $resize_height); 
imagecopyresampled($image_resized, $image_create, 0, 0, 0, 0, 1920, $resize_height, $image_size[0], $image_size[1]); 
imagejpeg($image_resized, 'image_COPY.jpg', 95); 
imagedestroy($image_create); 
imagedestroy($image_resized); 

例錯誤

Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 28672 bytes) in */test.php on line 12 

我可以很容易地通過分配的存儲器中的豐富量避免錯誤,但它是很難找到的閾值,和我很想知道它爲什麼這樣工作。提前感謝任何指針。

+0

這是否發生在128M的默認memory_limit?也許你可以在調整大小之前獲得圖像大小,並「即時」計算出適當的內存限制? – BenRoob

回答

1

對於在您的服務器上啓動的每個進程,如果內存限制高達128MB,並且您的RAM高達1028MB(1GB),則8個進程可以處於併發狀態。

這意味着如果您現在認爲服務器總是擁有越來越多的內存(例如32GB),則可以假設增加512MB的內存限制是可以接受的。

對於我的應用程序,我將內存限制增加到了1GB,而不會因爲我的服務器上令人驚歎的RAM而失去任何併發進程。

此鏈接對我幫助很大,在過去明白:

php-concurrency

現在對調整圖像大小,你可以使用這個計算器您的問題:

Calculator

此鏈接報價:

This s執行計算器可幫助您設置您的PHP進程的內存大小限制。這是一個非常重要的步驟,當你將要建立一些圖像處理網站時,你需要分配足夠的內存來處理輸入和輸出圖像。

如要更進一步總是上面的鏈接:

  • 背景信息
  • TWEAK因子?

    猜猜是什麼?設置memory_limit不是一門精確的科學。這就是爲什麼 我們有「調整因子」,一個基於現實生活經驗的乘數。在 練習中,1.5-1.6沒問題,在大多數情況下1.8是相當安全的。

    在php.net上有一個腳本根據您自己的圖像找到近似的「調整因子」 。該腳本在每個圖像上運行單個圖像創建功能 ,測量運行時內存使用情況並給出平均值,這是「調整因子」乘數 - 最有可能的是,您也會得到一個介於1.5-1.8之間的數字。但是,您可以添加一些 imagecopy取樣代碼來模擬整個調整大小過程。 http://php.net/manual/en/function.imagecreatefromjpeg.php#76968

    PHP中的圖像處理由GD擴展處理。如果您有 有時間找出我們需要調整因子的原因,請讓我知道 。 不幸的是,常見問題並沒有給予太多的線索:

    http://www.libgd.org/FAQ_PHP#Why_does_gd_cause_my_PHP_script_to_run_out_of_memory.3F

    每一個形象,有一個「調整因子」估計內存限制,這將是適合沒有得到致命錯誤來調整。

    +0

    這很有趣,但它並沒有真正回答關於爲什麼致命錯誤對於單個圖像不一致的問題。 – suncat100

    +0

    我繼續更新我的問題,以正確回答:) – Hooli

    +0

    是的,我看到了:)我可以「計算」內存需求,但它仍然沒有回答爲什麼特定圖像的memory_requirement波動或至少充分刷新處理圖像的腳本後自行解決。 – suncat100

    相關問題