fget over server, как читать до конца текущей передачи?

Я пишу инструмент, который подключается к серверу, отправляет запрос, читает ответ и отправляет другие команды.

Проблема заключается в том, что отправляемый сервером ответ может варьироваться в терминах строк (это всегда как минимум одна строка, но может быть 3, 5 строк), и он может отправить одну строку, подождать несколько секунд, а затем отправить другие строки.

Есть ли способ прочитать все входящие данные, пока они не остановятся?
Может быть, я должен изменить на sockets?

Вот мои попытки:

$fp = fsockopen("www.example.com", 25, $errno, $errstr, 30);

while(fgets($fp, 1024)) {} // hangs

fgets($fp, 4096); // works, but doesn't get the multiple lines

while(!feof($fp)){
fgets($fp, 1024);
}
// hangs

while(($c = fgetc($fp))!==false) {
var_dump($c);
}
// hangs

2

Решение

Вы используете TCP-соединение. Соединение TCP будет оставаться открытым, пока один из партнеров по связи не закроет его явно.

Это означает

while(!feof($fp)) {
fgets($fp);
}

будет зависать вечно, если сервер не закроет соединение после передачи. (Кажется, что удаленный сервер делает не). Это относится к while(fgets($fp, 1024)) {} также.

Другой вариант — клиент (ваш PHP-скрипт) закрывает соединение. Это может быть сделано безопасно, только если клиент знает размер сообщения и может решить, когда все байты были отправлены.

Реализация этого является функцией протокола, например, в HTTP используется заголовок длины содержимого.

Имея это, вы подключаетесь к порту 25, я предполагаю, что вы говорите с SMTP-сервером. SMTP управляет длиной сообщения как функция протокола. Вам нужно будет реализовать протокол SMTP.


Около:

$message = fgets($fp, 4096);

Это «работает» только если он уверен, что сообщение никогда не будет превышать 4096 байт. Новые строки все еще в результате, вам просто нужно будет

$lines = explode("\n", $message);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]