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
 
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
 
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
 
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. :)