1.在数据库设计中,有金额一类的数据最好设为double型,之前遇到过设为float型数据取出时自动取整的情况,一般来说double型比float占用内存高,但是更加精确。
关于同时插入上百万条数据的代码优化:
2.1 第一种方法:使用insert into 插入,代码如下:
$params = array(‘value'=>'50′);
set_time_limit(0);
echo date(“H:i:s”);
for($i=0;$i<2000000;$i++){
$connect_mysql->insert($params);
};
echo date(“H:i:s”);最后显示为:23:25:05 01:32:05 也就是花了2个小时多!
2.2第二种方法:使用事务提交,批量插入数据库(每隔10W条提交下)最后显示消耗的时间为:22:56:13 23:04:00 ,一共8分13秒 ,代码如下:
echo date(“H:i:s”);
$connect_mysql->query(‘BEGIN');
$params = array(‘value'=>'50′);
for($i=0;$i<2000000;$i++){
$connect_mysql->insert($params);
if($i%100000==0){
$connect_mysql->query(‘COMMIT');
$connect_mysql->query(‘BEGIN');
}
}
$connect_mysql->query(‘COMMIT');
echo date(“H:i:s”);
2.3
第三种方法:使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,
则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 2*1024*1024*10;消耗时间为:11:24:06 11:25:06;
插入200W条测试数据仅仅用了1分钟!代码如下:
$sql= “insert into twenty_million (value) values”;
for($i=0;$i<2000000;$i++){
$sql.=”('50′),”;
};
$sql = substr($sql,0,strlen($sql)-1);
$connect_mysql->query($sql);
广泛使用的是第二种,处理速度最快是第三种。
原文链接:https://www.jb51.net/article/51975.htm
3.thinkphp phpExecl的一些参数设置:https://blog.csdn.net/weixin_30672295/article/details/94887628
4.值得一提的是php版本5.5之后才有array_column函数,如果想使用则在common.php中添加:
function array_column($array,$column_name)
{
return array_map(function($element) use($column_name){return $element[$column_name];}, $array);
}
5.处理上传base64图片的方法
public function uploadImg($file)
{
if ($file) {
$bb=explode(";",$file['content']);
$i=0;
if($bb[0]=="data:image/gif"||$bb[0]=="data:image/png"||$bb[0]=="data:image/jpg"||$bb[0]=="data:image/jpeg"){
if($bb[0]=="data:image/png"){
$hou=".png";
}
if($bb[0]=="data:image/gif"){
$hou=".gif";
}
if($bb[0]=="data:image/jpg"){
$hou=".jpg";
}
if($bb[0]=="data:image/jpeg"){
$hou=".jpeg";
}
$i+=1;
}else{
return ['code'=>0,"msg"=>"图片格式不正确"];
}
// $a=0;
// if($data['size']<=2097152){
// $a+=1;
// }else{
// return ['code'=>0,"msg"=>"图片大小大于2M"];
// }
$fileName=ROOT_PATH . 'public' . DS . 'uploads';
$savename=time();
if($a+$i>=2){
$uploadUrl = ROOT_PATH . 'public' . DS . 'uploads';
$info = $this->base64_image_content($file['content'],$uploadUrl);
}
return json($info);
}
public function base64_image_content($base64_image_content,$path){
//匹配出图片的格式
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
$type = $result[2];
$new_file = $path."/".date('Ymd',time())."/";
$basePutUrl = $new_file;
if(!file_exists($basePutUrl)) {
//检查是否有该文件夹,如果没有就创建,并给予最高权限
$a = mkdir($basePutUrl, 0700);
}
$ping_url = time().".{$type}";
$local_file_url = $basePutUrl.$ping_url;
if (file_put_contents($local_file_url, base64_decode(str_replace($result[1], '', $base64_image_content)))){
return date('Ymd',time())."/".$ping_url;
}else{
return false;
}
}else{
return false;
}
}
6.thinkphp+vue前后端分离的方法:
将vue生成的压缩包放到public文件夹下,设置入口文件index.html的优先级高于index.php