5

以下は、cometの実装を成功させるために使用するコードです。

$lastmodif = isset($this->params['form']['timestamp']) ? $this->params['form']['timestamp'] : 0;
$currentmodif = $already_updated[0]['Update']['lastmodified'];

while ($currentmodif <= $lastmodif)
{
    usleep(5000000);
    clearstatcache();
    $already_updated_new = $this->Update->find('all',array
    (
        'conditions' => array
        ( 
            'Update.receiver_id' =>  $this->Auth->user('id'),
            'Update.table_name' =>  "request_responses"
        )
    ));
    $currentmodif = $already_updated_new[0]['Update']['lastmodified'];
}

$already_updated[0]['Update']['lastmodified']テーブルの最後に更新されたタイムスタンプを取得するためのクエリ結果です。

上記のコードでは、$lastmodifと$currentmodifは、彗星の応答が成功するたびに渡されるタイムスタンプです。

しかし、今の問題は、同じページの他のリンクをクリックしても何も起こらないということです。

usleepが他のHTTPリクエストをブロックしていると思います。

私はmysqlとcakephpを使用しています。この問題を解決するために何をすべきかを教えてください。

ページが呼び出されたときにフラッシュしようとしましたが、出力がすでに送信されているため、ヘッダーエラーを変更できないことが示されています。

ありがとう。

4

4 に答える 4

5

私は何度か同じような状況に遭遇しました。スリープ状態のスクリプトによってセッションがブロックされているようです。

CakePHPでそれを解決する方法:スクリプトの最初に
呼び出します。 CakeのSessionComponentまたはHelperを介してこれを行う方法はありません:スクリプト内の何かがsessionを使用する場合-Cakeはセッションを再開し、同じセッションを使用するすべてのリクエストを再度ハングさせます。この場合、スリープ前または終了するまでに時間がかかる操作の前にセッションを閉じる必要がありますsession_write_close();

于 2013-02-20T17:02:14.563 に答える
1

スクリプトがセッションを使用している場合、そのような動作に気付く可能性があります。PHPは、スクリプトが完了するまでセッションファイルをロックします。

これは、スクリプトがセッションを開始すると、前のスクリプトがロックを解放する(または終了する)まで、同じセッションIDを使用してセッションを開始しようとする他のスクリプトがブロックされることを意味します。

この回避策は、長いプロセスの前にセッションのロックを解除することです。

  • 電話session_start()
  • セッション変数の読み取り/書き込み
  • 電話session_write_close()
  • 長い処理を行う
于 2013-02-17T10:36:53.133 に答える
0

一緒に来る誰かが解決策を持っているかもしれない場合に備えて、あなたが使用しているcakephpのバージョンを共有できますか?

Cakeにはセッションコンポーネントがあります:http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html

およびセッションヘルパー: http: //book.cakephp.org/2.0/en/core-libraries/helpers/session.html

于 2013-02-20T19:41:08.920 に答える
0

はい、usleepはそれ以上のリクエストをブロックしています。ホスティング環境によっては、利用できるプロセスの数が限られている可能性があります。チャットに複数のユーザーがいると仮定します->利用可能なユーザーがいない限り、すべてのユーザーがブロッキングプロセスを発行します。そのため、他の「リンク」がタイムアウトします。

クライアントブラウザ側で待機を実装することをお勧めします。例:

setTimeout(function() {
    fetchAndPrintTheNewChats();
}, 50000000);

PHPコード内でこれを行うためのどのアプローチでも、同じ問題が発生します。

于 2013-02-17T10:10:28.960 に答える