コントローラのcodeigniterメソッドで受信者情報を取得するためにforeachループを使用してメールを送信しています。メールが送信された場合は、受信者テーブルの受信者ステータスを「送信済み」に更新します。
同じコントローラーの別の方法(同じモデルを使用)では、未送信のメールの数を取得しますが、送信中に未送信のメールの数を取得しようとすると、foreachループが完了するまで待機します。
foreachループで送信されている間に、未送信のメールの数を継続的に取得するにはどうすればよいですか?
recipients table
id int 11
recipient_id int 11
mail_id int 11
sent tinyint 1
failed tinyint 1
$recipients = $this->MMails->GetRecipients($mail_id);
foreach($recipients as $recipient) {
//send message using swift
if($message_sent) {
$this->MMails->MarkAsSent($recipient_id);//this recipient table gets updated actually, but I can't read the new COUNT value until this loop finished
}
}
モデルから:
function GetNumOfQueued() {//Get number of queued mails
$query = $this->db->query("SELECT COUNT(id) as num_of_queued
FROM recipients
WHERE sent = 0");
return $query->row()->num_of_queued;
}//GetNumOfQueued
function MarkAsSent($recipient_id) {//Update mail recipient status to sent
$this->db->set('sent', 1);
$this->db->where('id', $recipient_id);
$this->db->limit(1);
$this->db->update('recipients');
}//MarkAsSent
簡単に言うと、PHPはループが終了するまで応答せず、ループがアクティブな間はアプリケーションで他のページを開くことができません。
私のローカルphp.iniの設定はoutput_buffering=Offです