Importeren Van Csv File

Hallo,

Ik ben ongeveer een 3/4 jaar Yii developer en al ruim 10 jaar PHP.

Het volgende is het probleem:

Ik wil een csv bestand importeren. Het bestand bevat 1400 regels en dit moet verdeeld worden over diverse tabellen (models).

De import neemt nu ongeveer 8 minuten in beslag, wat natuurlijk veel te lang is. Mijn ervaring met php is ook dat dit veel sneller moet kunnen.

De omgeving is een Linux Ubuntu (recentste versie), 4GB intern, PHP 5.3, Apache icm FastCGI module

Na het goed bekijken van de log file (CWebLogRoute) zag ik dat een sql command ongeveer 0,06 seconden duurt. Aangezien voor 1 regel ongeveer 6 sql commands nodig zijn, komt dit uit op 0,36 seconden per regel x 1400 = 504 seconden --> 8 min

Opzich allemaal logisch de berekening. Ik heb al gebruik gemaakt van het createCommand->execute (DAO) ipv de gebruikelijke "save" van het model.

Ik hoor graag of mensen nog goede tips en tricks voor mij hebben

Misschien is het beter om de queries intern bij te houden en aan het einde van het script in 1 of 2 grote queries uit te voeren. Als ik grote bestanden moet importeren en verwerken is dat meestal mijn uitweg.

Hi. You must create console command and do it for crone.

My code example see here.




class UpdateGoodsCommand extends CConsoleCommand {


    public function run($args)

    {

        $task=Yii::app()->db

            ->createCommand()

            ->select('*')

            ->from('{{cron_buh}}')

            ->where('status = 1')

            ->queryAll();

        if(!empty($task)){

            Yii::app()->db

                ->createCommand()

                ->update("{{cron_buh}}",array('status'=>0),'id = :id',array(':id'=>$task[0]['id']));

            //work with file

            $dir = Yii::app()->basePath.'/../files';

            $files = CFileHelper::findFiles($dir, array('level'=>0,'fileTypes'=>array('csv')));

            ini_set('max_execution_time', 0);

            $arrayItems = array();

            $array_article = array();

            foreach ($files as $file) {

                if($file == $dir.'/exporttov.csv'){

                    $csvData = file_get_contents($file);

                    $lines = explode("\n", $csvData);

                    foreach ($lines as $line) {

                        $arrayItems[] = str_getcsv($line,';');

                    }

                    foreach($arrayItems as $item){

                        $array_article[]=$item[0];

                        Yii::app()->db

                            ->createCommand()

                            ->update('{{good}}',

                                array('price_opt'=>$item[9],'price'=>$item[8]),

                                'article = :article',

                                array(':article'=>$item[0])

                            );

                    }

                    ShopGood::model()->updateAll(array('status'=>ShopGood::STATUS_DRAFT));

                    $criteria = new CDbCriteria;

                    $criteria->addInCondition( "id" , $array_article) ; // $array_id = array ( 1, 2, 3, 4 );

                    ShopGood::model()->updateAll(array('status'=>ShopGood::STATUS_PUBLISHED), $criteria);

                    $read_file = fopen($file,'r');

                    fclose($read_file);

                    unlink($file);

                }

            }

        }

    }


}