Php 一次服务一个客户

Php 一次服务一个客户,php,Php,我需要加入一个php脚本,该脚本一次只能满足一个请求。也就是说,如果用户请求该页面,则在前一个请求未完全处理之前,该页面不得为其提供服务 为了实现这一点,我会使用应用程序变量,但如果我理解得很好,我发现php没有类似的功能 我尝试使用apc,然后将以下代码组合在一起: <?php while (apc_fetch('foo')) { echo "waiting...\n"; sleep(1); } $foo = true; apc_store('foo'

我需要加入一个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');

?>

但是如果我打开两次这个页面,我看到的只是
结果。
。我还想读一些
等待…
,因为当我第二次加载页面时,第一次应该将
foo
设置为
true


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

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

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


<?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');

?>

我不喜欢回答自己的问题,但最终这是我找到的做我想做的事情的最简单的方法:

<?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);

?>

我不喜欢回答自己的问题,但最终这是我找到的做我想做的事情的最简单的方法:

<?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);

?>


这不是apache的标准行为(一次服务一个用户请求)(使用一个处理器时)吗?不管怎样,为什么不使用flock()或PHP会话变量呢?(无法回答apc,抱歉)您在这里的路径完全错误,您所描述的将永远不会起作用。假设您有正在执行的请求1,而请求2已排队-请求2不会说“等待”,它会挂起浏览器,直到服务器执行请求2的代码。这是您所能做的,您可以延迟执行,或者您可以简单地选择不执行任何工作代码,并通知您的客户#2此时无法完成请求。这里没有“实时更新”,正确的方法是使用信号量。一个快速的Google向我显示PHP支持它们。@N.B.不太支持。您可以将大量数据(例如,
)扔到浏览器并刷新这些数据。至少Firefox会显示“等待…”。它很难看,不应该在生产服务器上使用,但它可以工作。如果我必须实现这样的东西,我会使用Ajax动态更新我的页面和某种面向数据库的信号量或队列。这难道不是apache的标准行为(一次服务一个用户请求)(在使用一个处理器时)?不管怎样,为什么不使用flock()或PHP会话变量呢?(无法回答apc,抱歉)您在这里的路径完全错误,您所描述的将永远不会起作用。假设您有正在执行的请求1,而请求2已排队-请求2不会说“等待”,它会挂起浏览器,直到服务器执行请求2的代码。这是您所能做的,您可以延迟执行,或者您可以简单地选择不执行任何工作代码,并通知您的客户#2此时无法完成请求。这里没有“实时更新”,正确的方法是使用信号量。一个快速的Google向我显示PHP支持它们。@N.B.不太支持。您可以将大量数据(例如,
)扔到浏览器并刷新这些数据。至少Firefox会显示“等待…”。它很难看,不应该在生产服务器上使用,但它可以工作。如果我必须实现这样的东西,我会使用Ajax动态更新我的页面和某种面向数据库的信号量或队列。