浅谈usort、uasort、uksort

前言:这三个函数都是php提供给开发者自定义的数组排序函数。

1.usort:按值排序,索引重新定义

a.基础案例

//自定义比较的函数
function mysort($a,$b){
 if($a == $b) return 0;
 return $a>$b?1:-1; //表示从小到大排列,如果想从大到小排列,则1和-1对调一下即可 
}
$a = array(2,3,1,6,4);
usort($a,'mysort');
print_r($a);
//返回:Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 6 )

b.高级案例

//根据数组中某个元素的值大小排序[二维数组]
function mysort($a,$b){
 if($a['create_time']==$b['create_time']) return 0;
 return $a['create_time']>$b['create_time']?1:-1; 
}
$a = array(
 array('id'=>2,'create_time'=>12234234),
 array('id'=>1,'create_time'=>12234221), 
 array('id'=>3,'create_time'=>12234222), 
);
usort($a,'mysort');
echo '<pre>';
print_r($a);

返回结果:

 Array
(
 [0] => Array
 (
 [id] => 1
 [create_time] => 12234221
 )

 [1] => Array
 (
 [id] => 3
 [create_time] => 12234222
 )

 [2] => Array
 (
 [id] => 2
 [create_time] => 12234234
 )

)

2.uasort:按值排序,但会保持原来索引

3.uksort:按键排序

一些高并发的数据

根据网上一些公开的资料和演讲,我收集了一些知名网站在大促的活动中的数据。
对于公司来讲,原则上这些数据应该都是保密的,所以以下数据不一定准确,仅供参考。
2012年11月11日,淘宝网和京东网为首的电商赚足了眼球,但是在疯狂的流量下,很多网站也都出现了问题,淘宝网络瘫痪,支付宝被”抢瘫”。而京东当天流量暴涨,服务器被大流量冲垮。

阿里

2012年
在2012年11月11日双11大促当天,天猫和淘宝迎接了1.47亿的用户访问,3000万人的购买,产生了近1亿笔支付订单。在零点的一瞬间,并发在线的用户数超过了1000万。除了满足双11的各种功能需求之外,如何在前期准备过程中对系统有一个完整准确的评估,如何有效推进各种优化和容灾预案,如何在活动当天各种紧急情况下正确决策,以及如何保证在顶级流量的冲击下整个网站的稳定、性能和用户体验,这是对技术团队的极大考验。
双11当天,天猫交易系统的峰值发生在第1个小时,当时系统每秒成功处理了1.3万的下单请求。系统峰值QPS(每秒查询数)为4万/秒,系统的平均响应时间在200毫秒。天猫的商品详情页面当天的系统访问数高达16亿次,峰值吞吐率达到了6.9万次访问/秒,并且在峰值时还保持了12毫秒的高响应能力。天猫搜索双11当天PV高达5.9亿,峰值吞吐率达到了1.4万次访问/秒。

2013年
双11日当天,阿里巴巴平台上的交易规模,1分钟过亿元,6分钟破10亿,38分钟破50亿,128分钟破128亿,24小时完成交易1.71亿笔,(最高)每分钟完成79万笔,即使在相对低潮的中午时段,也有1700万人同时在线,每一个数字都创下新的纪录。
阿里巴巴在双十一前筹备了6万多台服务器,其中包括新增的2万多台,架设服务器集群来应对高频次访问量以及巨大数据处理请求。相当于中国2013年第二季度服务器销量的三分之一,相当于1.25台目前地球最强的天河2号超级计算机!

央行发布的2013年第二季度支付体系运行数据显示,今年Q2全国银行卡消费业务笔数约为30.6亿笔,平均每天约3400万笔。支付宝双11一天的支付笔数相当于Q2全国的POS机刷卡5.5天。
据eBay在2013年第三季度发布的财报显示,Paypal在2013年第三季度的总体交易笔数为7.29亿笔,平均每月为2.43亿笔。按支付宝双11当天1.88亿笔的支付量来看,已接近Paypal一个月的支付量(相当于Paypal 23天的交易量)。
而全球最大的卡组织VISA官网的信息显示,Visa 2013年Q3交易笔数为155亿笔,平均1.7亿笔/天,1.88亿笔已经超过了Visa 一天的交易笔数,而2012年 Visa全球的支付峰值为2亿笔每天。

