PHP fputcsv()高效导出大数据量Excel(CSV)

前端时间公司部门提出后台要增加数据导出,以方便他们统计业务数据,很多人使用的PHPExcel插件,这个插件能很方便快捷的达到导入导出的功能。。

有需要PHPExcel导出的可以点击下面的链接

ThinkPHP3.2.3接入PHPExcel1.8.0控件导出Excel报表文件处理方法


现在问题来了。。虽然Excel表格最高支持107W行,但是只要数据达到2W-3W的量,PHPExcel就显得有点无力了,经常卡死或者内存溢出,这种大数据量的导出如果换成PHP自带函数 fputcsv() 来实现的话,效率能有很大的提升

set_time_limit(0);
ini_set("memory_limit", "1024M");

//		导出到本地
header ( "Content-type:application/vnd.ms-excel" );
header ( "Content-Disposition:filename=".$sname."商品销售报表.csv" );
header ('Cache-Control: max-age=0');

$fp = fopen('php://output', 'a');					//打开PHP文件句柄,php://output 表示直接输出到浏览器

$head = ['商品名称','商品条码','商品分类','现有库存','销售数量','商品总价','实收金额'];		//定义标题

foreach ($head as $i => $v) {
    $head[$i] = iconv('utf-8', 'GB18030', $v);		//将中文标题转换编码,否则乱码
}

fputcsv($fp, $head);								//将标题名称通过fputcsv写到文件句柄

foreach ($data as $k => $v) {						//重组数组
	$rows[$k]['gname'] = $v['gname'];
	$rows[$k]['barcode'] = $v['barcode'];
	$rows[$k]['cname'] = $v['cname'];
	$rows[$k]['kc'] = '1';
	$rows[$k]['sl'] = $v['sl'];
	$rows[$k]['hj'] = round($v['hj'],2);
	$rows[$k]['ss'] = round($v['hj'],2);
}

$limit = 30000;
$num = 0;											//计数器
foreach ( $rows as $v ) {  							//循环数据
	$num++;

	if($num == $limit){
		ob_flush();			//释放内存
		flush();
	}
    $rows = array();
    foreach ( $v as $kk => $vv){
        $rs[$kk] = iconv('utf-8', 'GB18030', $vv);	//转译编码
    }
    fputcsv($fp, $rs);
}

321321.png

最后需要注意的是,无论是使用PHP内置函数还是使用PHPExcel做导出功能,都需要使用href跳转get传参的方式,如果是用Ajax异步传参的话会出现问题!!!


点击下方图标打赏一个呗~

前端媒体查询 之PX or EM or REM?

你是否思考过对于媒体查询你应该使用px,em还是rem?我也产生过同样的问题,并且目前为止,我还是没有明确的答案。

一年之前,我第一次创建 mappy-breakpoint 仓库时,我一直使用rem单位。之后一次和铜板的谈话之后,我开始转向使用em,因为我并没有发现两者之间的区别。

关于媒体查询,除了emrem,常用单位还有像素。自从现在所有浏览器存在像素缩放问题,我想知道像素是否还可以用于媒体查询。

这周,我打算弄明白两者之间的区别。

在开始这篇文章之前,我假设你已经知道了什么是emrem单位。如果你不知道的话,请查阅这篇文章。

基础实验

我想创建三个独立的<div>元素,一个用于px,一个用于em,一个用于rem。我给每个<div>元素添加一个背景色,便于区分。

.pixel { background: red; }.em { background: green; }.rem { background: blue; }

接下来,因为我们比较媒体查询单位,我在三个选择器上创建了一个min-width

当媒体查询被触发时,我决定降低元素的不透明度,这样我就可以立即看到他们之间的差异。下面是像素媒体查询的 CSS 样式:

.pixel {  background: red;  
  @media (min-width: 400px) {    opacity: 0.5
  }
}

接下来,我们就要弄清楚如何创建emrem单位。

在第一次实验中,如果所有条件都理想的话,我想要测试三个单位之间的差异。换句话说,没有以下情况下发生:

  • <html>中更改font-size

  • 用户放大。

  • 用户更改浏览器字体设置。

