PHPOK百万数据基本性能测试

时间:02月09日 04:15    阅读次数:725

PHPOK系统是一套自定义强大的CMS,因此有很多人质疑系统的性能问题,春节期间我们抽空做了下百万数据量的性能测试,包括前台读取,写入,后台管理等操作。

第一步、准备工作

测试环境:Oracle VM VirtaulBox 下的 Win7 虚拟机环境

操作系统:windows 7 专业版 Server Pack 1(32位操作系统)

安装内存:3.00 GB

处理器:Intel(R) Core(TM) i5-6402P CPU @2.80GHz 2.81 GHz

Web服务器:Apache/2.4.23 (Win32) 

PHP:5.5.38

MYSQL:5.5.53

图片

另外说明一下:本虚拟机安装在机械硬盘(我的实体机是有SSD硬盘,不清楚这个对虚拟机下的性能测试是否有影响)

第二步、批处理写入数据

1、请先到后台关掉验证码

图片

图片


2、开启发布权限

没有找到在哪里,请切换到开发模式下(点这里查看如何进入开发模式

图片

图片

图片

提交并保存项目配置!

3、模块开启前台可编辑模式

图片

图片

4、准备测试的文本

标题:火箭22连胜登上西部榜首 麦蒂哑火街球王枪挑湖人

摘要:北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。

内容

<p>新浪体育讯 北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。<br/><br/>火箭(46-20)将NBA第二长的连胜延长到22场,同时独享西部第一的位置,将湖人甩开了一场。特雷西-麦克格雷迪上半场一分未得,最后16投仅4中,得11分。拉夫-阿尔斯通挺身而出,他三分球11投8中,砍下了31分并助攻5次。替补出场的鲍比-杰克逊9投7中,也拿下19分。肖恩-巴蒂尔14分,路易斯-斯科拉13分。点此祝贺火箭豪取22连胜&gt;&gt;&gt;<br/><br/>湖人(45-21)遭到2连败。科比也表现平平,他33投仅11中,得24分7个篮板,拉马尔-奥多姆17分11个篮板,罗尼-图里亚夫13分8个篮板。<br/><br/>火箭连战连捷,连老天都帮他们,在连胜的过程中,打黄蜂时对手少了大卫-韦斯特,打小牛时德克-诺维茨基被禁赛,而今天面对湖人,加索尔又在上一场扭伤脚踝。不过火箭可不会同情对手,再说他们的主将姚明已经缺阵了两个星期。</p>

5、编写批处理脚本

我们这里提供的是PHP脚本,建议直接保存为post.php

<?php
//批量提交地址
$url = "http://192.168.1.120/phpok/api.php";
$data = array();
$data['c'] = 'post';
$data['f'] = 'save';
$data['id'] = 'news';
$data['cate_id'] = 8;
$data['title'] = '火箭22连胜登上西部榜首 麦蒂哑火街球王枪挑湖人';
$data['note'] = '北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。';
$data['content'] = '<p>新浪体育讯 北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。<br/><br/>火箭(46-20)将NBA第二长的连胜延长到22场,同时独享西部第一的位置,将湖人甩开了一场。特雷西-麦克格雷迪上半场一分未得,最后16投仅4中,得11分。拉夫-阿尔斯通挺身而出,他三分球11投8中,砍下了31分并助攻5次。替补出场的鲍比-杰克逊9投7中,也拿下19分。肖恩-巴蒂尔14分,路易斯-斯科拉13分。点此祝贺火箭豪取22连胜&gt;&gt;&gt;<br/><br/>湖人(45-21)遭到2连败。科比也表现平平,他33投仅11中,得24分7个篮板,拉马尔-奥多姆17分11个篮板,罗尼-图里亚夫13分8个篮板。<br/><br/>火箭连战连捷,连老天都帮他们,在连胜的过程中,打黄蜂时对手少了大卫-韦斯特,打小牛时德克-诺维茨基被禁赛,而今天面对湖人,加索尔又在上一场扭伤脚踝。不过火箭可不会同情对手,再说他们的主将姚明已经缺阵了两个星期。</p>';
$post = http_build_query($data);
$headers = array();
$headers[] = "Content-length: ".strlen($post);
set_time_limit(0);
$curl = curl_init();
curl_setopt($curl, CURLOPT_FORBID_REUSE, true);
curl_setopt($curl, CURLOPT_HEADER,false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST,true);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,3);//等待时间,超时退出
curl_setopt($curl, CURLOPT_ENCODING ,'gzip');//GZIP压缩
curl_setopt($curl, CURLOPT_TIMEOUT, 3);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_URL, $url);

for($i=0;$i<1000000;$i++){
    $content = curl_exec($curl);
    echo $content.'-'.date("Y-m-d H:i:s").'------'.$i;
    echo "\n";
}
curl_close($curl);

