一次为一个客户服务

时间:2012-11-22 12:49:07

标签: php

我需要加上一个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...,因为当我第二次加载页面时,第一次应该将foo设置为true

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

3 个答案:

答案 0 :(得分: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');

?>

答案 1 :(得分: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);

?>

答案 2 :(得分:-1)

您的apc设置是否正确? apc_fetch在错误时返回false。