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