Paměťově úsporné posílání response

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
thunderbuff
Člen | 164
+
0
-

V aplikaci vytvářím velké CSV exporty. Mohou mít i desítky tisíc řádek. Pokud si napíšu response, tak se bude až do odeslání celá držet v paměti. Jak bych měl postupovat, abych snížil paměťovou náročnost? Napadl mě tenhle ošklivý postup. Máte nějaký tip, jak to udělat lépe, než takovou prasárnou?

<?php

	public function actionLists() {
		$this->setCSVHeader(); // pošle content-type
		$this->CSVExporter->export(); // řádek po řádku echuje export, v paměti drží vždy jen aktuální řádek
		die(); // já vím, fuj!
	}

?>
Filip Procházka
Moderator | 4668
+
0
-

Můžeš buďto soubor vygenerovat a pouze na něj přesměrovat (servírovat ho pak bude http server, né php) a nebo jej budeš generovat až v momentě volání IResponse::send()

Majkl578
Moderator | 1364
+
0
-

Asi bych si napsal vlastní response. Zhruba takto:

class CSVExporterResponse implements Application\IResponse
{
	private $exporter;

	public function __construct(CSVExporter $exporter)
	{
		$this->exporter = $exporter;
	}

	public function send(Http\IRequest $httpRequest, Http\IResponse $httpResponse)
	{
		$this->exporter->sendCSVHeader(); // tohle je trochu škaredé, lepší by bylo použít $httpRequest->setHeader(), pokud to jde
		$this->exporter->export();
		$this->exporter->close(); // ?, garbage collection, close handles etc.
	}
}

Myslím, že takto by to mělo být postačující a zároveň korektní v rámci životního cyklu aplikace.


EDIT: ↓ Eh, díky, @enumag. :)

enumag
Člen | 2118
+
0
-

@Majkl578: Chybí ti tam __construct, jinak ok.

thunderbuff
Člen | 164
+
0
-

Díky za tipy, funguje to parádně :-)