首页 > 如何防止无限循环的php CPU承载过重?

如何防止无限循环的php CPU承载过重?

我写了一只程序,专门在抓某个api 的所提供的数据。然而,为了防止每次insert新数据料后,就必被把旧的数据状态改掉。(不能一直用insert,因为有可能这次这个id进来的数据有四个,下一次有三笔,再下一次可能有五笔),所以我用了几个数组来纪录,比对,一但数据有不同的时候能写才数据库。

例如:

Do
{
    Foreach(事件id)
    {
        Foreach(第一種數據) //然而這一種數據有一至三種不同
        {
            Foreach(第一種數據裡的小數據)
            {
                //以下是紀錄各數劇
                If(!$m1[‘id’][‘第一種數劇的類別’][‘第一種數據裡小數劇key值’])
                {
                    $m1[‘id’][‘第一種數劇的類別’][‘第一種數據裡小數劇key值’]=implode($tmp1); //$tmp都是紀錄數據的陣列
                    sqlInsert($tmp); 
                }
                Else
                {
                    If($m1[‘id’][‘第一種數劇的類別’][‘第一種數據裡小數劇key值’]) !=implode($tmp))
                    {
                        $m1[‘id’][‘第一種數劇的類別’][‘第一種數據裡小數劇key值’] = implode($tmp);
                        sqlInsert($tmp);
                    }
                }
            }    
        }


        Foreach(第二種數據) //然而這一種數據有一至三種不同
        {
            Foreach(第二種數據裡的小數據)
            {
                //以下是紀錄各數劇
                If(!$m2[‘id’][‘第二種數劇的類別’][‘第二種數據裡小數劇key值’])
                {
                    $m2[‘id’][‘第二種數劇的類別’][‘第二種數據裡小數劇key值’]=implode($tmp1); //$tmp都是紀錄數據的陣列
                    sqlInsert($tmp1); 
                }
                Else
                {
                    If($m2[‘id’][‘第二種數劇的類別’][‘第二種數據裡小數劇key值’]) !=implode($tmp1))
                    {
                        $m2[‘id’][‘第二種數劇的類別’][‘第二種數據裡小數劇key值’] = implode($tmp1);
                        sqlInsert($tmp1);
                    }
                }
            }
        }

        Foreach(第三種數據) //這組數劇裡面不再有小數劇
        {

            //以下是紀錄各數劇
            If(!$m3[‘id’][‘第三種數劇的類別’][‘empty’])
            {
                $m3[‘id’][‘第三種數劇的類別’][‘empty’]=implode($tmp2); //$tmp都是紀錄數據的陣列
                sqlInsert($tmp2); 
            }
            Else
            {
                If($m3[‘id’][‘第三種數劇的類別’][‘empty’]) !=implode($tmp2))
                {
                    $m3[‘id’][‘第三種數劇的類別’][‘empty’] = implode($tmp2);
                    sqlInsert($tmp2);
                }
            }

        }

        //以下是紀錄事件本體id的狀態等等的資料
        If(!$m4[‘id’][‘event’][‘empty’])
        {
            $m4[‘id’][‘event’][‘empty’]=implode($tmp5); //$tmp都是紀錄數據的陣列
            sqlInsert($tmp2); 
        }
        Else
        {
            If($m4[‘id’][‘event’][‘empty’]) !=implode($tmp5))
            {
                $m4[‘id’][‘event’][‘empty’] = implode($tmp5);
                sqlInsert($tmp5);
            }
        }




    }
    //以下程式是執行 如果事件本體的id 不再提供資料時,unset($m1['id']~$m4['id'])
    sleep(3);
}while(條件);

程序大约是这样的状况,但是约执行一天,主机的cpu 就会承载至100% , 且这样的程序,我约有四至五个线程要跑.....
每支程序约用四个arrays 三维数组来作「纪录」的动作,id可能会有0-15个
第一、二大类的数据约有1-10组的小数据。
这样的思考方式是正确的吗?或者有什么更有效率的执行方式?

p.s. sqlinsert 里的func 主要是 「更改上一笔数据的状态,再 insert一笔新的」。数据更新的时间约2秒 至 10分钟 不等. 经查并不是sql 的问题,而是php本身的承载就过重了

【热门文章】
【热门文章】