2011-11-09 124 views
1

我正在構建一個論壇,允許用戶上傳圖片。在移動到S3存儲桶之前,圖像將臨時存儲在我的Web服務器上(這樣我可以使用進度條上載它們)。我還沒有想出這樣一個絕佳的方法,但是我覺得有以下有道理:從另一個腳本請求一個PHP腳本,並移動

  1. 上傳圖像(S)使用XHR與進度條
  2. 等待用戶提交Web服務器他發佈
  3. 取消鏈接圖片,他最終沒有包括在他的崗位
  4. 調用(完成後,並在後期體更新圖像的URL),它會將剩餘的影像而S3一個URL
  5. 重定向用戶到他在主題

現在,因爲第4步可能需要相當長的時間,我正在尋找一個像解決方案,我可以在後臺調用S3上傳腳本,並沒有讓用戶等待爲它完成。

理想情況下,我正在尋找一個解決方案,允許我請求我的框架內的URL 並通過一些圖片ID的查詢,即:

http://mysite.com/utils/move-to-s3/?images=1,2,3 

我可以使用捲曲此目的?或者,如果它必須是exec(),我還可以讓它執行URL(wget?)而不是PHP腳本(php-cli)嗎?

謝謝你!

回答

0

我找到了解決這個問題,我很高興與大家分享。我真的發現它,但它需要一些調整。這裏所說:

  1. 的解決方案需要既exec()shell_exec()。你使用哪一個並不重要,因爲所有的輸出都會被丟棄。我選擇了exec()

  2. 因爲我使用的是MAMP,而不是系統級的PHP安裝,所以我需要指向MAMP包內的PHP二進制文件。(這實際上有所不同。)我決定在一個名爲PHP_BIN的常量中定義此路徑,以便爲本地環境和實況環境設置不同的路徑。在這種情況下:

    define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php');

  3. 理想情況下,我想執行我的web框架,而不是一些孤立的shell腳本里面的腳本。我寫了接受一個URL作爲參數包裝腳本,並把它命名爲my_curl.php

    if(isset($argv[1])) 
    { 
        $url = $argv[1]; 
    
        if(preg_match('/^http(s)?:\/\//', $url)) 
        { 
         $ch = curl_init(); 
         curl_setopt($ch, CURLOPT_URL, $url); 
         curl_setopt($ch, CURLOPT_HEADER, 0); 
         curl_exec($ch); 
         curl_close($ch); 
        } 
    } 
    
  4. this SO question我發現在後臺執行shell命令的方式。這是必要的,因爲我不希望用戶必須等到它完成。

  5. 最後,我跑的PHP代碼,此位執行其它(或ANY)Web請求在後臺:

    exec(PHP_BIN . ' /path/to/my_curl.php http://site.com/url/to/request 
    &> /dev/null &'); 
    

就像一個魅力!希望這可以幫助。

1

PHP的

register_shutdown_function() 

是你的朋友 [reference]

當腳本終止時,關閉功能繼續運行。

因此,如果一切都可用,請提交結局頁面和exit。註冊的關機功能繼續並執行耗時的工作。

就我而言,我準備了一個類CShutdownManager,它允許註冊腳本終止後調用的幾種方法。例如,我使用CShutdownManager來刪除不再需要的臨時文件。

+0

從來沒有聽說過,但它聽起來像*完全*我需要:)謝謝! – oscaralexander

+0

很少有人曾經使用過這種方法。還有更多有趣的東西要發現;-)不要忘記投票並接受答案...... – SteAp

+0

哦,我似乎在手冊中找不到,但是:如果我打電話給標題重定向而不是退出?如上所述,我需要在處理他的帖子後將用戶重定向到主題頁面。 – oscaralexander

0

試試下面的語句:

shell_exec(php scriptname);