架构师的focus点

相关领域内技术把控力度

  • 领域下架构的具体细节

代码细节封装能力

  1. 什么样的封装是好的?

好的封装是什么样子的?熟知设计模式基础上,通读流行框架源码。

Design Patterns

常玩技术深挖点

  1. linux
  2. nginx
  3. php
  4. openresty
  5. mysql
  6. memcached
  7. redis
  8. ssdb
  9. elasticsearch

产品sense

  • 当今流行领域,领域前景分析

保持新鲜事物的热情

  • trending

php内置九种排序

讲解

排序,在这里是针对array而言的。

让我们先来总结一下,这九种排序:

排序方向 正常 字典v 字典k
sort asort ksort
rsort arsort krsort
自定义 usort uasort uksort

PS:正常丢失字典结构

  • sort

    可以一般的排序,如果是k-v数据,会丢失关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];

var_dump($nums);
sort($nums);
var_dump($nums);

// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// [0]=>
// int(61)
// [1]=>
// int(78)
// [2]=>
// int(83)
// [3]=>
// int(90)
// [4]=>
// int(99)
// [5]=>
// int(100)
// }

// 结论:丢失了k-v关系
  • asort

    问:sort排序不能保持k-v关系,那有没有能保持的?
    答:asort就可以满足了保持k-v关系,对v排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];

var_dump($nums);
asort($nums);
var_dump($nums);

// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// ["zhangjian"]=>
// int(61)
// ["xuelong"]=>
// int(78)
// ["lisi"]=>
// int(83)
// ["zhangsan"]=>
// int(90)
// ["zhanghui"]=>
// int(99)
// ["wanger"]=>
// int(100)
// }

// 结论:保持了k-v关系,对v排序
  • ksort

    问:既然asort能对v排序,有没有能对k排序的?
    答:当然了,我们只需要比较k就行了,这就是ksort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
$nums = [90, 83, 100, 99, 78, 61];
$nums = [
'zhangsan' => 90,
'lisi' => 83,
'wanger' => 100,
'zhanghui' => 99,
'xuelong' => 78,
'zhangjian' => 61,
];

var_dump($nums);
ksort($nums);
var_dump($nums);

// OUTPUT
// array(6) {
// ["zhangsan"]=>
// int(90)
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["zhanghui"]=>
// int(99)
// ["xuelong"]=>
// int(78)
// ["zhangjian"]=>
// int(61)
// }
// array(6) {
// ["lisi"]=>
// int(83)
// ["wanger"]=>
// int(100)
// ["xuelong"]=>
// int(78)
// ["zhanghui"]=>
// int(99)
// ["zhangjian"]=>
// int(61)
// ["zhangsan"]=>
// int(90)
// }
// 结论:保持k-v关系,对k排序

我们已经介绍了sort,asort,ksort,他们的区别是是否保留k-v关系,是比较k还是比较v
除此之外,一个排序算法,我们还再意,是升序还是降序。
我们这里说一下降序的三个对应:rsort,arsort,krsort

  • rsort
  • arsort
  • krsort

  • usort

    问:上述我们提到了升序降序问题,什么控制了升降?
    答:在排序时候的比较算法,对于复杂结构,我们是否可以自定义比较算法,这就是usort了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php
/**
* sort 分为9种
* sort,asort,ksort
* rsort,arsort,krsort
* usort,uasort,uksort
*/


$users = [
[
'username' => 'zhangsan',
'age' => 32,
],
[
'username' => 'lisi',
'age' => 26,
],
[
'username' => 'wangermazi',
'age' => 90,
],
[
'username' => 'zhaosixiaojie',
'age' => 20,
]
];

function cmpAge($prefix, $suffix)
{

// echo "compare doing:", $prefix['age'], ',', $suffix['age'], "\n";
$attr = 'age';
if ($prefix[$attr] > $suffix[$attr]) {
return true;
}
if ($prefix[$attr] < $suffix[$attr]) {
return false;
}
return 0;
}
var_dump($users);
usort($users, 'cmpAge');
var_dump($users);

//OUTPUT
//array(4) {
// [0]=>
// array(2) {
// ["username"]=>
// string(8) "zhangsan"
// ["age"]=>
// int(32)
// }
// [1]=>
// array(2) {
// ["username"]=>
// string(4) "lisi"
// ["age"]=>
// int(26)
// }
// [2]=>
// array(2) {
// ["username"]=>
// string(10) "wangermazi"
// ["age"]=>
// int(90)
// }
// [3]=>
// array(2) {
// ["username"]=>
// string(13) "zhaosixiaojie"
// ["age"]=>
// int(20)
// }
// }
// array(4) {
// [0]=>
// array(2) {
// ["username"]=>
// string(13) "zhaosixiaojie"
// ["age"]=>
// int(20)
// }
// [1]=>
// array(2) {
// ["username"]=>
// string(4) "lisi"
// ["age"]=>
// int(26)
// }
// [2]=>
// array(2) {
// ["username"]=>
// string(8) "zhangsan"
// ["age"]=>
// int(32)
// }
// [3]=>
// array(2) {
// ["username"]=>
// string(10) "wangermazi"
// ["age"]=>
// int(90)
// }
// }
// 结论:定义方法,作为相邻元素的比较方法