如果已经满足了以上理想的条件,我就可以想当然认为的16px == 1em == 1rem。那么 400px就等于25em25rem.

.pixel {  background: red;  
  @media (min-width: 400px) {    opacity: 0.5
  }
}
.em {  background: green;  
  // 400 ÷ 16 = 25
  @media (min-width: 25em) {    opacity: 0.5
  }
}
.rem {  background: blue;  
  // 400 ÷ 16 = 25
  @media (min-width: 25rem) {    opacity: 0.5
  }
}

如果三个媒体查询以相同的方式进行,我们应该就可以看到他们都准确的在 400px 触发

结果如下(我在每一个浏览器所测试的)。

1.gif

因为三个媒体查询在相同的断点处被触发,所以我们知道,这一阶段pxemrem之间并无差异.

建立基础实验后, 下一步是要测试在缺少以上理想条件的情况下,会出现什么情况。同样的,条件为:

  • <html>中更改font-size

  • 用户放大。

  • 用户更改浏览器字体设置。

让我们一个一个的去测试。

在HTML中更改Font-size

第一种情况是很普遍的。事实上,几乎所有的网页使用此方法在CSS中设置font-size默认值:

html { 
  // setting default font size 
  font-size: 200% 
}

这里,我在测试中选择将font-size设置为200%,这意味着我将1em1rem设置为了32px.如果emremfont-size改变的影响,他们将会在800px被触发。

如下是测试结果:所有的媒体查询在Chrome, Firefox 和 IE 11浏览器下均在400px被触发。

2.gif

这是正确的表现行为。emrem单位在HTML中不应受font-size的变化影响,因为他们是基于浏览器内部的font-size属性。

