Home >Backend Development >PHP Tutorial >javascript - 如何防止无限循环的php CPU承载过重?
我写了一只程序,专门在抓某个api 的所提供的数据。然而,为了防止每次insert新数据料后,就必被把旧的数据状态改掉。(不能一直用insert,因为有可能这次这个id进来的数据有四个,下一次有三笔,再下一次可能有五笔),所以我用了几个数组来纪录,比对,一但数据有不同的时候能写才数据库。
例如:
<code>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(條件); </code>
程序大约是这样的状况,但是约执行一天,主机的cpu 就会承载至100% , 且这样的程序,我约有四至五个线程要跑.....
每支程序约用四个arrays 三维数组来作「纪录」的动作,id可能会有0-15个
第一、二大类的数据约有1-10组的小数据。
这样的思考方式是正确的吗?或者有什么更有效率的执行方式?
p.s. sqlinsert 里的func 主要是 「更改上一笔数据的状态,再 insert一笔新的」。数据更新的时间约2秒 至 10分钟 不等. 经查并不是sql 的问题,而是php本身的承载就过重了
我写了一只程序,专门在抓某个api 的所提供的数据。然而,为了防止每次insert新数据料后,就必被把旧的数据状态改掉。(不能一直用insert,因为有可能这次这个id进来的数据有四个,下一次有三笔,再下一次可能有五笔),所以我用了几个数组来纪录,比对,一但数据有不同的时候能写才数据库。
例如:
<code>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(條件); </code>
程序大约是这样的状况,但是约执行一天,主机的cpu 就会承载至100% , 且这样的程序,我约有四至五个线程要跑.....
每支程序约用四个arrays 三维数组来作「纪录」的动作,id可能会有0-15个
第一、二大类的数据约有1-10组的小数据。
这样的思考方式是正确的吗?或者有什么更有效率的执行方式?
p.s. sqlinsert 里的func 主要是 「更改上一笔数据的状态,再 insert一笔新的」。数据更新的时间约2秒 至 10分钟 不等. 经查并不是sql 的问题,而是php本身的承载就过重了