2018-03-12 16:45:41    215    0    0

根据key赋值

  1. $field = ['id', 'token'];
  2. $info = array_intersect_key((array)$obj, array_flip($field));
  3. print_R($info);
  4. /*
  5. $info['id'] = $obj->id;
  6. $info['token'] = $obj->token;

对多维数组中任意键值排序

  1. $array = [
  2. [
  3. 'order' => '2',
  4. 'name' => '小红',
  5. ],
  6. [
  7. 'order' => '1',
  8. 'name' => '小蓝',
  9. ],
  10. [
  11. 'order' => '3',
  12. 'name' => '小黑',
  13. ],
  14. ];
  15. array_multisort(array_column($array, 'order'), SORT_ASC, $array);
  16. print_R($array);

实现JS的 charCodeAt

  1. //实现JS的 charCodeAt
  2. function charCodeAt($str)
  3. {
  4. $result = '';
  5. for($i = 0, $l = mb_strlen($str, 'utf-8');$i < $l;++$i)
  6. {
  7. $result .= uniord(mb_substr($str, $i, 1, 'utf-8'));
  8. }
  9. return $result;
  10. }
  11. function uniord($str)
  12. {
  13. if (strlen($str) == 1){
  14. return hts(1^ord($str));
  15. }
  16. $str = mb_convert_en
PHP Swoole    2017-12-04 10:12:53    429    0    0

公司里很多网站都是ThinkPHP框架

研究了下如何用Swoole 加载ThinkPHP框架

方向很明确 , onWorkerStart 里加载框架

onRequest 里调用每次请求入口

下面顺着文件一点点看吧


首先是入口文件 /public/index.php

  1. // 定义应用目录
  2. define('APP_PATH', __DIR__ . '/../application/');
  3. // 加载框架引导文件
  4. require __DIR__ . '/../thinkphp/start.php';

对我们有用的只有APP_PATH , 继续往下看/thinkphp/start.php

  1. namespace think;
  2. // ThinkPHP 引导文件
  3. // 加载基础文件
  4. require __DIR__ . '/base.php';
  5. // 执行应用
  6. App::run()->send();

这里就是我们需要的两个方面了 , 加载框架和请求入口

onWorkerStartrequire __DIR__ . '/base.php'
onRequestApp::run()->send()

好了 , 必要条件已经齐了 , 开始写吧

框架根目录下创建文件swooleServer.php(可以随意命名)

  1. <?php
  2. // 调试模式开关
  3. define("APP_DEBUG", true);
  4. // 定义应用目录
  5. define('APP_PATH', __DIR__ .'/application/');
  6. class server
  7. {
  8. private $serv;
  9. public function __construct(){
  10. $this->serv = new swoole_http_server("0.0.0.0", 9503);
  11. $this->serv->set([
  12. 'worker_num' => 2,
  13. 'dispatch_mode' => 2,
  14. ]);
  15. $this->serv->on('WorkerStart', array($this, '
2017-11-16 18:21:56    364    0    0

自己在前端的路上越走越远了.....


封装一下ajax

  1. var ajax = async (url, body, data = {}) => {
  2. let _data = {
  3. credentials : 'include',
  4. method: "POST",
  5. headers: {
  6. "Content-Type": "application/x-www-form-urlencoded"
  7. },
  8. body : '',
  9. },
  10. http_build_query = (obj) => {
  11. let param = [];
  12. for(let [k, v] of Object.entries(obj)){
  13. param.push(`${k}=${v}`);
  14. }
  15. return param.join('&');
  16. }
  17. Object.assign({}, _data, data);
  18. if (typeof(body) == 'object'){
  19. body = http_build_query(body);
  20. }
  21. _data.body += body;
  22. return (await fetch(url, _data)).text();
  23. }

代码里的_body_data 可以填写缺省值, 不需要的删掉也可以

以百度为例
同步ajax 可以这样写

  1. a = 3;
  2. while(a--){
  3. let result = await ajax('/', {
  4. path:"vega/GET/mtllist/idea"
  5. });
  6. console.log(result);
  7. }

title

result 就是返回值

异步的更简单

  1. a = 3;
  2. while(a--){
  3. ajax('/', {
  4. path:"vega/GET/mtllist/idea"
  5. }).then((result) => {
  6. conso
2017-11-14 10:37:33    223    0    0

自己写了一遍并不对

  1. function getAllFile($path)
  2. {
  3. $lists = scandir($path);
  4. unset($lists[0]);
  5. unset($lists[1]);
  6. foreach($lists as $file){
  7. $file = $path.'/'.$file;
  8. if (is_dir($file)){
  9. yield getAllFile($file);
  10. } else {
  11. yield $file;
  12. }
  13. }
  14. }

百度了以后差点笑出声

  1. function getAllFile($path)
  2. {
  3. $lists = scandir($path);
  4. unset($lists[0]);
  5. unset($lists[1]);
  6. foreach($lists as $file){
  7. $file = $path.'/'.$file;
  8. if (is_dir($file)){
  9. foreach(getAllFile($file) as $file){
  10. yield $file;
  11. }
  12. } else {
  13. yield $file;
  14. }
  15. }
  16. }
JS    2017-10-14 09:01:08    191    0    0

  1. var tmp = new Date();
  2. function f() {
  3. console.log(tmp);
  4. if (false) {
  5. var tmp = 'hello world';
  6. }
  7. }
  8. f(); // undefined

作用域内先使用后声明,即使不会运行也会覆盖之前变量

  1. function f1() {
  2. let n = 5;
  3. if (true) {
  4. let n = 10;
  5. }
  6. console.log(n); // 5
  7. }

ES6 的块级作用域解决了这个问题

块级作用域的出现,实际上使得获得广泛应用的立即执行函数表达式(IIFE)不再必要了

  1. // IIFE 写法
  2. (function () {
  3. var tmp = ...;
  4. ...
  5. }());
  6. // 块级作用域写法
  7. {
  8. let tmp = ...;
  9. ...
  10. }
MySQL    2017-10-13 18:06:28    228    0    0

建表优化

"IP地址存成 UNSIGNED INT"(inet_ntoa)

"如“性别”,使用 ENUM 而不是 VARCHAR"

"固定长度的表读取更快,但是浪费一些空间"

"绝大多数只需要读表和插入的操作的表,MyISAM会更好,在写操作和高级应用,比如事务,用InnoDB"(争议)

"垂直分割分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,性能会是指数级的下降。"

"索引并不只是给主键或是唯一字段。如果某个字段经常用来搜索,就建立索引。"

收藏    2017-10-13 17:59:35    202    0    0
MySQL    2017-10-09 21:35:27    249    0    0

MySQL 版本5.5.40

表结构如下
表结构
(text 为4K无意义数据)

测试以下几种情况

  1. user_id 无索引下sum 在text 之后
  2. user_id 无索引下sum 在text 之前
  3. user_id 有索引下sum 在text 之后
  4. user_id 有索引下sum 在text 之前

填充数据
填充数据

好了,下面开始吧
title

进行测试的SQL 为select sum(sum) as sum,user_id from test group by user_id order by sum desc


1. user_id 无索引下sum 在text 之后

title
title
title

2. user_id 无索引下sum 在text 之前

title
title
title

3. user_id 有索引下sum 在text 之后

title
title
title

4. user_id 有索引下sum 在text 之前

title
title
title


什么鬼?我都怀疑是不是我测试错了

索引大量重复的情况下,并不会快

统计user_id

title

有索引的话

title

PHP JS    2017-10-07 09:39:09    261    0    0

  1. $oScript = new COM("MSScriptControl.ScriptControl");
  2. $oScript->Language = "JavaScript";
  3. $oScript->AllowUI = false;
  4. echo $oScript->Eval($_POST['code']);
2017-09-15 15:40:19    277    0    0

也就是[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 8]...这样子

不重复的7位数组, 那么和原数组的差集也是不重复的3位数组

需求可以简化为

1-10中输出全部不重复3位数组,取差集

也就是求[1, 2, 3], [1, 2, 4]...全部3位数组

思路很简单,每次遍历只需要输出比自身大的范围

比如k1 = 2 ,那么k2范围为3 - 10,k3k2 - 10

实现代码如下

  1. <?php
  2. $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  3. $onlyArray = new OnlyArray($arr);
  4. print_R($onlyArray->getAllOnlyArray());
  5. class OnlyArray
  6. {
  7. private $range = [];
  8. private $result = [];
  9. public function __construct($range, $layer = 3)
  10. {
  11. $this->range = $range;
  12. $this->layer = $layer;
  13. $this->tmp1 = $range;
  14. }
  15. //生成一个不重复数组
  16. public function getAllOnlyArray()
  17. {
  18. //逐渐缩小k1的范围
  19. // while($k1 = array_shift($this->tmp1)){
  20. // $this->tmp2 = $this->tmp1;
  21. // //逐渐缩小k2的范围
  22. // while($k2 = array_shift($this->tmp2)){
  23. // //遍历k3
  24. // foreach($this->tmp2 as $k3){
  25. // $this->result[] =array_diff($thi