您可以直接在Linux上执行:

/usr/bin/php post.php

其中 /usr/bin/php 是您的PHP解释器,一般CentOS默认安装就是放在 /usr/bin/php 下,可以用命令

which php

查找。

运行后,系统会慢慢执行写入直接数据写入界面如下:

图片

就目前脚本执行效果(一秒约插入20条),估计得有10多个小时左右。这个可真的有得等了。

我们研究了下数据库的写法,发布涉及到三个表写入,经测试可以自拼接SQL语句执行。

脚本如下:

<?php
/**
 * 批量提交数据
 * @作者 qinggan <admin@phpok.com>
 * @版权 深圳市锟铻科技有限公司
 * @主页 http://www.phpok.com
 * @版本 5.x
 * @授权 http://www.phpok.com/lgpl.html 开源授权协议:GNU Lesser General Public License
 * @时间 2019年2月8日
**/

date_default_timezone_set('Asia/Shanghai');

/**
 * 数据库相关信息,批量写入建议使用本地,不要走网络
**/
$server = array();
$server['host'] = '127.0.0.1'; //数据库服务器
$server['user'] = 'root'; //数据库账号
$server['pass'] = 'root'; //数据库密码
$server['port'] = 3306; //数据库端口号
$server['socket'] = ''; //Socket 地址,一般留空即可
$server['data'] = 'demo'; //数据库名称

//准备要写入的数据
$data = array();
$data['site_id'] = 1;
$data['pid'] = 43;
$data['mid'] = 22;
$data['cate_id'] = 8;
$data['title'] = '火箭22连胜登上西部榜首 麦蒂哑火街球王枪挑湖人';
$data['note'] = '北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。';
$data['content'] = '<p>新浪体育讯 北京时间3月17日凌晨,火箭在主场以104-92击败湖人,完成了22连胜的伟业,同时也登上了西部第一的宝座。<br/><br/>火箭(46-20)将NBA第二长的连胜延长到22场,同时独享西部第一的位置,将湖人甩开了一场。特雷西-麦克格雷迪上半场一分未得,最后16投仅4中,得11分。拉夫-阿尔斯通挺身而出,他三分球11投8中,砍下了31分并助攻5次。替补出场的鲍比-杰克逊9投7中,也拿下19分。肖恩-巴蒂尔14分,路易斯-斯科拉13分。点此祝贺火箭豪取22连胜&gt;&gt;&gt;<br/><br/>湖人(45-21)遭到2连败。科比也表现平平,他33投仅11中,得24分7个篮板,拉马尔-奥多姆17分11个篮板,罗尼-图里亚夫13分8个篮板。<br/><br/>火箭连战连捷,连老天都帮他们,在连胜的过程中,打黄蜂时对手少了大卫-韦斯特,打小牛时德克-诺维茨基被禁赛,而今天面对湖人,加索尔又在上一场扭伤脚踝。不过火箭可不会同情对手,再说他们的主将姚明已经缺阵了两个星期。</p>';

/**
 * 特别说明下,本次批量写入涉及到主要三个表:qinggan_list,qinggan_list_cate和qinggan_list_22(是指定的mid)
**/

set_time_limit(0);
$conn = mysqli_init();
mysqli_real_connect($conn,$server['host'],$server['user'],$server['pass'],$server['data'],$server['port'],$server['socket'],MYSQLI_CLIENT_COMPRESS);
mysqli_query($conn,"SET NAMES 'utf8'");
mysqli_query($conn,"SET sql_mode=''");
$sql = "SELECT max(id) FROM `qinggan_list` LIMIT 1";
$query = mysqli_query($conn,$sql);
$rs = mysqli_fetch_array($query,MYSQLI_NUM);
mysqli_free_result($query);
$start_id = $rs[0];
for($i=0;$i<10000;$i++){
    $sql_1 = "INSERT INTO `qinggan_list` (`id`, `cate_id`, `module_id`, `project_id`, `site_id`, `title`, `dateline`, `status`) VALUES";
    $sql_2 = "INSERT INTO `qinggan_list_cate` (`id`, `cate_id`) VALUES";
    $sql_3 = "INSERT INTO `qinggan_list_".$data['mid']."` (`id`, `site_id`, `project_id`, `cate_id`, `content`, `note`) VALUES";
    $tmp_1 = $tmp_2 = $tmp_3 = array();
    for($m=0;$m<100;$m++){
        $start_id++;
        $tmp_1[] = "(".$start_id.", ".$data['cate_id'].", ".$data['mid'].", ".$data['pid'].", ".$data['site_id'].", '".$data['title']."', ".time().", 1)";
        $tmp_2[] = "(".$start_id.", ".$data['cate_id'].")";
        $tmp_3[] = "(".$start_id.", ".$data['site_id'].", ".$data['pid'].", ".$data['cate_id'].", '".$data['content']."', '".$data['note']."')";
    }
    $sql = $sql_1.''.implode(",",$tmp_1);
    mysqli_query($conn,$sql);
    $sql = $sql_2.''.implode(",",$tmp_2);
    mysqli_query($conn,$sql);
    $sql = $sql_3.''.implode(",",$tmp_3);
    mysqli_query($conn,$sql);
    echo $start_id.'---'.date("Y-m-d H:i:s").'---'.$i;
    echo "\n";
}
mysqli_close($conn);

