Ciao,
non è un baco, la funzione fgets si interrompe quando incontra un \n (newline).

Per fare quel che vuoi tu devi usare

fread() e controllare ogni singolo carattere fino a quando non trovi il tuo carattere di "termine scrittura", oppure qualcosa del tipo

[pseudocodice]

$testoTotale = '' ;

while( $x = fgets(STDIN, $len))
{

//se $x contiene carattere da intercettare, fai break
//altrimenti

$testoTotale .= $x

}

Se la pressione sul tasto ESC invia un carattere testuale che sei in grado di intercettare puoi risolvere così.

Per intercettare ESC credo tu debba fare un confronto con il valore restituito da chr(27), ma non ho mai provato