Я пишу инструмент, который подключается к серверу, отправляет запрос, читает ответ и отправляет другие команды.
Проблема заключается в том, что отправляемый сервером ответ может варьироваться в терминах строк (это всегда как минимум одна строка, но может быть 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
Вы используете 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);
Других решений пока нет …