新整個(gè)webman,放到Linux上,寫(xiě)個(gè)簡(jiǎn)單的方法:
public function index(Request $request)
{
return response('hello webman');
}
windows本地,寫(xiě)個(gè)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)圖片:
這是什么原因呢?還請(qǐng)解惑。
curl是短連接,每次請(qǐng)求會(huì)占用本地一個(gè)端口,請(qǐng)求完畢后這個(gè)端口不會(huì)立刻釋放。本地端口有限,當(dāng)本地端口被快速用完就會(huì)報(bào)這個(gè) Address already in use 錯(cuò)誤了。
curl用長(zhǎng)連接,也就是不主動(dòng)curl_close,這樣就不會(huì)不斷的消耗本地端口,應(yīng)該就不會(huì)報(bào)錯(cuò)了,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;
}
}