感谢您的回复!
首先:我们的 PHP 非常快,fsockopen 很慢,因为它不知道何时关闭来自 SQUID 的响应连接。
这是我们的代码:
$buffer = socket_read($client, 4096);
if ( !($handle = fsockopen(HOST, SQUIDPROXYPORT, $errno, $error, 1)) ) {
Log::write($this->log, 'Errno: ' . $errno . ' Error: ' . $error . "\n" . $buffer);
exit('Nem sikerült csatlakozni! ' . $errno . ':' . $error);
}
stream_set_timeout($handle, 0, 100000);
fwrite($handle, $buffer);
$result = '';
do {
$tmp = fgets($handle, 1024);
if ( $tmp ) {
$result .= $tmp;
}
} while ( !feof($handle) && $tmp != false );
socket_write($client, $result, strlen($result));
fclose($handle);
socket_close($client);
同样,它是如何工作的:
- 客户端向我们发送 HTTP 请求
- 我们的 PHP 获取请求,并将其标头发送到 SQUID 代理
- Squid 完成它的工作,并将响应数据发送回我们的 PHP
- 我们的 PHP 通过 fsockopen 获取 squid 的响应数据
- 我们分析响应数据,或修改它
- 我们将其发回给客户
但是:当我们等待响应数据时,我们会收到它,但我们不知道什么时候关闭 PHP 和 SQUID 之间的连接。这导致工作缓慢,并且几乎每次都超时。
如果您有任何想法,请与我们分享!