新整個webman,放到Linux上,寫個簡單的方法:
public function index(Request $request)
{
return response('hello webman');
}
windows本地,寫個for循環(huán):
for ($i = 0; $i < 10000; $i++) {
echo '循環(huán):' . $i . '=>' . request_get($url) . PHP_EOL;
}
request_get方法:
function request_get(string $url, int $timeout = 10)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$rs = curl_exec($ch);
if (curl_errno($ch)) {
$err_msg = curl_error($ch);
curl_close($ch);
return json_encode(['code' => 50, 'msg' => $err_msg]);
} else {
curl_close($ch);
return $rs;
}
}
結(jié)果后期提示:
Failed to connect to 172.16.0.26 port 8787: Address already in use
相關(guān)圖片:
這是什么原因呢?還請解惑。
curl是短連接,每次請求會占用本地一個端口,請求完畢后這個端口不會立刻釋放。本地端口有限,當(dāng)本地端口被快速用完就會報這個 Address already in use 錯誤了。
curl用長連接,也就是不主動curl_close,這樣就不會不斷的消耗本地端口,應(yīng)該就不會報錯了,request_get改成
function request_get(string $url, int $timeout = 10)
{
static $ch;
$ch = $ch ?: curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$rs = curl_exec($ch);
if (curl_errno($ch)) {
$err_msg = curl_error($ch);
//curl_close($ch);
return json_encode(['code' => 50, 'msg' => $err_msg]);
} else {
//curl_close($ch);
return $rs;
}
}