2011-11-09 10 views
1

私はユーザーが画像をアップロードできるフォーラムを構築しています。画像はS3バケットに移動する前に一時的に(私は進行状況バーでアップロードすることができます)私のWebサーバーに保存されます。私はこれを行うための華麗な方法を考え出したていないが、私は次のことが理にかなっていると思う:別のスクリプトからPHPスクリプトをリクエストして移動する

  1. アップロード画像(S)Webサーバに彼を提出するユーザーのためのプログレスバーで
  2. 待ちをXHRを使って
  3. リンク解除画像を投稿し、彼は彼に彼のポスト
  4. コールS3に残りの画像をアップロード(そして終わったらポスト体に画像のURLを更新)URL
  5. リダイレクトユーザーに含めて最大終わりませんでしたトピックに投稿

ステップ4はかなりの時間がかかる可能性があるので、私はバックグラウンドでS3アップロードスクリプトを呼び出すことができ、ユーザーが待機しないようなcronのソリューションを探していますそれが完了するために。

理想的には、私はつまり、私は以内に私のフレームワークをURL を要求し、クエリにいくつかの画像IDを渡すことができます解決策を探しています:

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

が、私はこのためのcURLを使用することができます目的?それとも、exec()でなければならないのですが、PHPスクリプト(php-cli)の代わりにURL(wget?)を実行させることはできますか?

ありがとう、ヒープ!

答えて

0

は私が共有して嬉しい。この問題への解決策を見つけました。私は実際にそれを見つけましたが、いくつかの微調整が必​​要でした。ここに行く:

  1. ソリューションはexec()またはshell_exec()のいずれかが必要です。とにかくすべての出力が破棄されるため、どちらを使用するかは重要ではありません。私はexec()を選んだ。

  2. 私はシステムレベルのPHPインストールではなくMAMPを使用しているので、MAMPパッケージ内のPHPバイナリを指す必要がありました。(これは実際に違いがありました)私はPHP_BINという名前の定数でこのパスを定義することにしました。そのため、ローカル環境とライブ環境に異なるパスを設定できます。この場合:

  3. define(PHP_BIN, '/Applications/MAMP/bin/php/php5.3.6/bin/php');は理想的には、私は私のWebフレームワークの代わりに、いくつかの孤立したシェルスクリプト内でスクリプトを実行したかったです。私は、引数としてURLを受け入れラッパースクリプトを書き、my_curl.phpそれを命名:

    this SO question
    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. 私はバックグラウンドでシェルコマンドを実行する方法を見つけました。これは、ユーザーが終了するまで待つ必要がないために必要です。魔法のように

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

作品:

  • は最後に、私は、バックグラウンドで他の(またはANY)のWeb要求を実行するPHPコードのこのビットを実行します!お役に立てれば。

  • 1

    PHPの

    register_shutdown_function() 
    

    はあなたの友達 [reference]です。

    スクリプトが終了している間、シャットダウン機能は動作し続けます。

    したがって、すべてが利用可能な場合は、フィナーレのページとexitを提出してください。登録されたシャットダウン機能が継続され、時間のかかるジョブが実行されます。

    私の場合、私はクラスCShutdownManagerを用意しました。スクリプト終了後に呼び出されるいくつかのメソッドを登録することができます。たとえば、私はCShutdownManagerを使用して、不要になった一時ファイルを削除します。

    +0

    これは聞いたことがないが、正確には*私が必要とするように聞こえる)ありがとう! – oscaralexander

    +0

    このメソッドを使用した人はほとんどいません。そして、より興味深いものを発見する;-)投票して答えを受け入れることを忘れないでください。 – SteAp

    +0

    私はマニュアルで見つけることができません:私が電話をかけると、シャットダウン機能が実行されますか?出口の代わりにヘッダーのリダイレクト?私は自分の投稿を処理した後、トピックページにリダイレクトする必要があります。 – oscaralexander

    0

    は、次のステートメントを試してみてください。

    shell_exec(php scriptname); 
    
    関連する問題