使用.csv文件和PHP缓慢上传

时间:2015-06-18 19:55:10

标签: php performance mongodb csv file-upload

我创建了一个使用PHP上传csv文件的函数,并将其内容插入到Mongo数据库中。

上传需要很长时间才能完成,我不知道如何构建更好的代码来实现这一目标。

在PHP中使用我的函数:

public function importEmail($file,$list_name,$header){

    $data = $this->ReadCSV($file, $has_header);        
    global $Email;
    $falhas = 0;

    array_shift($data);

    if($data === false) {
        return false;
    } else {                  
        foreach($data as $key => $value) {
            $Email->email = $value[$header["email"]];
            $Email->first_name = $value[$header["fName"]];
            $Email->last_name = $value[$header["lName"]];
            $Email->gender = strtoupper($value[$header["gender"]]);
            $Email->status = $value[$header["status"]] !="" ? $value[$header["status"]] : "1";
            $Email->list_name = $list_name;
            $Email->opt_out = $v = (strtoupper($value[$header["opt"]]) != "" ? strtoupper($value[$header["opt"]]) : "N");               

           if(!$Email->update(trim($value[$header["email"]]))) $falhas++;              
        }   

      }      

        return $falhas === 0 ? true : false;
}

EDITED 这是update()方法,负责将记录插入MongoDB

public function update($id) {
    global $mongo, $gClient;

    $update = array(
        '$set' => array(
            'userData.name' => $this->first_name,
            'userData.lastName' => $this->last_name,
            'userData.gender' => $this->gender,
            'userData.optOut' => $this->opt_out == "Y" || $this->opt_out == "N" ? $this->opt_out : "Y",
            'userData.lastUpdate' => (int)(microtime(true) * 1000),
            'userData.status' => $this->status == 0 || $this->status == 1 ? +$this->status : 0
        ),
        '$setOnInsert' => array(
            'userData.registerDate' => (int)(microtime(true) * 1000)
        )
    );

    if(is_string($this->list_name) && strlen($this->list_name) > 0)
        $update['$push'] = array(
            'userData.meta' => array(
                'type' => 'listname',
                'name' => $this->list_name
            )
        );

    $result = $mongo->{$gClient->slug}->usersHistory->update(array(
        'userEmail' => $id
    ), $update, array(
        'upsert' => true
    ));

    if(!$this->email) $this->email = $id;

    $mongo->{$gClient->slug}->usersHistory->update(array(
        'userEmail' => $id
    ), array(
        '$set' => array(
            'userEmail' => $this->email
        )
    ));

    return $result['n'] > 0;
}

那些.csv文件总是大于50k(行)。

如何比这种方法更快地构建某些东西?

0 个答案:

没有答案