2012-01-20 14 views
2

私は私のコントローラでこれを持っている:redirect()の後に関数をバックグラウンドプロセスとして実行するにはどうすればよいですか?

function foo() { 
    // my code 
    redirect(site_url('competitor/main'), 'refresh'); 
    $this->foo2(); 
} 

function foo2() { 
    // upload a file 
} 

私はredirect()メソッドを使用した後foo2()ランニングを保つにはどうすればよいですか?

redirect()の後にfoo2()と呼ぶ理由は、アップロード時間を節約したいからです。ユーザーがsite_url('competitor/main')にファイルをアップロードすると、機能はfoo()になり、すぐにcompetitor/mainページにリダイレクトされ、foo2()がバックグラウンドで実行されます。

答えて

1

コードネイターのredirect()ファンクションexit sは、ロケーションヘッダーを送信した後です。したがって、リダイレクトする前に関数を呼び出してください。

$this->foo2(); 
redirect('competitor/main', 'refresh'); 

注:相対URLを使用する場合は、ここで、リダイレクト機能が追加されますsite_url()の必要はありません。

あなたがそれを行うことはできませんいくつかの理由で、その後、ネイティブPHPでヘッダを送信する場合、私はfoo2()が何をするかわからないんだけど、これはちょっとあやふやに見える...


site_url('competitor/main')上のユーザのアップロードファイルは、それがその後すぐに戻って競争者/メインページにリダイレクトfoo()機能に行きますとfoo2()は、バックグラウンド・プロセスで実行されます

header("Refresh:0;url=".site_url('competitor/main')); 
$this->foo2(); 
exit; 

エラーを処理する方法がないため、これはおそらくアップロードを処理する方法ではありません。

  • (必要であれば、ステータスメッセージで)お好みのページにリダイレクトし、別のURLへ

    • アップロード、プロセス、ファイル、アップロードのフォームを持っている:そこ私がお勧めすることができ、他のいくつかの方法がありますに投稿すると、そのページは現在の状態に保たれます。
    • 詳細:XMLHttpRequest/AJAXを使用してファイルをアップロードするには、javascriptを使用します。 thisnumberscriptsavailableがあります。
    +0

    これは当てはまりません。私はこれを試してみたところfoo(){sleep(30); }それは間違いなくページの読み込みをブロックします。 – Ben

    +0

    @Benこれは期待していますが、最初に 'redirect()'を呼び出すと、 'foo()'はまったく実行されません。 –

    +0

    これは本当ですが、前に置くとバックグラウンドで実行されないため、問題を解決できません。以下の私の提案を参照してください。 – Ben

    0

    アップロードを実行したまま同じウィンドウを別の場所にリダイレクトすることはできません。 @Wesley Murchの例では、直ちにリフレッシュが開始されますが、アップロードが完了してからページが完全に読み込まれるのは、ユーザー側で何時でも保存されません。

    phpは、shell_execを使用してバックグラウンドで実行できますが、アップロードはできません。私はあなたがバックグラウンドで続行したい場合は、Javascriptでアップロードのためのポップアップウィンドウを作成することをお勧めします。

    それ以外の場合はUploadifyのように試してください。アップロードを速くすることはできませんが、ユーザーに明確なアップロードの進捗状況が表示され、素敵な体験をすることができます。

    関連する問題