我创建了一个使用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(行)。
如何比这种方法更快地构建某些东西?