2014年
总体上将具备支持每秒3万笔的系统峰值支付能力。
实际交易创建峰值能力为每秒8万笔,支付宝交易峰值为每分钟285万笔。
去年“双十一”,支付宝单日完成手机支付4518万笔,创下了当时的全球纪录。到今年的10月份,每天4500多万笔的手机支付笔数已经是支付宝的常态

京东

为双十一大促准备的服务器高达2000多台。

12306

2015年
一12306后台升级为“双中心”,在铁总(中国铁路总公司)和研究院各有一套系统,处理能力倍增。
二带宽从5G提升到12G,每秒承担几十万流量,是日常的2至3倍。
三租用了公有云服务器,将75%的余票查询分流给“云端”,缓解服务器压力。
四手机购票客户端升级优化,手机端最高每天卖出130万张。

2015年春运火车票售卖的最高峰日出现在12月19日,当天开售腊月28的火车票(2月16日)。12306网站访问量(PV值)达到破纪录的297亿次。当天共发售火车票956.4万张,其中互联网发售563.9万张,占比59%,均创历年新高。

抢红包

央视春晚送红包互动中,微信摇一摇总次数72亿次,峰值8.1亿次/分钟,送出微信红包1.2亿个,服务器扛住了。
大年初一零点19分,阿里巴巴掌门马云发出了支付宝中文口令红包,参与人数高达2998万人,网民共输入了近1亿个答案,99.9999万个红包在2分36秒内被一抢而空。
2015年除夕当天,微信红包收发总量达10.1亿次,是2014年的200倍,QQ红包收发总量6.37亿个,抢红包人数为1.54亿;支付宝红包收发总量达2.4亿个,总金额达到40亿元。根据微信方面2月24日公布的最新数据:除夕至初五(共六日),微信红包收发总量为32.7亿次,除夕当日收发总数为10.1亿次。

参考文档

  1. http://www.leiphone.com/news/201406/2012-taobao-360buy.html
  2. http://tech.sina.com.cn/it/2013-11-13/18058910580.shtml
  3. http://www.chinaz.com/web/2013/1120/327556.shtml
  4. http://baike.baidu.com/view/9581059.htm?fromtitle=%E6%B7%98%E5%AE%9D%E5%8F%8C%E5%8D%81%E4%B8%80%E7%8B%82%E6%AC%A2%E8%8A%82&fromid=10142546&type=syn
  5. http://tech.it168.com/a2014/1127/1686/000001686023.shtml
  6. http://www.zhihu.com/question/26573474
  7. http://www.infoq.com/cn/presentations/adult-ceremony-of-taobao-next-generation-architecture
  8. http://news.watchstor.com/industry-148795_1.htm
  9. http://www.zhihu.com/question/27321479
  10. http://network.51cto.com/art/201401/427406.htm
  11. http://www.zhihu.com/question/27590048

CI框架对一张图片裁切成不同的尺寸

