Php 计数器使用多线程请求避免重复
我正在制作一个脚本,每次请求/运行这个脚本时,它都会获取mysql MyISAM表的数据。 查询如下所示: 从表中选择*限制$offset,10 问题是$offset在第一个请求中必须为0,在第二个请求中必须为10,在第三个请求中必须为20,以此类推。 然后我创建了一个新表,其中有一个计数器,用于$offset,每次脚本执行时递增+10 请求 您必须知道脚本将同时有许多请求。请求不是用户(访问) 请求是运行在5台以上PC上的我的软件,并且这些软件中的每一个都与 超过1000个线程正在请求此脚本。然后我在寻找一个解决方案,不返回 如果两个或多个线程同时请求此脚本,则这些线程将获得相同的结果。 此外,我需要计数器将增量完美Php 计数器使用多线程请求避免重复,php,mysql,Php,Mysql,我正在制作一个脚本,每次请求/运行这个脚本时,它都会获取mysql MyISAM表的数据。 查询如下所示: 从表中选择*限制$offset,10 问题是$offset在第一个请求中必须为0,在第二个请求中必须为10,在第三个请求中必须为20,以此类推。 然后我创建了一个新表,其中有一个计数器,用于$offset,每次脚本执行时递增+10 请求 您必须知道脚本将同时有许多请求。请求不是用户(访问) 请求是运行在5台以上PC上的我的软件,并且这些软件中的每一个都与 超过1000个线程正在请求此脚本。
function GetAndUpdateCounter($numberToAdd)
{
$link = mysql_connect('localhost','root','abcd1234');
if(!$link) die ('Could not connect to database: '.mysql_error());
mysql_select_db('dbcounter',$link);
// in the 2 lines below I have my question about what happend if 2 or
// more threads/request do this at same time, will get same result and will do same update
$result = mysql_query("SELECT id FROM counter");
mysql_query("UPDATE counter SET id=(id+$numberToAdd);");
$row = mysql_fetch_array($result, MYSQL_ASSOC);
mysql_close($link);
return $row['id'];
}
调用函数的示例
$offset = GetAndUpdateCounter(10);
$q=mysql_查询(“从表中选择*限制$offset,10”) 在列出您的问题的解决方案之前,我想给您一条建议:请不要使用mysql函数,它们在最新的PHP版本中可能有害且不受欢迎。 有几种方法可以实现你想要的。我会按优先级按升序列出它们
LOCK TABLES trans READ, customer WRITE;
SELECT SUM(value) FROM trans WHERE customer_id=some_id;
UPDATE customer
SET total_value=sum_from_previous_statement
WHERE customer_id=some_id;
UNLOCK TABLES;