不幸的是,我们没在 Safari 上得到此完美的行为。它在800px时触发了rem媒体查询:(

3.gif

因为这种行为只发生在 Safari 浏览器中,我很想看看是否移动端 Safari也会出现此情况。实验证明,也会出现此现象。

所以,第一个场景已经证明,我们不应该使用rem媒体查询。然而,让我们继续把 rem 放在我们其余的实验中,看看是否会发生其他的事情。

用户放大

第二种情况也是十分常见的。如果你页面上的文本不足够大,用户可能会选择使用他们浏览器中内置的缩放功能来放大文本。

一个简短的说明:最初关于em的想法是因为当用户放大时,旧浏览器不能够更新像素值。在这方面,测试媒体查询单位时缩放将有助于回答这个问题,我们是否可以现在使用基于px的媒体查询。

4.gif

这个实验结果显示,Chrome,Firefox 和 IE 显示相同的行为。px单位查询在emrem查询时被同时触发。

5.gif

哈哈,你猜对了...Safari并不支持:(

6.gif

不幸的是,这意味着基于像素的媒体查询是不存在问题的。Safari浏览器不支持他们(除非你决定放弃 Safari?)。

现在,我们进行最后的实验,看看是否仍然会发生什么意外。

用户更改浏览器的Font值

许多开发商愿意相信,用户不会改变他们浏览器font-size的值,因为他们已经隐藏在 deeeep 的设置之中。

恩恩,如果这样子的话后果会很棒,因为所有用户都表示出此行为,我们就不需要做这个实验!:)

不幸的是,并没有数据证明用户不更改他们浏览器的font-sizes属性值,所以作为开发人员,我们仍然有责任考虑到我们网站的灵活性。

在这个实验中,我扩大了四个浏览器中的font-size属性值,并通过以下方式进行测试(如果你想跟随):

  • Chrome: 前往settingsshow advanced settingsweb-content.

  • Firefox: 前往preferencescontentfonts 和 colors.

  • Internet Explorer: 在page单击, 之后 text-size.

我想不出在何处设置字体大小的唯一浏览器是Safari。所以我用代理服务器代替。例如,我将最小的字体大小更改为大于16px的设置。如果你也要这样做,请转到preferencesadvancedacessibility.

这是唯一所有浏览器表现行为一致的测试:

7.gif

正如你所看到的,像素查询的触发要早于emrem查询。

这里没有出现任何bug。由于 px 是绝对单位,就会正确的执行。无论用户如何更改他们默认的font-size属性值,断点应维持在 400px处。

另一方面,emrem基于浏览器的font-size属性值。因此,当用户更改默认值时,应该更新其媒体查询的font-size设置。

所以,这里对于像素的痴迷者,我很抱歉打破你的泡沫幻想,但基于像素查询是行不通。

实验总结

正如你可以从上面实验中看出,在四个浏览器之间表现一致的唯一单位是em。除了emrem在 Safari 上发现的bug之外,其并不存在任何差异。

px媒体查询在三次实验的两次中均表现正常(再一次,除了Safari)。不幸的是,在第三个实验中,当用户更改默认的浏览器font-size值时,px媒体查询仍在400px被触发。

因此,我在这些实验后得出的结论是:使用em媒体查询.

如果您正在使用一个没有使用em媒体查询的库时,你应该让其开发人员查看这篇文章,让他们知道他们的代码影响。不然,可以参考基于emMappy-breakpointsBreakpoint-sass 或者 sass-mq 库。


MySQL FROM_UNIXTIME根据指定时间段分组获取数据

UNIX_TIMESTAMP 将时间输出为时间戳

1、无参数调用:UNIX_TIMESTAMP()

返回值:当前时间戳

例子:select UNIX_TIMESTAMP(); => 1494746052  (2017/5/14 15:14:12)

2、无参数调用:UNIX_TIMESTAMP(date)

例子:select UNIX_TIMESTAMP("2017-01-01"); => 1483200000  (2017/01/01 00:00:00)



FROM_UNIXTIME 格式化MYSQL时间戳函数

作用:将MySQL中以int(11)存储的时间以"YYYY-MM-DD HH-II-SS"的格式来显示

语法,FROM_UNIXTIME(time,"%Y-%m-%d %H:%i:%s")

比如统计每天销售时间段高峰期(以小时分组),数据库表存了一张订单记录表:create table table_name(id int primary key,time int(10));  time记录的是订单时间戳,以前的做法是,接收查询开始时间、查询结束时间,然后循环查询每天的注册数量,代码:

/* 查询2015-12-01 至 2015-12-14 */  
// 开始的时间戳  
$startUnix = 1494604800; // 2017-05-13 00:00:00  
// 结束的时间戳  
$endUnix = 1494777599;   // 2017-05-14 23:59:59  
for($i = $startUnix; $i < $endUnix; $i += 86400){  // 86400为1天的秒数  
    // 查询  
    $sql = 'select count(*) from table_name where time> '.$i.' and register_time <= '.$i + 86400;  
    // 执行查询  
}

这种方法的弊端就是,查询开始于结束的日期相差多少天就查询检索数据库多少次。

优化方法:

/* 查询2017-05-13 至 2017-05-14 */  
// 开始的时间戳  
$startUnix = 1494604800; // 2017-05-13 00:00:00  
// 结束的时间戳  
$endUnix = 1494777599;   // 2017-05-14 23:59:59 
  
$sql = 'select count(id) as count, FROM_UNIXTIME(time, '%H') as datetime from table_name where time> '.$startUnix.' and time <= '.$endUnix group by datetime;  
// 执行查询

1111111111.png


查询时把时间戳转成小时,最后group by 分组,得到每天每个小时段的订单数,查询数据库一次

QQ截图20170514150550.png

PHP:array_multisort()对多维数组重新排序

日常的工作中,PHP经常会需要对复杂的数据重新排序处理。

可以使用PHP的array_multisort()对多个数组或多维数组进行重新排序

关联(string)键名保持不变,但数字键名会被重新索引。 
输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。——这句话是理解此函数用法的关键。

第一个参数必须是一个数组。接下来的每个参数可以是数组或者是下面列出的排序标志。

排序顺序标志: 
■SORT_ASC - 按照上升顺序排序 
■SORT_DESC - 按照下降顺序排序

排序类型标志: 
■SORT_REGULAR - 将项目按照通常方法比较 
■SORT_NUMERIC - 将项目按照数值比较 
■SORT_STRING - 将项目按照字符串比较

每个数组之后不能指定两个同类的排序标志。每个数组后指定的排序标志仅对该数组有效 - 在此之前为默认值 SORT_ASC 和 SORT_REGULAR。

$num1 = array(3, 5, 4, 3);
$num2 = array(27, 50, 44, 78);
array_multisort($num1, SORT_ASC, $num2, SORT_DESC);
print_r($num1);
print_r($num2);
//result: Array ( [0] => 3 [1] => 3 [2] => 4 [3] => 5 ) Array ( [0] => 78 [1] => 27 [2] => 44 [3] => 50 )

对多维数组(以二位数组为例)进行排序:

先看下结果(左边是未排序之前的数组,右边是排序过后的数组,按照price从大到小排序)

QQ截图20170508104853.png


下面是排序处理源码,最终得到上图的排序结果

	foreach ($out_arr['data'] as $k => $v) {
		$arr[] = $v['son']['price'];			//将需要排序的字段压入空数组
	}
			
	array_multisort($arr,SORT_DESC,SORT_NUMERIC,$out_arr['data']);
//	参数:1.排序数据,2.排序方式,3将每一项按数字顺序排列,4.数据源

QQ截图20170508105532.png

基于ThinkPHP框架MySQL事务的使用

一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。

实际上,很多项目的连贯操作都需要依赖事务来保证数据的完整性。将许多SQL查询到一个组中,将执行所有的人都一起作为事务的一部分。


事务的特性: 

事务有以下四个标准属性的缩写ACID,通常被称为:


原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。


一致性: 确保数据库正确地改变状态后,成功提交的事务。


隔离性: 使事务操作彼此独立的和透明的。


持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在。


MySQL的存储引擎

关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。


在mysql客户端中,使用以下命令可以查看MySQL支持的引擎。

show engines;

MyISAM

MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:


1.tb_demo.frm,存储表定义;
2.tb_demo.MYD,存储数据;
3.tb_demo.MYI,存储索引。

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。


InnoDB

InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的MySQL 5.6.13版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
5.支持自动增加列AUTO_INCREMENT属性。

一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。


MEMORY

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

一般在以下几种情况下使用Memory存储引擎:

1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。

2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。

3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。


MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。Merge存储引擎的使用场景。

对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。


ARCHIVE

Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。


如何选择合适的存储引擎?
(1)选择标准可以分为:
(2)是否需要支持事务;
(3)是否需要使用热备;
(4)崩溃恢复:能否接受崩溃;
(5)是否需要外键支持;
然后按照标准,选择对应的存储引擎即可。


下面是基于ThinkPHP框架的事务使用方式

//启动事务:
$User->startTrans(); 
//提交事务:
$User->commit();
//事务回滚:
$User->rollback();

QQ截图20170419161754.png

thinkphp隐藏默认显示的index.php入口配置

一、在Apache根目录conf文件夹下的httpd.conf配置文件中加载mod_rewrite.so模块;

#LoadModule rewrite_module modules/mod_rewrite.so把前面的井号注释去掉

QQ截图20170419152141.png


二、将AllowOverride None 的None全部改为 All     

在APACHE里面去配置 (注意其他地方的AllowOverride也统统设置为ALL)

即:AllowOverride none  改   AllowOverride ALL

保存httpd.conf,重启Apache服务器;

QQ截图20170419152310.png


三、配置配置项文件config.php

/*隐藏index.php主入口*/
'URL_CASE_INSENSITIVE' => true,
//REWRITE模式
'URL_MODEL' => 2,

QQ截图20170419152453.png


四、在根目录下的.htaccess文件添加:

Rewritebase /index.php

注意:如果在Linux的服务器下,.htaccess文件使用下面的配置

#伪静态和泛域名 
 #此文件禁止在行内注释
 <IfModule mod_rewrite.c>
 RewriteEngine on
 #禁止对图片等文件重写:没有这一条,所有的404都会执行index.php脚本,耗费大量资源。
 RewriteCond %{REQUEST_URI} !((.*).jpg|.jpeg|.bmp|.gif|.png|.js|.css)$
 #禁止对/public文件夹内重写,作用同上
 RewriteCond %{REQUEST_URI} !(^/public/(.*))$
 #如果是一个物理存在的目录,禁止重写
 RewriteCond %{REQUEST_FILENAME} !-d
 #如果是一个物理存在的文件,禁止重写
 RewriteCond %{REQUEST_FILENAME} !-f
 #上面2条不识别REQUEST_FILENAME时的替代写法
 #RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
 #RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
 #php api模式,服务器能识别PATH_INFO
 #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
 #php fastcgi模式 服务器不识别PATH_INFO
 RewriteRule ^(.*)$ index.php [E=PATH_INFO:$1,QSA,PT,L]
 </IfModule>

微信截图_20170523164843.png

至此配置完成。。。

web性能优化 - Apache-ab压力测试

Apache的ab命令模拟多线程并发请求,测试服务器负载压力,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载,因此是某些DDOS攻击之必备良药,老少皆宜。自己使用也须谨慎。否则一次上太多的负载,造成目标服务器直接因内存耗光死机,而不得不硬重启,得不偿失。在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对web服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)
Apache附带的压力测试工具ab,非常容易使用,并且完全可以摸你各种条件对Web服务器发起测试请求。ab可以直接在Web服务器本地发起测试请求,这对于需要了解服务器的处理性能至关重要,因为它不包括数据的网络传输时间以及用户PC本地的计算时间。。

