2

一度に1つのリクエストのみを処理する必要があるphpスクリプトを実行する必要があります。つまり、ユーザーがページを要求した場合、前の要求が完全に処理されなくなるまで、ユーザーにサービスを提供してはなりません。

私はそれを達成するためにアプリケーション変数で遊んでいましたが、私がよく理解していれば、phpにはそのようなものがないことがわかります。

私はapcそれから、このコードをまとめて使用しようとしました:

<?php

  while (apc_fetch('foo')) {
    echo "waiting...\n";
    sleep(1);
  }

  $foo = true;
  apc_store('foo', $foo);

  echo "results.";
  sleep(10);

  apc_delete('foo');

?>

しかし、このページを2回開くとresults.、両方に表示されます。2回目にページをロードするとき、最初のページはに設定されてwaiting...いるはずなので、私もいくつか読むことを期待していました。footrue

これは合法的な(しかし誤った)使用apcですか?間違ったツールを使用していますか?

4

3 に答える 3

0
<?php

  while ($var = apc_fetch('foo')) {
    echo "apc_fetch positive, got ".var_export( $var, true)."\n";
    sleep(1);
  }
  echo "apc_fetch was negative, continuing. \n";

  $foo = "asd";
  apc_store('foo', $foo);
  if( !apc_fetch('foo')) {
     echo "Btw, apc_store was not successful with foo\n";
  }

  echo date('c').": results.";
  flush();
  sleep(10);

  apc_delete('foo');

?>
于 2012-11-22T13:16:08.537 に答える
0

私は自分の質問に答えるのは好きではありませんが、結局、これは私がやりたいことをするために私が見つけた最も簡単な方法です:

<?php

$fp = fopen("lock.txt", "r");

if (flock($fp, LOCK_EX)) {  // acquire

  echo "processing...";

  //if (isset($_GET['sleep'])) sleep(5); // decomment this line to test:
                                         // load "script.php?sleep=1" and then
                                         // load "script.php". The second page will
                                         // wait until the first one ends.

  flock($fp, LOCK_UN); // release

} else {
  // exception handling
  echo "ERROR: unable to flock()";
}

fclose($fp);

?>
于 2012-11-29T16:24:23.627 に答える
-1

apcの設定は正しいですか?apc_fetchは、エラー時にfalseを返します。

于 2012-11-22T13:07:41.617 に答える