Du kannst nicht das Speichern auf der Festplatte des Besuchers erzwingen, aber eine Datei (auch wenn sie per Skript erzeugt wird) schicken kannst Du schon:
Wichtig ist dabei, dass das PHP-Skript selbst sonst keinen Output gibt und das die header()-Befehle am Anfang des Skripts stehen, sonst meckert PHP (ist so, also ob Du einen Cookie mitten in der Ausgabe versenden willst).
Also: Mit der Zeile
header('Content-type: application/stream-octet');
gibst Du an, dass kein HTML- sondern ein anderer Output kommt. Der Browser des Besuchers wird daraufhin den Download-Dialog öffnen. Es steht Dir frei einen anderen passenden MIME-Type zu verwenden. Da kann es dann aber passieren, dass bei z.B. Word-Dokumenten der Browser das Dokument in seinem Fenster darstellt, statt den Download anzubieten.
Weisst Du, wie gross die Datei ist (kannst Du mit filesize() ermitteln, falls es sich um eine physikalisch vorhandene Datei handelt), dann baue die folgende Zeile in das Skript ein:
header('Content-Length: xxx'), wobei Du bei xxx die Dateigrösse angeben musst.
Dies hat den Vorteil, dass der Downloaddialog einen Fortschrittsbalken anzeigen kann.
Falls es sich um eine physikalisch vorhandene Datzei handelt öffnest Du nun noch die Datei...
$file = fopen('blalblabla.txt', 'r');
...und schickst sie mit
fpassthru($file);
ab.
fclose() kannst Du machen oder Dir auch schenken, da das nach Skriptdurchlauf automatisch passiert.
So etwas gehört eigentlich zu den Standardingen, die oft nachgefragt werden. Du findest im Internet einen ganzen Haufen Seiten, die sich mit wiederkehrenden Programmieraufgaben bzgl. PHP befassen.
Ganz gut z.B.:
http://www.phpwelt.de/