11.png


   参数:-n 在测试会话中所执行的请求总数
         -c 一次产生的请求个数,并发数。默认是一次一个。
         -t测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
         -p包含了需要POST的数据的文件。
         -P对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 
是否发送了401认证需求代码),此字符串都会被发送。
         -T POST数据所使用的Content-type头信息。
         -v设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。
         -V显示版本号并退出。
         -w以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
         -i执行HEAD请求,而不是GET。
         -x设置<table>属性的字符串。
         -X对请求使用代理服务器。
         -y设置<tr>属性的字符串。
         -z设置<td>属性的字符串。

22.png


This is ApacheBench, Version 2.3 <$Revision: 655654 $> 
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.10 (be patient) 
Completed 100 requests 
Completed 200 requests 
Completed 300 requests 
Completed 400 requests 
Completed 500 requests 
Completed 600 requests 
Completed 700 requests 
Completed 800 requests 
Finished 800 requests

Server Software:        Microsoft-HTTPAPI/2.0 
Server Hostname:        192.168.0.10 
Server Port:            80
Document Path:          / 
Document Length:        315 bytes        //HTTP响应数据的正文长度
Concurrency Level:      800 
Time taken for tests:   0.914 seconds    //所有这些请求处理完成所花费的时间 
Complete requests:      800              //完成请求数 
Failed requests:        0                //失败请求数 
Write errors:           0                
Non-2xx responses:      800 
Total transferred:      393600 bytes     //网络总传输量 
HTML transferred:       252000 bytes     //HTML内容传输量 
Requests per second:    875.22 [#/sec] (mean) //吞吐量-每秒请求数 
Time per request:       914.052 [ms] (mean)   //服务器收到请求,响应页面要花费的时间 
Time per request:       1.143 [ms] (mean, across all concurrent requests) //并发的每个请求平均消耗时间 
Transfer rate:          420.52 [Kbytes/sec] received //平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

网络上消耗的时间的分解: 
Connection Times (ms) 
              min  mean[+/-sd] median   max 
Connect:        0    1   0.5      1       3 
Processing:   245  534 125.2    570     682 
Waiting:       11  386 189.1    409     669 
Total:        246  535 125.0    571     684


Thinkphp3.2.3使用PHPqrcode生成二维码(附带插件下载链接)

前段时间用jquery.qrcode给每个页面自动生成二维码,却发现和前端页面的jQuery冲突导致某些js效果失效,后来换成使用PHPqrcode生成二维码,前端直接调用接口


PHPqrcode下载链接:http://pan.baidu.com/s/1qY0I4jU

提取密码:2asa


一:下载PHPqrcode并且解压


二:将PHPqrcode文件夹放入ThinkPHP\Library\Vendor中

QQ截图20170113153109.png


三:在控制器中写入下方代码

/**
* 生成链接二维码
* @param $id : 文章主键
* @param $level : 容错级别
* @param $size : 点大小
*/
public function qrcode($id=9,$level=3,$size=4){
			
	Vendor('phpqrcode.phpqrcode');					//导入phpqrcode组件
	$url = "http://www.isblog.cn/isC/".$id.".html";		//跳转链接
	$errorLevel = intval($level);					//容错级别:L、M、Q、H
	$imgSize = intval($size);					//点的大小:1到10,用于手机端4就可以了
	$object = new \QRcode();					//实例化
	$object->png($url, false, $errorLevel, $imgSize, 2);
			
}

22.png


四:在前端页面需要调用该二维码的img标签中直接调用该方法即可

33.png

ThinkPHP3.2.3路由设置,短链接优化站点url,更利于搜索引擎优化

众所周知,搜索引擎对于动态路径的网站抓取是相当不友好的,因此,网站该如何设置静态、伪静态页面呢?


下面说一下ThinkPHP3.2.3框架的静态路由设置(静态路由其实属于规则路由的静态简化版,又称之为URL映射)。


一:在Application\Common\Conf\config.php中配置路由配置项

return array(
//'配置项'=>'配置值'
//模块化
'MODULE_ALLOW_LIST'      =>  ['Home','Admin'],                   //设置URL不显示的模块名
'MODULE_DENY_LIST'       =>  ['Module'],                         //设置禁止访问的模块列表
//路由设置
'URL_MODEL'              =>  2,                                 //URL模式,去除index.php
'URL_ROUTER_ON'         =>  TRUE,                               //开启路由
'URL_ROUTE_RULES'        =>  [                                   //定义路由规则
           'Blog/list'           =>     'enty/index',            //静态路由
           'Blog/cont/:id\d'     =>     'user/editArticle',      //动态路由
],
);


1.png

2.png

至此路由配置完成。

点击下面打赏一个呗~

WordPress博客系统外部主题安装

如果你在WordPress官方主题目录无法找到你喜欢的WordPress主题,你还可以尝试使用 谷歌。 想创建一个软件主题博客? 搜索”software wordpress theme” ;想创建一个在线商店出售产品? 搜索“online store wordpress theme” ……。

在这里,推荐几个第三方WordPress主题收藏站:

1.wopus.org——目前国内最大的WordPress主题站,提供大量的国内外WordPress主题

2.wpued.com——相对wopus,wpued提供的WordPress主题较少,但不失是个找主题的好地方

3. boygj.com——提供大量的国外免费和收费WordPress主题,是笔者最喜欢关注的国外博客之一。除了推荐WordPress主题,它还推荐Joomla模板、Drupal主题和其他一些建站素材。

如果你的预算充足,你还可以考虑购买一些优秀的专业WordPress,国外的专业WordPress主题价格一般在20-60美金之间,质量对于免费的WordPress主题好很多。或者请专业的WordPress主题设计者为了量身定做一个,价格会相对较高,视主题的功能和制作难度而定。

一旦你找到一个合适的WordPress主题,从网站下载.zip文件到你的电脑。

点击”外观—主题”进入主题管理面板,然后点击添加新主题,在下一页选择“上传”,并选择你计算机上要上传的WordPress主题.zip文件进行上传并进行安装。

如果由于某些原因,使用WordPress管理面板可以出现主题安装失败,这种情况下你可以尝试使用FTP工具直接上传WordPress主题。将主题.zip压缩包解压至你的电脑, 然后用FTP工具把它上传到您的服务器。 我们推荐你使用FlashFXP。使用FlashFXP上传WordPress主题,需要设置你的主机信息,比如网站主机的IP,FTP用户名和密码。将主题(整个文件夹)上传到wp-content/themes/文件夹下即可。

20161223114724161.png