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

时间:2017-05-28 02:41:41

标签: php mysql

每次请求/运行此脚本时,我都会创建一个获取mysql MyISAM表数据的脚本。 查询是这样的:

SELECT * FROM table LIMIT $ 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_query(" SELECT * FROM table LIMIT $ offset,10");

1 个答案:

答案 0 :(得分:0)

在列出您的问题的解决方案之前,我想给您一些建议:请不要,请不要使用mysql_函数,它们可能有害并且在最新的PHP版本。

有几种方法可以达到你想要的效果。我会按优先顺序列出它们。

  1. 手动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;
    
  2. 在脚本语言(PHP)中使用相同的锁定原则。您可以flock选择和更新字段的整个过程,只创建一个空文件用于锁定目的,或者您可以使用Memcached进行设置,检查进程是否繁忙,并在进程完成时释放。这些方法不推荐,因为其中一个进程可能总是在处于忙碌状态时崩溃。模式,因此阻止其他进程,直到Memcached被释放。