我需要加上一个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
的合法(但是错误的)使用吗?我使用的是错误的工具吗?
答案 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。