经测试,直接写SQL插入,十几分钟左右就可以写入百万数据:)

执行脚本效果图如下:

图片

第三步、后台测试

进后台查看数据

图片


100万的数据,大小占用1.32GB,占用量还是不少的。

1、开启调试界面

只有开启后,我们才能看到运行时间

用代码编辑器(notepad++,everedit,phpstrom,vscode,editplus)打开 _config/global.ini.php

找到 debug = false 改成 debug = true

图片

图片

2、后台页码链接请求测试

点开第1页:(用时 0.517 秒,数据库执行 0.463 秒)

图片


点开第2页:(用时 0.517 秒,数据库执行 0.463 秒)

图片


点开第3页:(用时 0.531 秒,数据库执行 0.471 秒)

图片


点开第8页:(用时 0.551 秒,数据库执行 0.501 秒)

图片


经测试,点击前面几页,效果比较理想,我们现在点尾页看下:(用时 5.588 秒,数据库执行 5.528 秒)

图片


点开第54149页:(用时 5.558 秒,数据库执行 5.508 秒)

图片


点开第26000页:(用时 5.598 秒,数据库执行 5.508 秒)

图片

3、带主题关键搜索的点击(默认程序,未单独优化)

输入关键字搜索

图片

第1页:(用时 1.031 秒,数据库执行 0.981 秒)

图片


第3页:(用时 0.941 秒,数据库执行 0.861 秒)

图片


第8页:(用时 1.222 秒,数据库执行 1.152 秒)

图片


最后一页:(用时 11.326 秒,数据库执行 11.246 秒)

图片



第54149页:(用时 10.856 秒,数据库执行 10.796 秒)

图片

4、扩展字段搜索测试

图片


第1页:(用时 9.123 秒,数据库执行 8.763 秒)

图片


第3页:(用时 8.572 秒,数据库执行 8.512 秒)

图片


第8页:(用时 8.352 秒,数据库执行 8.252 秒)

图片


最后一页:(出现超时)(用时 29.152 秒,数据库执行 28.701 秒)

图片


第54143页:(用时 28.811 秒,数据库执行 28.741 秒)

图片

5、前台列表页

前台大量使用缓存技术,故截图会有第一次访问及第二次访问情况


第1页:(首次用时 0.991 秒,数据库执行 0.581 秒)(第二次用时 0.100 秒,数据库执行 0.02 秒)

图片

图片

主要区别就是对数据查询进行了文本缓存(用户可自行设置为 memcache 缓存)


最后一页:(首次用时 7.07 秒,数据库执行 6.96 秒)(第二次用时 0.08 秒,数据库执行 0.009 秒)

图片

图片

6、前台输入关键字

第1页:(用时 7.941 秒,数据库执行 7.421 秒)

图片


最后一页:(用时 12.157 秒,数据库执行 11.867 秒)

图片

总结

OK系统在【添加数据】【修改数据】【删除数据】这三个动作在百分数据里没有太多的影响,和普通操作差不多(主要是基于主键检索,定位快)

后台访问:前面几页(500页以内)的数据,那操作和平时没有多少区别!基本上也是零点几秒的响应!500页以上响应一般在10秒内,(OK系统在页码500做了读取优化)(注,每页显示20条数据计算)

前台访问:前台第一次访问会稍慢一些,不过总体上不影响优雅的体验,同时做了大量的缓存优化(缓存数据是共享的)

带自定义扩展的搜索,性能就比较一般,在测试过程中,自定义扩展字段的搜索有时候会造成超时问题(因此,这里说明下,如果您的网站有百万级数据,请单独对表进行优化处理)

我们相信,如果这是一台Linux服务器,可能性能还能更加优秀!另外可以适当调节PHP参数,MySQL参数及Apache的参数,来实现网站更高效运行。

其他说明

本测数据测试是使用了集成环境 PHPStudy ,所有参数都是默认(数据库,PHP,Apache里的参数都是原先 PHPStudy 配好的)

后续我们会PHPOK进行AB压力测试

其他CMS测试方法请参考:http://www.powereasy.net/HelpYou/Report/5871.html

回复(0 条回复)
游客
论坛咨询