Я использую библиотеку PHP curl для установления соединения и извлечения контента из WEB — как обычно.
У меня есть несколько прокси-серверов SOCKS5, работающих на локальном хосте на портах от 10300 до 10350, и PHP выбирает порт случайным образом.
Мой код:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, "localhost:".mt_rand(10300, 10350));
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$curl_resp = curl_exec($ch);
curl_close($ch);
/// ... whatever logic
Но если я поместил этот код в цикл на долгое время, я получаю сообщение о том, что больше нельзя открывать файлы. Я читаю онлайн потому, что достигнут предел обработчика файлов, поэтому я отлаживал lsof -p
и я заметил, что у процесса есть сотни и даже тысячи этих строк:
... TCP localhost:43030->localhost:10303 (CLOSE_WAIT)
... TCP localhost:40982->localhost:10341 (CLOSE_WAIT)
... TCP localhost:48718->localhost:10304 (CLOSE_WAIT)
... TCP localhost:41655->localhost:10350 (CLOSE_WAIT)
... TCP localhost:41915->localhost:10310 (CLOSE_WAIT)
... TCP localhost:49746->localhost:10322 (ESTABLISHED)
Я исследовал, почему это так, но я не понимаю, потому что я звоню curl_close
и я предполагаю, что CURL также закроет соединение PROXY, или я что-то упустил?
Версии:
PHP 7.1.4-1+deb.sury.org~trusty+1 (cli) (built: Apr 11 2017 22:45:20) (NTS)
curl 7.52.1 (x86_64-pc-linux-gnu) libcurl/7.52.1 OpenSSL/1.0.1f zlib/1.2.8 libidn2/0.9 libpsl/0.11.0 (+libicu/52.1) libssh2/1.4.3 nghttp2/1.19.0 librtmp/2.3
Я тоже сталкивался с этой проблемой. Обойти это добавить
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Connection: close"));
Сначала я думал, что это связано с php7, потому что я могу воспроизвести его на коробке php7, но на php5 это не произойдет. К сожалению, я попробовал это на другой коробке php7, это также не повторилось. Так что я до сих пор не понимаю причину.
Других решений пока нет …