Ciao,

il problema di fondo, nel tuo codice, è che, benché richiedi le connessioni keep-alive e probabilmente il server te la fornisce, utilizzi nel codice questa sequenza
codice:
          while (!feof($fp)) { 
             echo fgets($fp, 128); 
         }
feof attende fino alla fine del "file" che nel caso di uno stream è la chiusura dello stesso, probabilmente attendi anche qualche secondo durante l'esecuzione prima di ricevere gli errori.

Quando si usano le connessioni keepalive devi necessariamente acquisire il content-length e leggere quella porzione di dati o, se il server utilizza un transfer-encoding, decodificare il trasferimento così per come richiesto dal server (generalmente sono trasferimenti a blocchi con la dimensione del blocco scritta subito prima del blocco stesso in esadecimale ... e poi il tutto si chiude con un blocco di dimensione zero)

Il mio consiglio, per semplificarti la vita, è:
- passa la connessione a close, così termina subito
- riapri una nuova connessione con fsockopen, tanto non ti cambia assolutamente nulla