簡體   English   中英

PHP-解析和驗證文本文件數據並將其導入到mysql數據庫中

[英]PHP - Parse and validate text file data and import it into mysql database

我正在使用php-resque來解析和驗證大文件中的數據,然后將該數據導入到mysql數據庫中。

我已經知道LOAD DATA INFILE可用於將文本文件中的行讀取到表中,但不會執行任何驗證。

我的數據庫結構:

ItemsFile表:

id  filename  fileepath  valid_items invalid_items processed_items  processed

項目表:

id  uid  item file_id created_at

我的Resque Job Class看起來像這樣:

php-resque派生一個子進程並實例化ItemsFileProcessor類,然后

  1. setUp()被調用
  2. perform()被調用
/**
* Read and validate items form a file, and store them in a database.
*/

class ItemsFileProcessor {

    //ItemsFile Model instance
    private $items_file = null;

    //Item Model instance
    private $item = null;

    //retrieved from ItemsFile table.
    private $file = null;

    public function __construct() {
        $this->items_file = new ItemsFile();
        $this->item       = new Item();
    }

    public function setUp() {

        if (isset($this->args['file_id'])) {

            //get file from ItemsFile Table by id.
            $this->file = $this->items_file->getFile($this->args['file_id']);

            if (empty($this->file)) {

                //End job processing if file does not exist.
                exit(-1);

            }

        }
    }

    function perform() {

        //NodeJs, socket.io, redis, broadcasting system
        EventBroadcaster::broadcast('app-jobs-channel', 'file_processing_started');

        $processed_items = 0;
        $valid_items     = 0;
        $invalid_items   = 0;

        //item validation class instance
        $item_validator = new ItemValidator();

        try {

            $tmp_file = new SplFileObject($this->file->filepath);

            //Read items from file, and validate each item.
            while ($tmp_file->valid()) {
                $line = trim($tmp_file->fgets());
                if ($line !== '') {
                    if ($item_validator->isValid($line, new ItemValidationRule())) {

                        //store item in Item table.
                        $this->item->create([
                                'uid'     => 'foo',
                                'item'    => $line,
                                'file_id' => $this->file->id,
                            ]);

                        $valid_items++;

                    } else {

                        $invalid_items++;

                    }

                    $processed_items++;

                }
            }

            //update ItemsFile Table record
            $this->items_file->update(
                $this->file->id,
                [
                    'processed_items'  => $processed_items,
                    'valid_items'      => $valid_items,
                    'invalid_items'    => $invalid_items,
                    'processed'        => 'Processed',
                ]
            );

            EventBroadcaster::broadcast('app-jobs-channel', 'file_processing_completed');

        } catch (LogicException $exception) {

            //broadcast failure.
            EventBroadcaster::broadcast('app-jobs-channel', 'file_processing_failed');
            Logger::getInstance()->log('ProcessContactFile Exception: '.$exception->getMessage(), Logger::LOGTYPE_ERROR);

            exit(-1);

        }
    }

}

我的問題:

  • 處理文件時間太長
  • Mysql必須一個接一個地處理所有插入請求。 LOAD DATA INFILE快得多。

我的問題:

有沒有一種方法可以對此進行優化或以某種方式引入LOAD DATA INFILE。

使用PHP管理文件時,您可能會遇到許多性能問題。 然后,我建議您使用SHELL來解析文件並返回一個字符串(代表您的一般請求以及所有插入內容)。 從現在開始,您只需要執行此請求。

如果不清楚的話可以提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM