_小辉o

_小辉o 查看完整档案

济南编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

Hello World!

个人动态

_小辉o 关注了用户 · 1月16日

唯一丶 @weiyi_5b04fb4aa815a

关注 139

_小辉o 赞了回答 · 1月16日

解决Laravel 本地配置数据库读写分离, 使用读数据库时报错

😂 这里的 connection 不是指读写分离的 read,而是指多个数据库连接,也就是这里。
图片.png
对应的就是下面的,connections 字段。
图片.png

你这里可以不写 connection('read') ,Laravel 内部会自动选择的。

如果你要手动使用 连接,可以使用

DB::connection('mysql::read')->table('users')->get();

关注 3 回答 1

_小辉o 提出了问题 · 1月15日

解决Laravel 本地配置数据库读写分离, 使用读数据库时报错

'mysql' => [
            'driver' => 'mysql',
            'read' => [
                'host' => '127.0.0.1',
                'database' => 'laravels',
            ],
            'write' => [
                'host' => '127.0.0.1',
                'database' => 'laravel',
            ],
            'url' => env('DATABASE_URL'),
//            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
//            'database' => env('DB_DATABASE', 'laravel'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

配置文件进行配置好了 , 并且read的数据库也有数据
image
但是在调用方法进行查询的时候 报错

$a = DB::connection('read')->table('users')->get();

image
这是为啥?
谢谢!

关注 3 回答 1

_小辉o 发布了文章 · 1月14日

数组便利功能 --- 持续更新

1,对多位数组中的某个值 进行排序


array_multisort(array_column($merchant_list,'rate'),SORT_DESC,$merchant_list);
//$merchant_list     要被排序的数组
//rate  排序的值
//SORT_ASC - 默认。按升序排列 (A-Z)。
//SORT_DESC - 按降序排列 (Z-A)。

2,二维数组去掉重复值

//二维数组去掉重复值
function array_unique_fb($array2D){
 foreach ($array2D as $v){
  $v=join(',',$v); //降维,也可以用implode,将一维数组转换为用逗号连接的字符串
  $temp[]=$v;
 }
 $temp=array_unique($temp); //去掉重复的字符串,也就是重复的一维数组
 foreach ($temp as $k => $v){
  $temp[$k]=explode(',',$v); //再将拆开的数组重新组装
 }
 return $temp;
}

3, 多维数组 转换为一维数组

$result = [];
array_walk_recursive($users(要转换的数组), function($value) use (&$result) {
    array_push($result, $value);
});
查看原文

赞 1 收藏 1 评论 0

_小辉o 收藏了文章 · 2020-12-31

如何优化 Vue 祖传代码

目录

  • 前言
  • 为什么要优化
  • 从哪里开始下手
  • 现在开始

    • 1.代码压缩
    • 2.删除一些废弃的页面
    • 3.使用 cdn 优化
    • 4.修改路由引入方式
  • 结果

前言

“这页面加载也太慢了!”,一个宁静的下午就此打破,在老板和 PM 的 威逼利诱之下 ,我开始了对这个祖传(shi)山项目进行了优化,因为这个项目传到我手上至少经过了4-5代前端了,很多东西也不敢随意删,找不到负责人。

为什么要优化?

我们主要看首屏加载速度,在测试环境我们项目其实跑得还是蛮快,但是生产环境是用印尼比较差的服务器,再加上需要 kexue 上网(总是网络出现波动),在这次 UI 2.0 上线之后,堆积的东西终于越来越多,项目也越来越庞大。毫不夸张的说我们现在使用 4G 首次打开页面的速度大概在 16 秒以上,根据下面的表格推断出客户流失率,可是在印尼还在用着 3G 网络,可想而知这流失率太恐怖了。并且这是一个 C 端产品,所以要更加考虑用户体验了

客户等待页面时长的流失率

作为一个开发者,你对首页打开速度又有多高的要求呢?

从哪里开始下手

在观察了这个项目架构之后呢,我推断出以下几个可行方案

  1. 对于代码打包进行压缩
  2. 废除以前不该用到的组件及页面
  3. 使用 CDN 引入部分资源
  4. 优化路由,修改引入方式

对于这几个优化方案,也是试了一遍又一遍。确实是效果挺大的才发出来给大家围观一下

现在开始

记住这张图中三个比较大的文件 size, 我们每进行一步方案就看看效果

1.代码压缩

代码压缩是一个很不错选择,我们首先需要下载一些依赖

css 代码压缩 (optimize-css-assets-webpack-plugin)

下载

npm install optimize-css-assets-webpack-plugin

webpack.config.js 使用

const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin');
plugins: [
    new OptimizeCSSPlugin()
]

js 代码压缩 (uglifyjs-webpack-plugin)

下载

npm install uglifyjs-webpack-plugin

webpack.config.js 使用

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
plugins:[
      new UglifyJsPlugin({
      cache: true,   // 开启缓存
      parallel: true, // 开启多线程编译
      sourceMap: true,  // 是否sourceMap
      uglifyOptions: {  // 丑化参数
        comments: false,
        warnings: false,
        compress: {
          unused: true,
          dead_code: true,
          collapse_vars: true,
          reduce_vars: true
        },
        output: {
          comments: false
        }
      }
    }),
]

开启gzip

安装

npm install compression-webpack-plugin

webpack.config.js 使用

const CompressionWebpackPlugin = require('compression-webpack-plugin')
plugins:[
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp(
        '\\.(' +
        ['js', 'css'].join('|') +
        ')$'
      ),
      threshold: 10240,
      minRatio: 0.8
    })
]