/**
 *商品图片上传处理
 *@see goods_upload()
 *@author zrp <zouruiping@infoclouds.net>
 *@version 2013年11月28日16:22:48
 */
 public function goods_upload(){
 //echo ROOTPATH.'static/uploads';die;
 //初始定义
 $pic = '';
 $spic = '';
 //设置图片保存路径
 $config['upload_path'] = ROOTPATH.'static/uploads';
 //图片类型
 $config['allowed_types'] = 'gif|jpg|png';
 //大小
 $config['max_size'] = '1024000';
 $config['encrypt_name'] = true;
 //宽高不限
 $config['max_width'] = '0';
 $config['max_height'] = '0';
 $this->load->library('upload', $config); 
 if ($this->upload->do_upload('pic1')){
 $data = $this->upload->data();
 $name = $data['file_name'];
 $hz = array_pop(explode('.',$name)); 
 $raw_name = $data['raw_name'];
 $config['image_library'] = 'gd2';
 $config['source_image'] = ROOTPATH.'static/uploads'.'/'.$name;
 //保留原图跟处理后的图片
 $config['create_thumb'] = TRUE;
 $config['maintain_ratio'] = TRUE;
 //大图
 $config['new_image'] = $raw_name.'_big'.'.'.$hz;
 //设置宽高,0表示不限制
 $config['width'] = 640;
 $config['height'] = 320;
 $this->load->library('image_lib', $config); 
 $res = $this->image_lib->resize();
 if($res){
 //设置图片保存路径
 $config2['upload_path'] = ROOTPATH.'static/uploads';
 //图片类型
 $config2['allowed_types'] = 'gif|jpg|png';
 //大小
 $config2['max_size'] = '1024000';
 $config2['encrypt_name'] = true;
 //宽高不限
 $config2['max_width'] = '0';
 $config2['max_height'] = '0';
 //第二次加载upload类,不能$this->load->library('upload', $config); 得下面这样
 $this->upload->initialize($config2);
 if ($this->upload->do_upload('pic1')){ 
 $data = $this->upload->data();
 $name = $data['file_name'];
 //$hz = array_pop(explode('.',$name)); 
 $raw_name2 = $data['raw_name'];
 $config2['image_library'] = 'gd2';
 $config2['source_image'] = ROOTPATH.'static/uploads'.'/'.$name;
 //保留原图及处理后的图片
 $config2['create_thumb'] = TRUE;
 $config2['maintain_ratio'] = TRUE;
 //小图,(大图设置了此项,小图也需要设置)
 $config2['new_image'] = $raw_name2.'_small'.'.'.$hz;
 //设置宽高,0表示不限制
 $config2['width'] = 200;
 $config2['height'] = 100;
 //第二次加载image_lib类,不能$this->load->library('image_lib', $config2); 得下面这样
 $this->image_lib->initialize($config2);
 $res2 = $this->image_lib->resize();
 if($res2){
 $spic = base_url('static/uploads').'/'.$raw_name2.'_small_thumb'.'.'.$hz;
 $pic = base_url('static/uploads').'/'.$raw_name.'_big_thumb'.'.'.$hz;
 } 
 }
 }
 }
 echo "<script>parent.callback('".$pic."','".$spic."')</script>";
 }
function callback(pic,spic) 
 { 
 if(pic == '' || spic == ''){
 alert('图片上传失败!');
 }else{
 document.getElementById("pic").src = pic; 
 document.getElementById("goods_pic").value = pic; 
 document.getElementById("goods_spic").value = spic;
 } 
 }

CI框架常识

1.有两种方法来加载自定义配置文件(如enums.php):

<?php 
if (! defined('BASEPATH')) exit('No direct script access allowed');

$config['enums']['memcache'] = array(

    array('host' => '192.168.1.1', 'port' => 11211)

);

$config['enums']['test'] = array(

    array('one' => '192.168.1.1', 'two' => 11211)

);

 

(1)手动加载:

$this->load->config(‘enums’);//注config()另外还可以有两个参数,一个是避免冲突,另一个是屏蔽不存在这个文件而出现的报错。

$res = $this->config->config[‘enums’];

返回的结果:

Array

(

    [memcache] => Array

        (

            [0] => Array

                (

                    [host] => 192.168.1.1

                    [port] => 11211

                )

 

        )

 

    [test] => Array

        (

            [0] => Array

                (

                    [one] => 192.168.1.1

                    [two] => 11211

                )

 

        )

 

)

如果想只返回test对应的数组:

$res = $this->config->item(‘test’,’enums’);

返回结果:

Array

(

    [0] => Array

        (

            [one] => 192.168.1.1

            [two] => 11211

        )

 

)

如果你想动态设置/改变一个现有的配置元素,你可以使用:

$this->config->set_item(‘enums’,array(‘good’,’haha’));

(2)自动加载:

写入application/config/autoload.php文件中。

2.调试错误时写入cache:

先在/www/cache/下建一个名为file的文件夹,并给这个file文件夹有写的权限。

$this->load->helper(‘common’);
cache_set($key,$value);

3.CI 的 load 都有规避机制:

第二次 load->library 无效。
第二次 load->library 改成

$this->upload->initialize($config);

对CI 所有需要传配置的类库通用。