Php 计数器使用多线程请求避免重复

Php 计数器使用多线程请求避免重复,php,mysql,Php,Mysql,我正在制作一个脚本,每次请求/运行这个脚本时,它都会获取mysql MyISAM表的数据。 查询如下所示: 从表中选择*限制$offset,10 问题是$offset在第一个请求中必须为0,在第二个请求中必须为10,在第三个请求中必须为20,以此类推。 然后我创建了一个新表,其中有一个计数器,用于$offset,每次脚本执行时递增+10 请求 您必须知道脚本将同时有许多请求。请求不是用户(访问) 请求是运行在5台以上PC上的我的软件,并且这些软件中的每一个都与 超过1000个线程正在请求此脚本。

我正在制作一个脚本,每次请求/运行这个脚本时,它都会获取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版本中可能有害且不受欢迎。

有几种方法可以实现你想要的。我会按优先级按升序列出它们

  • 手动MySQL表锁。您可以锁定表格,选择+更新所需值,然后再次解锁表格。我在优先列表中首先选择它的原因是,它有一个很好的内部锁定系统,效率很高。原型,取自MySQL的手册页面:

    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;
    
  • 在脚本语言(PHP)中使用相同的锁定原则。您可以选择和更新字段的整个过程,创建一个空文件仅用于锁定目的,也可以使用Memcached设置、检查过程是否繁忙,并在过程完成后释放。不推荐使用这些方法,因为其中一个进程在处于“忙碌”模式时可能总是崩溃,从而在释放Memcached之前阻塞其他进程