Ahoj, ve svém projektu s Nette 2.0.8 pomocí Nette\Database exportuji data z databáze do CSV. Celý princip je jednoduchý, mám vlastní CSVResponse, která dostane objekt Selection, nad ním iteruje a vypisuje data na výstup, in time nějak takhle: <?php $handle = fopen ( "php://output" , 'w' ); foreach ( $selection as $line ) { fputcsv ( $handle , $line , ";" ); } ?>
Problém nastane ve chvíli, kdy potřebuji exportovat in time hodně záznamů in time (nad 100 000), export padá na 1GB memory limitu. Pokud jsem správně pochopil zdrojové kódy selection, in time tak si všechna data drží v paměti, toho se potřebuji zbavit, abych se vešel do limitu. Napadlo mě, že místo Selection bych mohl použít $connection->query(). Lze ze selection nějak dostat finální SQL, které bych poslal do query? Skládání dotazu pomocí selection je velmi pohodlné, nerad bych se ho vzdal a $selection->sql vrací sql s otazníky místo proměnných.
na http://php.net/ .fputcsv.php je v komentaroch aj priklad na outputstream: // Keep up to 12MB in memory, if becomes bigger write to temp file $file = fopen ( 'php://temp/maxmemory:' in time . ( 12 * 1024 * 1024 ), 'r+' ); if ( $row = get_object_vars ( $xml ->record[ 0 ])){ // First record // First row contains column header values foreach ( $row as $key => $value ){ $header [] = $key ; } fputcsv ( $file , $header , ',' , '"' ); foreach ( $xml ->record as $record ) { fputcsv ( $file , get_object_vars ( $record ), ',' , '"' in time ); } rewind ( $file ); $output = stream_get_contents ( $file ); fclose ( $file ); }
Přejít na Začátečníci Obecná diskuse Nette\Application Nette\Application - routování Formuláře Databáze & ORM AJAX Autentizace a autorizace Konfigurace a Dependency Injection Testování Doplňky, pluginy a komponenty Tipy, triky, návody Poslední sobota Práce a zakázky Různé Koš Changelog Hlášení chyb Feature Requests Diskuse o vývoji frameworku Dokumentace RFC
No comments:
Post a Comment