二分法查找的思路如下:
1、首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
2、如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
3、如果某一步数组为空,则表示找不到目标元素。
二分法查找的思路如下:
1、首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
2、如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
3、如果某一步数组为空,则表示找不到目标元素。
原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
1、从数列中挑出一个元素,称该元素为“基准”。
2、扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
3、通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。
当PHP运行在FastCGI模式时,可用fastcgi_finish_request可以提高请求的处理速度,让一些处理可以在页面生成完后再进行。
(PHP 5 >= 5.3.3, PHP 7)
fastcgi_finish_request ()
fastcgi_finish_request — 冲刷(flush)所有响应的数据给客户端
此函数冲刷(flush)所有响应的数据给客户端并结束请求。 这使得客户端结束连接后,需要大量时间运行的任务能够继续运行。
在php5.6以上版本可以使用…语法实现:
参数列表可以包含 …标记,表示该函数接受可变数量的参数。参数将作为数组传递给给定变量。
hash_do($h . $p . md5($this->KEY), $header['alg']); $sign = $h. '.' . $p . '.' . $s; return $sign; } return null; } public function check_token($jwt){ if (empty($jwt)){ return false; } $tokens = explode('.', $jwt); if (count($tokens)!==3){ return false; } list($header64, $payload64, $sign) = $tokens; $header = json_decode(base64_decode($header64), TRUE); if (!isset($header['alg'])){ return false; } $s = $this->hash_do($header64 . $payload64 . md5($this->KEY), $header['alg']); if ($s !== $sign){ return false; } $payload = json_decode(base64_decode($payload64), TRUE); $time = time(); if (isset($payload['iat']) && $payload['iat'] > $time){ return false; } if (isset($payload['exp']) && $payload['exp'] < $time){ return false; } return true; } }
使用式:
public function auth_token(){ $over = config('TOKEN_OVER_TIME'); // 生存时间 $time = time(); $time_over = $time + $over; $header = [ 'typ' => 'JWT', 'alg' => 'HS256' ]; $payload = [ 'iss' => 'admin_name', 'iat' => $time, 'exp' => $time_over, 'uid' => 12 ]; $j = new Jwt(); $sign = $j->create_token($header, $payload); return $sign; } public function check(){ $jwt = 'jwtxxxxxxxx'; $j = new Jwt(); $b = $j->check_token($jwt); dump($b); }
①需要把php扩展对应的源码包拉到linux中
②解压并进入解压后的目录
③在解压的目录中,找到php的安装目录中找到phpize指令并执行。
说明:phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块
执行完后会在解压的目录生成一个configure的文件,用于后续的操作
④在解压目录执行./configure脚本, 并且指定php安装目录的php-config脚本文件路径
⑤编译和安装make && make install ,执行完毕后会在php相应的目录生成一个.so的动态库文件
⑥在php配置文件php.ini中指定.so的动态库文件的路径
⑦重启,写个phpinfo的函数进行测试有没有对应的扩展出现
/** * [indexAction_white 返回[树状结构]格式化后的树] * @return [type] [description] */ public function areaData_white() { $objs = db($this->table_name)->field('id,parent_id,area_name')->select(); $arr = $this->__format_priv($objs); return json($arr); } /** * [__format_priv 与[树状结构]格式化数据, [递归]] * @param [type] $objs [description] * @param [type] $parent_id [description] * @return [type] [description] */ private function __format_priv($objs, $parent_id = null) { $arr = []; if ($objs && is_array($objs)) { foreach ($objs as $v) { if ($v['parent_id'] == $parent_id) { $arr[] = [ 'id' => $v['id'], 'text' => $v['area_name'], 'children' => $this->__format_priv($objs, $v['id']) ]; } } } return $arr; }
/** * 家谱树(面包屑导航) * @param $id * @return array */ public function getPlist($id) { $arr = collection($this->select())->toArray(); return $this->_familytree($arr, $id); } /** * 家谱树 * @param $arr * @param $id * @return array */ private function _familytree($arr, $id) { $list = array(); foreach ($arr as $v) { if ($v['id'] == $id) { $list[] = $v['area_name']; $list = array_merge($this->_familytree($arr, $v['parent_id']),$list ); } } return $list; }