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本身的承载就过重了