2017-04-01 6 views
1

私はLaravel、PHP7、PHP-FPM、APCu、NGINXを使用しています。ユーザExit後のPHP操作の継続

ユーザーがファイルをアップロードできるHTMLフォームがあり、Upload.phpに接続します。

ファイル処理:/メディア

  • への/ tmpから

    1. 検証
    2. 移動サムネイル
    3. を作成する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 = trueのようなスクリプトに他のboolを持っています。 while(true)はどのようにignore_user_about(true)を表すと私は設定した別のブールを知っていますか?

  • +1

    タスクをキューに渡すことを検討できます。 Laravelには、画像を扱う方法に関するドキュメント(base64でエンコード)があります。それが一つの可能​​性です。 – Mark

    答えて

    1

    ユーザーの中止は、PHPで簡単に取り込めることではありません...通常、スクリプトは、クライアントがブラウザに何かを送り返そうとして実際にうまくいったことを検出するまで実行されます...あなたの場合、あなたが処理中に何も返送していない場合は、ユーザーが接続を閉じても完了まで実行する必要があります... PHPがシャットダウンしたときに呼び出されるregister_shutdown_function()を使うことができます。 Laravelがフックを持っているので注意してください...タイムアウトが発生するとLaravelエラーが最初に発生します.2番目...しかし、正常にシャットダウンした場合、または中断した場合は、その機能でわかります...

    関数を使って遊ぶには、次のようなルートを作成しました:

    ここで
    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にログを見つける。)...

    をキャッチすることができますしばらくは、(1)アウト時間前に、接続損失を検出し、ブラウザに「Ping]を」エコーので、あなたがしばらくエコーを削除し、非バッファに置き換える場合は、しかし...、シャットダウン機能にabordの呼び出しを取得します仕事$ cnt ++;か何か、そして、あなたが中断した場合でも、あなただけのタイムアウトを取得します...接続閉鎖を検出しなかったスクリプト...あなたのハンドラは、他のすべてのハンドラの後に実行さ

    注...また

    スクリプトがシャットダウンするたびに実行されるので、デフォルトでは:上記の切り替え...当然、このスクリプトはwhile(1)のために完了しません...あなたが正常終了動作を確認したい場合はちょうど私が、これはおそらく、クリーンアップを行うための最も簡単な方法だと思います...

    をそれを削除...そこにそれをキャッチし、いずれかが必要にクリーンアップするん...

    希望に応じる

    +0

    これは私が統合をテストするのに時間がかかることがあります。 –