2017-04-01 33 views
1

我正在使用Laravel,PHP7,PHP-FPM,APCu和NGINX。用戶退出提前後繼續PHP操作

我有一個HTML表單,用戶可以上傳文件,它連接到upload.php的。

文件處理:

  1. 驗證
  2. 移動從/ tmp目錄/媒體
  3. 創建縮略圖
  4. 創建數據庫記錄

一旦PHP腳本到達有一點,即使t也能繼續運行他用戶提前退出上傳頁面?否則一個流氓文件將被保留在沒有數據庫條目的目錄中。

// Move uploaded file from /tmp to /media 
Input::file('file')->move("/var/www/mysite/media", $image); 

// Continue even if user exits early 
// prevent a file in /media from not having a database record 

// Thumbnail creation and other operations here 
// May take several seconds 

// Save database record 
$image = new Gallery(); 
$image->name = $name; 
$image->created_at = $date; 
$image->save(); 

我應該使用ignore_user_abort(true)並在while(true)包住操作?

我在劇本其他布爾變量如$upload = truewhile(true)知道如何代表ignore_user_about(true)而不是我設置的另一個布爾?

+1

你可以考慮把任務交給隊列。 Laravel有關於如何處理圖像的文檔(base64編碼)。那將是一種可能性。 – Mark

回答

1

用戶中止是不是在PHP搭上一件容易的事情......通常情況下,你的腳本將運行至實際檢測客戶端通過嘗試發送的東西回瀏覽器...在你的情況進行打包,因爲你在處理過程中沒有發回任何東西,你應該運行完成......即使用戶關閉了連接......爲了確保,你可以使用register_shutdown_function(),它將在PHP關閉時調用...現在要小心,因爲Laravel也有掛鉤...所以任何超時都會首先觸發Laravel錯誤,但是,您可以在該功能中知道它是否正常關閉或已中止...

爲了玩功能,我創建了這樣的路線:

use Illuminate\Support\Facades\Log; 

Route::get('/abort', function(){ 
    Log::info('Entering abort route...'); 
    set_time_limit(5); 
    register_shutdown_function(function(){ 
     Log::info('Entering shutdown function... status: ' . connection_status()); 
     switch(connection_status()){ 
      case CONNECTION_ABORTED: 
       Log::info('Connection Aborted'); 
       break; 
      case CONNECTION_TIMEOUT: 
       echo 'Connection Timeout'; 
       break; 
      default: 
       echo 'All ok, user did not abort and function did not time out.'; 
     } 
    }); 

    while(1){ 
     echo 'Ping<br />'; 
    }; 
}); 

在這裏,您可以趕上(我用的是Laravel記錄爲中止......在日誌中找到存儲/日誌/ laravel.log)...

現在有趣的是,如果你放棄這一點,你會因爲while(1)在瀏覽器中回顯'Ping',在超時之前檢測到連接丟失...但是,如果刪除while中的回顯並將其替換爲非緩衝區工作$ C++ ++;或東西,那麼即使你放棄,你將只能得到超時...腳本沒有檢測到連接收...

請注意,您的處理程序的所有其他處理程序運行後...

而且,它每次腳本關閉時都會運行...所以即使所有內容都很好......就像默認情況下:在上面切換......自然,由於while(1)...,腳本不會運行到完成狀態......只是,如果你想看到正常的完成行爲刪除...

我想,這大概做清理的最簡單的方法...趕上它在那裏做任何清理就需要...

希望這有助於...

+0

這可能需要一段時間才能測試集成。 –