Проблема в том, что getlines () ждет, пока соединение не будет закрыто. Если веб-служба, к которой вы подключаетесь, не закрывает ваше соединение, функция getlines будет ждать, ожидая получения дополнительных данных. Когда ваше соединение истекает примерно через 2 минуты или около того, getlines видит закрытие соединения и возвращает вам полученные линии. Recv, с другой стороны, будет захватывать все до заданного предела, который находится на соединении в то время, и немедленно возвращать его в буфер, который вы передаете, но он будет ждать, пока не получит некоторые данные, если в настоящее время их нет. Я знаю, вы думаете, что это грязно, но это может сработать для вас:
$httpSock->recv($buf, 1024);
$message = "";
while (length($buf) > 0) {
$message .= $buf;
$httpSock->recv($buf, 1024, MSG_DONTWAIT);
}
print $message;
MSG_DONTWAIT приведет к тому, что recv не будет ждать сообщения, если соединение пустое. Вы также можете увеличить 1024 до некоторого большого числа, чтобы уменьшить количество циклов, или даже, возможно, даже получить все сообщение сразу.
Это также позволит вам держать розетки открытыми для дальнейшего использования, пока вы сами не закроете их.
Мне интересно, работает ли пример Google, потому что google.com закрывает соединение после ответа.