Y que cabeceras HTTP usas para indicar que el archivo es para descargar? .. (o no usas ninguna . sólo haces el "echo a tus datos")
Debes "decirle" a tu navegador que los datos que le vas a enviar son para descargar y no para que los intenta interpretar asociandolos al lector adecuado (sea el mismo navegador caso de .txt, y archivos de imagen .jpg .. etc y otros).
Revisa la función:
header()
www.php.net/header
Ahí veras ejemplos ..
Pero ten encuenta que no todo navegador (cliente) interpreta de la misma forma las diferentes cabeceras HTTP que puedes usar .. así que no te extrañe si a la primera no te funciona como esperas.
Un saludo,