那么,usort是否对应了逆序哪?
Of course not.usort的比较算法,本身就控制了是否逆序

我们还需要知道,是否需要对k-v结果保留,以及比较的方法:

  • uasort
  • uksort

总结

正序:sort, asort, ksort
逆序:rsort, arsort, krsort
控制:usort, uasort, uksort

都需要关注:k-v是否保留,是比较k,还是比较v

3-laravel-route

路由

一切的开始

web程序功能的最直观体现是什么?

URL

对了,就是URL。路由就是为URL指定要执行的程序。

使用

最简单路由

想象到吗?一个最简单的闭环就可以提供路由。

1
2
3
Route::get('hi', function () {
return 'Hi, World';
});

访问URL:

http://localhost:8000/hi

可以获取返回结果:

Hi, World

一类路由

一类路由有共同的某些特征,为了避免重复定义,’laravel’提供了此特性。

1
2
3
4
5
6
7
8
/**
* namespace:类namespace
* prefix:url前缀
* middleware:自动执行动作
*/

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['web']], function () {
Route::get('welcome', 'WelcomeController@index');
});

RESTFUL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 指定method
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

// 快捷指定method
Route::match(['get', 'post'], '/', function () {
//
});

// 任意匹配
Route::any('foo', function () {
//
});

执行的特定上下文

请通过参数来传递命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 必选
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});

// 可选
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});

2-laravel-configuration

配置

哪里开始?

config 文件夹,这里主要配置

1
$ config [master] ⚡ ll
total 128
-rw-r--r--  1 hackingangle  staff   8.0K  1 25 14:05 app.php
-rw-r--r--  1 hackingangle  staff   2.2K 11 15 15:52 auth.php
-rw-r--r--  1 hackingangle  staff   1.4K 11 15 15:52 broadcasting.php
-rw-r--r--  1 hackingangle  staff   2.1K 11 15 15:52 cache.php
-rw-r--r--  1 hackingangle  staff   983B 11 15 15:52 compile.php
-rw-r--r--  1 hackingangle  staff   4.0K 11 15 15:52 database.php
-rw-r--r--  1 hackingangle  staff   2.5K 11 15 15:52 filesystems.php
-rw-r--r--  1 hackingangle  staff   4.3K 11 15 15:52 mail.php
-rw-r--r--  1 hackingangle  staff   2.6K 11 15 15:52 queue.php
-rw-r--r--  1 hackingangle  staff   985B 11 15 15:52 services.php
-rw-r--r--  1 hackingangle  staff   5.2K 11 15 15:52 session.php
-rw-r--r--  1 hackingangle  staff   1.0K 11 15 15:52 view.php

  • app
    • web程序的公共,service注册,时区设置,语言设定,debug模式开关,加密随机串,加密算法,别名,日志
  • database
    • 数据库:mysql,sqlite,pgsql,sqlsrv,redis
    • 返回类型:array|object
    • migrations路径

访问配置,用起来吧

1
2
3
4
5
6
7
// 获取时区
$value = config('app.timezone');

// 运行时,内存级改变
config([
'app.timezone' => 'UTC',
]);

让敏感信息躲在暗处

laravel 当前版本支持把数据库连接信息,加密随机串等敏感信息隐秘起来。所谓的隐秘,就是不让这些信息走版本控制。

env 来干活

1
env('DB_CONNECTION', 'mysql');

上面的话被引用自config/database.php用来从.env文件中读取DB_CONNECTION。版本控制中隐藏掉.env文件

运行环境

运行环境概念,允许区分线上、线下以及一些特殊的环境下的不同配置。

1
2
3
4
5
6
7
8
9
10
11
12
// App
$environment = App::environment();
// instance
$environment = app()->environment();

// 判断
if (App::environment('local')) {
// 环境为local执行
}
if (App::environment('local', 'staging')) {
// 环境为local 或 staging执行
}

线上优化

合并配置文件,被framework快速加载

1
php artisan config:cache

维护模式

维护模式重定向到resources/views/errors/503.blade.php

1
# 关闭维护模式
php artisan up
# 开启维护模式
php artisan down

1-laravel-install

安装

laravel安装器

通过打包安装,速度快点

1
2
composer global require "laravel/installer"
laravel new demo

composer安装

第一次较慢,而后会命中cache

1
composer create-project --prefer-dist laravel/laravel demo

跑起来

php内置服务器启动(php5.4+)

artisan启动

1
php artisan server

访问入口

http://localhost:8000/

laravel 初识

PHP社区框架繁多,论哪一种框架能够跟随上当今的社区大趋势,那一定要说到今天的主角-laravel

为什么用使用框架?

框架可以说是对所属的语言,在工程化过程中最好的诠释和理解。所以我们要跟随社区中的大神的思维,看看这些大神们是如何思考!如何理解!

社区

laravel@github

忽悠你改laravel阵营的理由:

  • 大神领头开发
  • 社区文档性健全、布道者多
  • 定期更新、安全性升级
  • 商业公司支援

站在巨人的肩膀上

Symfony组件

大量复用symfony的组件,避免重复造轮子

初识

组件分类

  • installation
  • artisan
  • configuration
  • migration
  • model
  • seeding
  • route
  • view
  • controller
  • packages