2012-11-15 32 views
0

标题访问它第一次是相当清楚的:运行PHP脚本只即使100.000用户在同一时间

我有一个PHP文件,我希望它是唯一的,即使100.000用户尝试第一次执行同时访问它。

+0

什么是用例?你有什么尝试,为什么没有工作? – bdares

+1

这是一个笑话吗? “即使100个用户同时访问它,我也希望它能够第一次被执行”......在你问之前请考虑一下。 – jeremy

+0

有3个以上的答案,这个问题显然有优点,不管问题有多短。为什么downvote? – Zak

回答

2

你可以这样做用锁文件,你写的服务器,如:

if (!is_file("visited_once.txt")) 
{ 
    //you're the one 
    file_put_contents("visited_once.txt", ""); 
} 

但也许因为我不是100%肯定的文件解决方案,适用100.000并发请求数据库的解决方案会更复杂。

创建表

CREATE TABLE visited 
(
    visit int NOT NULL, 
    UNIQUE (visit) 
); 

做这样的事情上要求

try 
{ 
    $db->query("INSERT INTO visited VALUES (0)"); 
    //you're the one 
} 
catch (Exception $ex) 
{ 
    //nope! Already visited 
} 

本采用了独特的密钥,并且依赖于数据库的一致性。

+0

我接近100%确定文件解决方案(如它所写)会在脚本被100.000个并发请求命中时窒息。如果使用['flock()'](http://php.net/manual/en/function.flock.php)并请求独占锁定,你可能会有更好的运气。 – NullUserException

+0

这就是为什么我包含数据库示例。我非常信任MySQL。 –

+0

这是我想的最好的答案,但是我用if(mysql_errno()== 1062)代替try/catch – Aleix

0
<?php 
if(file_exists('check.txt')) exit; 
file_put_contents('check.txt','1'); 
...your code... 
?> 
0

我会写一些文件作为脚本正在执行的标志,并在脚本的末尾删除文件。在脚本开始时检查文件是否存在。

例如为:

$flag_file = 'flag.tmp'; 
if (file_exists($flag_file)) exit(); 
file_put_contents($flag_file, 1); 

// rest of the script 

unlink($flag_file); 
0

你可以写一个txt文件或MySQL表?如果是这样设置的文本文件中的字符或MySQL表为0的字段,以及PHP脚本第一次运行时,将其设置为1,并使用if语句:

RETRIEVE YOUR NUMBER VIA TXT OR MYSQL 
$myVar = YOUR NUMBER; 

if ($myVar > 0){ 
//don't run 
} 
else{ 
//run 
}