2010-11-29 8 views
0

私はPHPでいくつかの重い画像の操作をしていると私は物事がどのように進行しているかを示したいと思います。だから私はこのような何かをやってみました:セッションを使用して重いPHPの進行

for($i = 0; $i < $rowCount; $i++) { 
    session_start(); 
    $_SESSION['progress'] = $i/ $rowCount; 
    session_write_close(); 

    processLine($i); 
} 

をそして私は、AJAXは基本的に$ _SESSION [「進歩」]の値を返す別のphpファイルへの呼び出しを使用しています。問題は、設定されていません。これはファイルごとにセッションを2回以上開始すべきでないためですか?セッションを開いて各行間を閉じないと、SESSION変数がロックされ、画像操作全体が完了するまで私のポーリングファイルは処理されません。

セッションを使用してこれを動作させる方法はありますか?データベースやファイルに進捗状況を書き込むとうまくいくかもしれませんが、遅いですし、ipsやセッションIDを使用してユーザーを特定するための作業が必要になります。セッションを使用すると、これらのことが処理されます。

答えて

1

これは、phpがセッションファイルをロックするためです。同じセッションを使用している最初のプロセスがファイルをロックすると、ajax呼び出しは同じセッションIDを使用します。したがって、同じセッションファイルにアクセスしようとしますが、最初のプロセスが終了するまでphpによってロックされる。

これはあなたの質問に対する答えです。あなたがそれを修正する方法を知りたいなら、私は確信が持てません、私はそれについて考える必要があります。

+0

そうですが、私はそれが問題であると考えていましたので、そのプロセスでセッションのロックを解除できないので、他のプロセスが進捗状況をチェックするために使用できますか? – marcusklaas

+0

いいえ、例えば、処理中のイメージ名の後ろに名前をつけた一時ファイルを作成し、その一時ファイルに進行状況を保存すると、Ajaxはanotにアクセスする必要がありますcheckstatus.php?f = filename – Dmitri

+1

また、memcacheを使用すると、進行状況をmemcacheに保存する方がずっと速く、速くても、一時ファイルを使用するよりも速くなります。 – Dmitri

0

すべての正直なところ、機能を使用する各PHPスクリプトの最上部にはsession_start();機能があります。 session_write_close();のような他のすべてのsession_start関数と他のすべてのセッション関数を削除します。

セッションを閉じたり、必要でないものを使用したりしないでください。値が返されない場合は、ブラウザのJavaScriptコンソールを再度チェックして、返されたPHPエラーや、ファイルのディレクトリ内のerror_logという名前のファイルを確認することができます。

それ以外の場合は、すべて正常に動作するはずです。私は過去に似たようなタイプのことをしてきましたが、うまくいきました。私はあなたの問題をデバッグするのに役立つことを願っています

+0

いいえ、これは実際に私の問題を解決することはありません。 2つのPHPファイルが同じセッションで同時に動作することはできないので、私はまだこのように画像操作を行っている間に進捗変数の値を読み取ることができません。 – marcusklaas

+0

同じことができるはずです画像操作スクリプトが実行を終了するまで、セッション値をグローバルに更新しない限り、読み取り/書き込みのためにセッションが2回開かれました。画像操作スクリプトが実行される前にセッションを開始し、その変数を0%に設定しようとします。 –

関連する問題