nginx 配置

gzip on;
gzip_static on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6].";

先看看效果

我们在第一步就差不多减少了 1/2 的大小

接着往下看

2.删除一些废弃的页面

这个项目因为之前是一直迭代过来的,在前面也有讲到,但是我还是下定决心删除它们,在截取了一系列屏之后,我找到了老员工 与 PM 来确认页面是否已经废弃,这个环境比较费时间,这下面的表格就是一个个确认出来的

在删除这些路由之后我重新进行了打包,请看下面,还是有点效果的嘛,但这并没有达到我的预期效果

3. 使用cdn开始性能优化

我们当前使用了 mint ui 库,vue 全家桶 一系列玩意,我们找到对应的 cdn 在index.html中引入

<script data-original="https://cdn.bootcdn.net/ajax/libs/vue/3.0.2/vue.cjs.js"></script>
<script data-original="https://cdn.bootcdn.net/ajax/libs/mint-ui/2.2.9/actionsheet/index.js"></script>
<script data-original="https://cdn.bootcdn.net/ajax/libs/axios/0.21.0/axios.js"></script>
<script data-original="https://cdn.bootcdn.net/ajax/libs/vue-router/3.4.8/vue-router.common.js"></script>
<script data-original="https://cdn.bootcdn.net/ajax/libs/vue-i18n/8.22.1/vue-i18n.common.js"></script>

引入完之后呢?将不需要打包的资源进行相应的配置,所以我们需要在 webpack.config.js 中写上

externals:{
    'vue':'Vue',
    'mint-ui':'MINT',
    'axios':'axios',
    'vue-router':'VueRouter',
    'vue-i18n':'VueI18n',
},

这样就可以用来忽略这些资源了

4.修改路由引入方式

老严将页面的组件(去除之前删除的页面)数了一下是 73个,一般使用 import 引入的写法,当项目打包时路由里的所有 component 都会打包在一个js中,在项目刚进入首页的时候,就会加载所有的组件,所以导致首页加载较慢

import 引入

import DetailActivityStatic from '@/components/discover/share/DetailActivityStatic'

export default [
    {
        path: "/discover/DetailActivityStatic",
        component: DetailActivityStatic
    }
]

现在老严全部改为 使用 require

export default [
    {
        path: "/discover/DetailActivityStatic",
        component: resolve => require(['@/components/discover/share/DetailActivityStatic'], resolve)
    }
]

这个环节也有点累,因为页面实在太多了,下面是打包后的效果

我们惊奇的发现 js确实小了挺多,那么这些这些内容去哪了?我们也没有删除啊

在js文件夹中,我们发现了好多个单个js,这是为什么呢?

因为用 require 会将 component 分别打包成不同的js,按需加载,访问此路由时才会加载这个js,所以就避免进入首页时加载内容过多。

所噶,到此为止我们优化做完了。我们来看看效果吧!

结果

来看看效果吧!

有些仔细的朋友会发现,这个app.js 与 vendor.js 怎么会变得比刚刚还小呢?

因为我们得第一步压缩代码里面做了 gzip 压缩

现在首屏打开基本上控制在 1-3s 左右浮动了

相比之前的 16s 简直不要强太多,PM 与 老板 直呼 “这也太快了!啊啊啊~”

查看原文

_小辉o 发布了文章 · 2020-12-19

php tp5 爬取淘宝/天猫店铺的信息

淘宝店铺的信息的爬取

