2012-09-12 44 views
4

我有一個PHP文件(網站上的功能) - 允許用戶從他的帳戶在另一個網站上導入數據。
我也需要從那裏複製大量的圖像,每次他想要導入數據。
例如500圖片,每個300-500Kb是最小的。預計這個數字很容易爲一個用戶的2000個圖像。
如何使用PHP在服務器上覆制2000圖像真的很快?

每幅畫面的步驟是:

  • 獲取圖片URL
  • 圖像從URL(通過使用imagecreatefromjpeg和其他人)在我的服務器上
  • 保存它(使用make功能,如imagejpeg,imagepng等)

它已經花了很長時間來執行此代碼(超過8分鐘)。
我意識到這是很多數據,但有沒有另一種可能的方式來做到這一點?
也許在背景上運行復制,或同時複製許多圖片。
只是想知道如果有一個是專門爲這個任何技術,我不知道這件事情。
或者除了將圖像外包給某些圖像託管服務器並僅保留縮略圖外,沒有別的辦法。

感謝。

+0

是在本地服務器或遠程服務器上的圖像? – Baba

回答

3

運行並行請求有沒有很多的信息在這裏繼續下去。什麼操作系統正在使用?源代碼網站如何「遠程」?圖像的格式是什麼?

如果其他站點是遠程的(即,不同的託管公司),你將有主要的問題是速度它在源服務器可以管到你的機器中的數據了。

一個大問題,雖然是「什麼格式是在圖像的時刻?」。如果圖像已經是JPEG,那麼檢索並再次轉換成JPEG會降低質量(儘管稍微有點)。更好的做法是直接複製圖像文件。這將消除您的PHP應用程序重新編碼JPEG所花費的時間。問問你自己 - 你真的需要轉換的圖像?

取決於什麼操作系統命令,必須可用,你可能會更好過呼籲其辦理過戶(例如在Linux中wget)應用。我已經使用wget從遠程服務器檢索文件到本地文件,並且運行起來並不困難。

記住 - 你在你的轉移有更多的步驟,時間越長,是要採取。目前,您有:

  • 檢索
  • 轉換
  • 寫作

全部由PHP(大概是從最慢會最快)

是否源主機提供了一個處理檔案或出口設施爲客戶?如果是這樣,那麼可以用它來集中傳輸文件嗎?

儘可能多地利用PHP會使過程更快。調用系統功能(例如,wgetftpsshimagemagick等)將使(PHP 的阿帕奇外)的東西更快仍然

0
  1. 設置某種類型的隊列用於處理圖像導入 - 這樣用戶不會等待,腳本也不會超時。

  2. 嘗試用curl_multi_init()

0

這是一個PHP函數,你可以用它來從互聯網上下載一個文件($網址參數)到服務器上的本地文件($ FILE_PATH參數):

function download_file($url, $file_path) { 
    $out = fopen($file_path, 'wb'); 
    if ($out == FALSE){ 
     print "File not opened<br>"; 
     exit; 
    } 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_FILE, $out); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_exec($ch); 
    //echo "<br>Error is : ".curl_error ($ch); 
    curl_close($ch); 
    fclose($out); 
} 

你可以把它像這樣:

$url = 'http://upload.wikimedia.org/wikipedia/commons/thumb/1/1f/Iss030e015472_Edit.jpg/352px-Iss030e015472_Edit.jpg'; 
download_file($url,'/var/www/www.mysite.com/public_html/images/image_user1.jpg'); 

麥確保你保存文件的文件夾對你的apache用戶有寫權限。另外請確保你已經加載了cURL php擴展以使其正常工作。

此功能應該比您的imagecreatefromjpeg方法快得多。嘗試一下,如果你仍然覺得它很慢,你可以通過實現一個隊列來運行多個請求,如Gabriel所建議的,並行運行curl_multi_init

1

線程似乎是顯而易見的答案...

https://github.com/krakjoe/pthreads

我在什麼似乎數百人說PHP沒有穿線的可能性海一個聲音......我認爲目前的趨勢,轉彎爲你做你的線程是可憐的,而吹捧是一個更糟糕的解決方案,這種事情的開銷必須是可怕的...

PHP一直有工具到多線程,它不會在沒有它們的地方,因爲它不會支持任何多線程的w eb服務器。這只是它不是該語言的設計目標,迄今爲止將用戶態線程引入PHP的外部努力是不可用的,甚至在Google代碼上也不存在......我需要PHP爲即將到來的項目提供線程,所以穿線我將... ...所以你和其他人,所以,這是我的禮物,世界/網絡,享受:)

相關問題