2017-07-31 83 views
0

我在控制器這樣的方法,即status字段爲0或1模型類的「保存」方法的工作很長

public function actionNews_status($id,$status){ 
    $status = ($status==1)?1:0; 
    $number = false; 
    $news = News::findOne($id); 
    if(!is_null($news)){ 
     $news->status = $status; 
     $number = $news->save(); 
     Redis::rset($CACHE_mat, null); 
    } 
    return json_encode(['status'=>$number]); 
} 

的簡單集合值事實證明,該方法適用於約20秒。

我發現那條線$number = $news->save();工作緩慢。 我在此行前後用exit進行了檢查。 我還發現status字段本身會立即更新,因爲對錶格的查詢會立即顯示更改。 但是,save方法繼續工作很長一段時間。

status字段定義爲TINYINT(1)NULL DEFAULT 0 並且沒有任何索引。

也許創建索引是爲了幫助解決它?

MySQL數據庫,InnoDB。在表中78701行。

更新時間:

我發現了以下內容。 在updateInternal的末尾緩慢地運行afterSave方法調用。 但是在調用這行之前,腳本會很快執行。 慢慢地打電話afterSave本身,而不是afterSave方法中的代碼而不是afterSave之前的代碼調用 爲什麼會發生這種情況?

+0

mmmm ...這只是一個嘗試,但它會改變任何東西,如果你保存傳遞false,像這樣$ news-> save(false)?也許你的驗證規則非常複雜,需要很長時間才能執行...... – Masiorama

+0

@Masiorama不,它沒有任何作用。 –

+0

你確定是保存方法而不是緩存重置? – scaisEdge

回答

0

問題已解決。原因在模型類中被覆蓋的afterSave方法中找到。