欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-06-12 11:30:42
...
我写了一只程序,专门在抓某个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本身的承载就过重了

回复内容:

我写了一只程序,专门在抓某个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本身的承载就过重了

相关标签: javascript php