运行数千个MySQL查询,导致服务器崩溃

时间:2014-10-11 22:11:00

标签: php mysql

我正在公司网站上运行股票更新,查询如下;

$count = count($stock);
for($i = 0; $i < $count; $i++)
{

    if(strtolower($stock[$i]['stockloc']) == 'retail')
    {
                if($stock[$i]['avail'] < 0)
                {
                    $stock[$i]['avail'] = 0;
                }

                mysql_query("UPDATE `xcart_products`
                SET `avail` = ".$stock[$i]['avail']."
                WHERE `productid` IN
                    (SELECT `productid`
                     FROM `xcart_extra_field_values`
                     WHERE `productid` = ".$stock[$i]['productid']."
                       AND `fieldid` = 5
                       AND LOWER(value) = 'retail')");   
    }  

}

实际上,它在for循环中运行并遍历数千种产品,更新库存水平。它运行正常大约4分钟,然后事情开始落后于我们的网站,mysql似乎积压与其他网站数据库查询,它无法运行(它们都显示为锁定),这导致不可避免;

  

内部服务器错误服务器遇到内部错误或   配置错误,无法完成您的请求。

     

请联系服务器管理员以告知时间   发生错误以及您可能已经做过的任何事情   导致错误。

     

有关此错误的详细信息可能在服务器错误中可用   日志中。

似乎没有超时我已经提升了PHP.ini的限制无济于事。查询并不是特别复杂,但它确实运行了数千次。也许多达5000+。我不确定问题是什么,因为我们在旧网站上运行了类似的更新系统,虽然它不是我设计的,但上传这么多库存数量变化并没有问题。

如果需要进一步的信息,我会很乐意扩展我的问题,但老实说,即使如何追查问题,我也有点不知所措。

$ stock数组是一个关联数组,具有以下格式;

Array
(
    [0] => Array
        (
            [avail] => 55
            [productid] => 17761
            [sku] => AER-TOUCH-2100
            [stockloc] => retail
        )

    [1] => Array
        (
            [avail] => 166
            [productid] => 22653
            [sku] => CAS-AER-112
            [stockloc] => retail
        )

    [2] => Array
        (
            [avail] => 272
            [productid] => 22952
            [sku] => CAS-ANT-001
            [stockloc] => retail
        )

    [3] => Array
        (
            [avail] => 5
            [productid] => 22956
            [sku] => CAS-ANT-005
            [stockloc] => retail
        )

    [4] => Array
        (
            [avail] => 12
            [productid] => 22958
            [sku] => CAS-ANT-007
            [stockloc] => retail

我已尝试在循环的每x次迭代中运行延迟,但我仍然收到500内部服务器错误消息。显然,我需要一个更好的解决方案来更新我的表。

0 个答案:

没有答案