直接上代码

    //获取到传过来的链接
    $link = input('link');   
    $content = $this->getRquest($link);
    //进行转义
    $content = mb_convert_encoding($content, 'utf-8','GB2312');
    //引入PHPquery工具 -- 存放路径  /extend  目录下
    \think\Loader::import('phpQuery.phpQuery', EXTEND_PATH);
    $html  = \phpQuery::newDocumentFiles($link);
    //下载地址---https://code.google.com/archive/p/phpquery/downloads
    //如果下载不下来,可以直接百度寻找    或者留言邮箱 我看到后会发送 
    //获取店铺名
    $shop_name= pq(".shop-name>a")->text();
    $shop_name = mb_convert_encoding($shop_name,'ISO-8859-1','utf-8');
    $shop_name = mb_convert_encoding($shop_name,'utf-8','GBK');
    $shop_name = trim(str_replace("进入店铺","",$shop_name));

    //获取掌柜号
    preg_match_all('/<a class=\"seller-name J_TGoldlog\"[\s\S]*?target=\"_blank\">掌柜:([\s\S]* ?)<\/a><br>/',$content,$store_accounts);
    if (!$store_accounts[0]) {
       preg_match_all('/<p class=\"info-item\"[\s\S]*?"><span class="title">掌[\s\S]*?柜:<\/span>([\s\S]*?)<\/p>[\s\S]*?<span class="title">客[\s\S]*?服:/',$content,$store_accounts);
    }
   $owner = trim($store_accounts[1][0]);
   
    
    //此方法单纯的curl
    private function getRquest($url)
    {
        $headers = $this->randIp();
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_ENCODING, "");
        // 3. 执行并获取HTML文档内容
        $output = curl_exec($ch);
        // 4. 释放curl句柄
        curl_close($ch);
        return $output;
    }
    
    //也可以使用此方法  增加了header头 以及构造随机的ip
    private function getHeaderRequest($url){
        //构造随机ip
        $ip_long = array(
            array('607649792', '608174079'), //36.56.0.0-36.63.255.255
            array('1038614528', '1039007743'), //61.232.0.0-61.237.255.255
            array('1783627776', '1784676351'), //106.80.0.0-106.95.255.255
            array('2035023872', '2035154943'), //121.76.0.0-121.77.255.255
            array('2078801920', '2079064063'), //123.232.0.0-123.235.255.255
            array('-1950089216', '-1948778497'), //139.196.0.0-139.215.255.255
            array('-1425539072', '-1425014785'), //171.8.0.0-171.15.255.255
            array('-1236271104', '-1235419137'), //182.80.0.0-182.92.255.255
            array('-770113536', '-768606209'), //210.25.0.0-210.47.255.255
            array('-569376768', '-564133889'), //222.16.0.0-222.95.255.255
        );
        $rand_key = mt_rand(0, 9);
        $ip= long2ip(mt_rand($ip_long[$rand_key][0], $ip_long[$rand_key][1]));
        $ch = curl_init();
        //cookie值使用自己的,可以在请求头中找到
        $headers = array(
            "Content-type: text/xml;charset=\"utf-8\"",
            "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1",
            "Cache-Control: no-cache",
            "Pragma: no-cache",
            "cookie:lid=%E9%87%8E%E7%8B%BChy; cna=B129FQUBcC0CAXoEOzNJdBZo; ali_apache_track=c_mid=b2b-1791803016|c_lid=%E9%87%8E%E7%8B%BChy|c_ms=1; UM_distinctid=16cb31d9d5fbdc-0f653114eac331-SD; _is_show_loginId_chang-gsd6_false; __rn_alert__=false; isg=BD4-dSADSADs; l=dSD-sdSD-VC..",
            "user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36",
            'CLIENT-IP:'.$ip,'X-FORWARDED-FOR:'.$ip
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_ENCODING, "");        // 3. 执行并获取HTML文档内容
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
        $output = curl_exec($ch);
        // 4. 释放curl句柄
        curl_close($ch);
        return $output;
    }


天猫店铺

    //值获取可以根据获取到信息进行查找
    $shop_name= pq("#shopExtra>.slogo>.slogo-shopname>strong")->text();
    $owner =  pq(".extend>ul>.shopkeeper>.right>a")->text();
查看原文

赞 2 收藏 1 评论 0

_小辉o 提出了问题 · 2020-11-30

解决laravel 框架生成的日志所有者是apache 如何让他变为 nginx?

laravel 的一个项目部署好了之后,生成的日志文件是apache的所有者权限,想把他变为nginx的所有者权限.
他是自动生成的 所以 chown 这个不好使
是不是哪里的配置需要更改一下

linux + nginx + redis + php7.3 + pm2 + laravel 5.6

都是使用yum安装的 都是一些正常的配置

这个要怎么更改一下 谢谢!

关注 3 回答 2

_小辉o 提出了问题 · 2020-11-19

PHP可以写脚本软件吗?

想做一个脚本软件,可以进行控制手机的.
比如我打开这个软件之后 他可以自动帮我去进行一个操作,比如打开微信,或者做一些什么事情,而且可以控制时间,比如说运行多长时间自行关闭这样.

这样的软件 可以拿PHP写脚本,或者用什么可以实现?

谢谢!

关注 1 回答 1

_小辉o 提出了问题 · 2020-11-19

PHP可以写脚本软件吗?

想做一个脚本软件,可以进行控制手机的.
比如我打开这个软件之后 他可以自动帮我去进行一个操作,比如打开微信,或者做一些什么事情,而且可以控制时间,比如说运行多长时间自行关闭这样.

这样的软件 可以拿PHP写脚本,或者用什么可以实现?

谢谢!

关注 1 回答 1

_小辉o 赞了回答 · 2020-11-19

uniapp的代码 如何进行转换为微信小程序的代码

image.png
选中项目后在运行菜单中就可以找到了

第一次运行会提示你微信开发工具的位置,按照提示配置就行

关注 5 回答 3

认证与成就

  • 获得 6 次点赞
  • 获得 11 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 11 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2017-10-27
个人主页被 643 人浏览