循環(huán)發(fā)送信息的時候,出錯send buffer full and drop package,是不是緩沖區(qū)滿了?
$socket->onConnect = function($socket) use($byname, $act_byname, $gdpay, $yestoday, $today, $Y, $bankcode, $appname)
{
//測試用
$terminal_id = '44001555';
for($i = 1; $i <= 10000; $i++)
{
$request = $gdpay->jk_datas($terminal_id, $byname, $act_byname, $yestoday, $today, $bankcode);
if($request === TRUE)
{
continue;
}
else
{
log_message($appname, 'info', "{$today}繳款發(fā)送的數(shù)據(jù):" . $request);
$socket->send($request);
}
}
//正式生產(chǎn)
/*$gdpay_key = $byname . '.bankpay.terminals.' . $yestoday;
$terminals = \Uplott\Lib\Redis::instance('local_redis')->smembers($gdpay_key);
if( ! empty($terminals))
{
log_message($appname, 'info', "{$today}要繳款的筆數(shù):" . count($terminals) . "筆");
try
{
foreach($terminals as $terminal_id)
{
$request = $gdpay->jk_datas($terminal_id, $byname, $act_byname, $yestoday, $today, $bankcode);
if($request === TRUE)
{
continue;
}
else
{
log_message($appname, 'info', "{$today}繳款發(fā)送的數(shù)據(jù):" . $request);
$socket->send($request);
}
}
}
catch(\Exception $e)
{
log_message($appname, 'error', $e->getMessage());
}
}*/
};
//服務器響應,接收返回結(jié)果
$socket->onMessage = function($socket, $result) use($byname, $act_byname, $gdpay, $today, $appname)
{
try
{
log_message($appname, 'info', "{$today}繳款接收的數(shù)據(jù):" . $result);
$gdpay->save_jk_datas($result, $byname, $act_byname, $today);
}
catch(\Exception $e)
{
//這里會出現(xiàn)send buffer full and drop package
log_message($appname, 'error', $e->getMessage());
}
};
不好意思,編輯了一下
$socket->onConnect = function($socket) use($byname)
{
//測試用
$terminal_id = '44001555';
for($i = 1; $i <= 10000; $i++)
{
$request = $gdpay->jk_datas($terminal_id, $byname);
if($request === TRUE)
{
continue;
}
else
{
log_message('info', "繳款發(fā)送的數(shù)據(jù):" . $request);
$socket->send($request);
}
}
//服務器響應,接收返回結(jié)果
$socket->onMessage = function($socket, $result) use($byname)
{
try
{
log_message('info', "繳款接收的數(shù)據(jù):" . $result);
$gdpay->save_jk_datas($result, $byname);
}
catch(\Exception $e)
{
log_message( 'error', $e->getMessage());
}
};
$socket->onError = function($socket, $err_code, $err_msg) use($appname)
{
//這里會出現(xiàn)send buffer full and drop package
log_message( 'error', "$err_code, $err_msg");
};
發(fā)送10000條數(shù)據(jù),大概出現(xiàn)3000-4000條 2 send buffer full and drop package 錯誤
send buffer full and drop package 就是客戶端接收數(shù)據(jù)慢于服務端發(fā)送速度,導致消息堆積在服務端socket緩沖區(qū),服務端socket緩沖區(qū)大小有限定,超過這個值就會報send buffer full and drop package
解決辦法,不要給客戶端狂發(fā)數(shù)據(jù)。設(shè)置下onBufferFull回調(diào),緩沖區(qū)滿的時候不要再發(fā)送數(shù)據(jù),等待onBufferDrain時再發(fā)。
服務端socket緩沖區(qū)相關(guān)參見手冊
http://doc.workerman.net/315341
http://doc.workerman.net/315342
http://doc.workerman.net/315150
http://doc.workerman.net/315151