2

我需要放置一个每次只能服务一个请求的 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');

?>

但是如果我打开这个页面两次,我看到的只是results.两个。我也期待阅读一些内容waiting...,因为当我第二次加载页面时,第一个应该设置footrue.

这是对 的合法(但错误)使用apc吗?我是否使用了错误的工具?

4

3 回答 3

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 回答
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 回答
-1

你的apc设置正确吗?apc_fetch 在错误时返回 false。

于 2012-11-22T13:07:41.617 回答