-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
1799 lines (1378 loc) · 60.7 KB
/
search.xml
File metadata and controls
1799 lines (1378 loc) · 60.7 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Mysql8-root密码忘记找回</title>
<url>/2021/06/07/Mysql8-root%E5%AF%86%E7%A0%81%E5%BF%98%E8%AE%B0%E6%89%BE%E5%9B%9E/</url>
<content><![CDATA[停止 Mysql 服务brew services stop mysql
进入 Mysql 安装目录// 查看mysql安装目录:brew info mysql
cd /usr/local/Cellar/mysql/8.0.16/bin
启动 Mysql,免密登录./mysqld_safe --skip-grant-tables --user=root &
修改密码mysql -uroot
update mysql.user set authentication_string='' where user='root';
关闭 Mysql 服务ps -ef | grep mysql
kill 9 【mysql进程号】
通过brew启动mysql服务,修改root密码brew services start mysql
mysql -uroot -p (提示输入密码时直接enter)
ALTER user 'root'@'localhost' IDENTIFIED BY 'password';
]]></content>
<tags>
<tag>Mysql</tag>
</tags>
</entry>
<entry>
<title>CentOs 7 下安装 wkhtmltopdf</title>
<url>/2021/05/06/centos7-%E4%B8%8B%E5%AE%89%E8%A3%85-wkhtmltopdf/</url>
<content><![CDATA[两种方式安装,其中方法一比较顺利方法一
安装依赖yum install -y fontconfig libX11 libXext libXrender libjpeg libpng xorg-x11-fonts-75dpi xorg-x11-fonts-Type1
下载 wkhtmltopdfwget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm
解压 wkhtmltopdfrpm -ivh wkhtmltox-0.12.6-1.centos7.x86_64.rpm
查看 wkhtmltopdfwhereis wkhtmltopdf
方法二:在 laravel 项目中使用 composer 安装
composer 安装
$ composer require h4cc/wkhtmltopdf-amd64 0.12.x
$ composer require h4cc/wkhtmltoimage-amd64 0.12.x
接下来将安装好的 wkhtmltopdf 复制到 Linux 系统可执行命令的目录中
cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/
cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/
//并使其可执行:
chmod +x /usr/local/bin/wkhtmltoimage-amd64
chmod +x /usr/local/bin/wkhtmltopdf-amd64
可能存在的问题
中文字体无法显示// 下载 windows 宋体字体,将 simsunbd.ttf 文件导入到 centos 系统 /usr/share/fonts/chinese/TrueType 文件目录下
]]></content>
<tags>
<tag>wkhtmltopdf</tag>
</tags>
</entry>
<entry>
<title>Composer required 内存溢出解决办法</title>
<url>/2021/05/06/composer-required-%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</url>
<content><![CDATA[在使用 composer 过程中出现内存溢出错误,只需要暂时将内存设置为没有限制COMPOSER_MEMORY_LIMIT=-1 composer required(install、update)
]]></content>
<tags>
<tag>Composer</tag>
</tags>
</entry>
<entry>
<title>Elasticsearch 基础操作</title>
<url>/2021/05/17/es-%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/</url>
<content><![CDATA[查询组合查询GET news202010/_search
{
"query": {
"match": {
"textSrc": "海底捞"
}
}
}
// and
GET news202010/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"mediaNameSrc": "搜狐"
}
},
{
"match": {
li "countryName": "中国"
}
}
]
}
}
// or
GET news202010/_search
{
"query": {
"bool": {
"should": [
{ "match": { "textSrc": "美食" } },
{ "match": { "textSrc": "海底捞" } }
]
}
}
}
// range
GET weibo202105/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"textSrc": "青城山"
}
},
{
"match": {
"textSrc": "天台山"
}
}
],
"filter": {
"range": {
"time": {
"gte": "2021-05-18 09:37:15",
"lte": "2021-05-21 09:37:15"
}
}
}
}
}
}
字段过滤GET news202010/_search
{
"query": {
"match": {
"textSrc": "海底捞"
}
},
"_source": ["mediaTname"]
}
排序GET news202010/_search
{
"query": {
"match": {
"textSrc": "海底捞"
}
},
"sort": [
{
"pubtime"://字段 {
"order": "desc"
}
}
]
}
分页GET news202010/_search
{
"query": {
"match": {
"textSrc": "海底捞"
}
},
"sort": [
{
"pubtime": {
"order": "desc"
}
}
],
"from": 0,
"size": 20
}
]]></content>
<tags>
<tag>Elasticsearch</tag>
</tags>
</entry>
<entry>
<title>hexo多台电脑同步</title>
<url>/2021/05/17/hexo%E5%A4%9A%E5%8F%B0%E7%94%B5%E8%84%91%E5%90%8C%E6%AD%A5/</url>
<content><![CDATA[hexo 在多台设备下进行同步设计的思路就是在 github 下创建一个公共的仓库用来存储 hexo 生成的页面,一个私有的仓库来存储 hexo 的源文件
创建公共仓库创建私有仓库提交源文件到私有仓库上// 在初始源文件目录
git init
git add.
git commit -m 'first commit source'
git remote add xxxxxx
git push -u origin main
这里会有一些关于主题的注意事项,等我使用了其他主题再来更新
在其他设备上 clone 源文件使用的前提上要安装好 node、npm、hexo-cli
npm install -g hexo-cli
git clone xxxxxx
cd xxxxxx
npm install
正常使用 hexohexo clean
hexo g
hexo d
更新源文件git add .
git commit -m 'update'
git push origin main
]]></content>
<tags>
<tag>hexo</tag>
</tags>
</entry>
<entry>
<title>Laravel passport OAuth 认证使用</title>
<url>/2021/05/17/laravel-passport-OAuth-%E8%AE%A4%E8%AF%81%E4%BD%BF%E7%94%A8/</url>
<content><![CDATA[安装扩展包composer require laravel/passport
数据库迁移php artisan migrate
安装 Passportphp artisan passport:install
在用户模型类中使用 HasApiTokens Trait// 在 User Model 中
use HasApiTokens;
在 AuthServiceProvider 中注册 Passport 路由public function boot()
{
$this->registerPolicies();
Passport::routes();// 这里增加
}
设置 Passport 在输入 API 请求中使用// 位置 => config/auth.php
'api' => [
'driver' => 'passport', // 这里是修改的
'provider' => 'users',
],
从 Web 浏览器访问认证 API// 先要在 Http\Kernel.php 的 $middlewareGroups 属性中新增中间件 CreateFreshApiToken
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
CreateFreshApiToken::class // 这里是增加的
],
'api' => [
'throttle:60,1',
'bindings',
],
];
在 api.php 中使用Route::prefix('v1')
->middleware('auth:api')
->group(function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
});
]]></content>
<tags>
<tag>Laravel</tag>
</tags>
</entry>
<entry>
<title>Laravel 解决跨域</title>
<url>/2021/04/30/laravel-%E8%A7%A3%E5%86%B3%E8%B7%A8%E5%9F%9F/</url>
<content><![CDATA[1. 安装扩展composer require barryvdh/laravel-cors
2. 发布配置文件php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"
3. 使用如果需要全局使用,可以在 app/Http/Kernel.php 的 $middleware 中增加 \Barryvdh\Cors\HandleCors::class,
]]></content>
<categories>
<category>PHP</category>
</categories>
<tags>
<tag>Laravel</tag>
</tags>
</entry>
<entry>
<title>MySql8 修改密码加密方式</title>
<url>/2021/05/06/mysql8-%E4%BF%AE%E6%94%B9%E5%AF%86%E7%A0%81%E5%8A%A0%E5%AF%86%E6%96%B9%E5%BC%8F/</url>
<content><![CDATA[进入my.cnf 修改配置文件vim /etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
进入 mysql 修改配置ALTER USER 'root'@'localhost' IDENTIFIED BY '密码' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES;
查看加密方式是否被改变use mysql;
select user,plugin from user;
// 如果出现两个root用户且加密方式不对,删除不是mysql_native_password的一个
]]></content>
<tags>
<tag>MySql</tag>
</tags>
</entry>
<entry>
<title>MySql8 远程连接方式</title>
<url>/2021/05/06/mysql8_%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E6%96%B9%E5%BC%8F/</url>
<content><![CDATA[mysql8 默认配置是不开启远程连接的,这里我们需要修改 mysql 数据库的配置来主动开启
mysql -uroot -p
use mysql;
select host,user from user;
update user set host='%' where user=root;
// 更新数据库
flush privileges;
然后就可以远程登录了
]]></content>
<tags>
<tag>MySql</tag>
</tags>
</entry>
<entry>
<title>vue-cli 初始化原型项目</title>
<url>/2021/04/30/vue-cli-%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%9F%E5%9E%8B%E9%A1%B9%E7%9B%AE/</url>
<content><![CDATA[安装 vue-clinpm install -g @vue/cli
初始化项目vue create project
启动项目cd project
npm run serve
需要安装的依赖vue add vue-router
]]></content>
<tags>
<tag>Vue</tag>
</tags>
</entry>
<entry>
<title>vue-学习</title>
<url>/2021/05/25/vue-%E5%AD%A6%E4%B9%A0/</url>
<content><![CDATA[第一个 Vue 应用创建 vue 应用// 这里直接展示的是 script 部分
var app = new Vue({
el: "#app",
data: {
name: ""
}
})
数据绑定 v-model<div id="app">
<input v-model="name" type="text">
</div>
<script>
var app = new Vue({
el: "#app",
data: {
name: "input"
}
})
</script>
生命周期created: 实例完成创建后调用
mounted: el 挂载到实例上调用,一般第一个业务逻辑会在这里写
beforeDestroy: 实例销毁之前调用
插值{{ 值 }}
过滤器(|)对数据进行过滤, 常用于文本格式化等;过滤的规则是自定义的,通过给 Vue 实例添加 filters 设置
<div id="app">
{{ date | formatDate }}
</div>
<script>
var app = new Vue({
el: "#app",
data: {},
filters: {
formatDate: function(value) {
.....
}
}
})
</script>
指令与事件指令是 vue.js 中最常用的一项功能,它带有前缀 v-
v-bind(简写 ‘:’ )
v-on(简写 ‘@’)
// 事件
计算属性]]></content>
<tags>
<tag>Vue</tag>
</tags>
</entry>
<entry>
<title>wsl2安装node工具</title>
<url>/2021/05/17/wsl2%E5%AE%89%E8%A3%85node%E5%B7%A5%E5%85%B7/</url>
<content><
安装 node LTS 版本nvm install node --lts
查看nvmnvm ls
]]></content>
<tags>
<tag>wsl2</tag>
</tags>
</entry>
<entry>
<title>连接 docker mysql 容器</title>
<url>/2021/05/06/%E8%BF%9E%E6%8E%A5-docker-mysql-%E5%AE%B9%E5%99%A8/</url>
<content><![CDATA[创建新 mysql 容器docker pull mysql
启动 mysql 容器sudo docker run -p 63306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
// 将容器的 3306 端口映射到主机的 63306 端口,密码为root
进入mysql容器docker exec -it mysql bash
在主机连接容器mysql -uroot -proot -P63306 -h127.0.0.1
]]></content>
<tags>
<tag>Docker</tag>
</tags>
</entry>
<entry>
<title>面试总结</title>
<url>/2021/05/11/%E9%9D%A2%E8%AF%95%E6%80%BB%E7%BB%93/</url>
<content><![CDATA[PHPPHP 是什么
PHP(”PHP:Hypertext Preprocessor”,超文本预处理器),基于服务端创建动态网站的脚本语言
PHP数据类型
基本类型
布尔型(boolean):true 和 false 两个值
整型(integer)
浮点型(float)
字符串(string)
复合类型
数组(array)
对象(object)
特殊类型
资源(resource):存放 PHP 外部数据,比如数据库、文件等
Null 类型:只有一个值 null,不能运算
常用的全局变量 $_SERVER// 目录根目录
$_SERVER['DOCUMENT_ROOT']
// 请求头部
$_SERVER['HTTP_HOST']
// 用户 ip 地址
$_SERVER['REMOTE_ADDR']
// 服务器的 ip 地址
$_SERVER['SERVER_ADDR']
// 服务器主机名称
$_SERVER['SERVER_NAME']
// 当前页面的前一页
$_SERVER['HTTP_REFERER']
// 判断接收的数据是 post 还是 get
$_SERVER['REQUEST_METHOD']
PHP 常用的超全局变量// get 传送方式
$_GET
// post 传送方式
$_POST
// 可以接收到 get 和 post 两种方式的值
$_REQUEST
// 引用全局作用域中可用的全部变量
$_GLOBALS
// 上传文件使用
$_FILE
// 系统环境变量
$_SERVER
// 用于会话控制
$_COOKIE
// 用于会话控制
$_SESSION
// 服务器环境变量
$_ENV
比较 include 和 require
include 引用不存在的文件会产生一个警告但是程序会继续执行;require 引用不存在的文件会导致一个致命的错误,程序停止执行
include 执行时文件每次都要进行读取;require 文件只处理一次,所以在引用的文件较大时,require 的效率更高
比较 get 和 post 两种传输方式(常规答案)
数据传输大小: get 传输数据的大小是 2kb,而 post 一般是没有限制的,但是会受内存大小影响,一般通过修改 php.ini 配置文件来修改
数据传输方式: get 是通过 url 传递参数的,在 url 中可以看到参数;post 是在表单中使用 post 方法提交
数据安全性:get 参数可见,容易被攻击
缓存: get 可以被缓存, post 不能被缓存
echo、print、print_r 的区别
echo 可以输出一个或者多个变量
print 只能打印一个变量
print_r 是一个函数,打印的是复合类型的变量,比如 数组、对象
传值赋值和引用赋值的区别
传值赋值是将变量里的内容赋值一份,被赋值的变量不会被影响
引用赋值是将两个变量指向同一个内存空间,只要其中一个变量改变就会影响到另一个变量
将 1234567890 改为 1,234,567,890<?php
$str = '1234567890';
$strrev = strrev($str);
$chunk = chunk_split($strrev, 3, ',');
$result = strrev($chunk);
$result = substr($result, 1);
echo $result;
session 和 cookie 的区别
cookie 的数据存放在客户端,session 的数据存放在服务器
cookie 安全性较差,别人可以分析放在本地的 cookie 进行 cookie 欺骗(CSRF,跨站伪造请求攻击)
session 会在一定时间内保存在服务器上,当大量的 session 存在,会影响服务器的性能
单个 cookie 保存的数据长度不能超过 4kb ,很多浏览器都限制一个网址最多能保存 20 个 cookie
如何设置 session 的过期时间session_set_cookie_params()
PHP 常见的设计模型
策略模式
是对象的行为模式,是对一组算法的封装,动态的选择需要的算法使用
工厂模式
最常用的实例化对象模式,是用工厂的方法代替 new 操作的一种方式
单例模式
保证某个类只有一个实例,而且自动实例化并向整个系统提供这个实例
只实例化一次,避免大量的 new 操作,消耗系统和内存资源
饿汉模式:在类初始化就自行实例化
懒汉模式:只是在第一次调用的时候进行实例化
适配器模式
将各种截然不同的函数接口封装成一个统一的 API
注册模式
解决全局共享和交换对象
观察者模式
当一个对象发生变化时,依赖它的对象都会收到消息,并自动更新(比如 事件)
数组常用的函数array_merge(); // 合并数组
array_push(); // 往数组后追加
array_unique(); // 去重
array_keys(); // 获取数组的 key 值
array_values(); // 获取数据的 value 值
array_filter(); // 去空
in_array(); // 数组包含
count(); // 计算数组的长度
面对对象的特征
封装:只需要知道这个类是做什么的,不需要关心怎么实现
继承:子类可以继承父类的属性和方法,也可以重写或者新增属性和方法,增加了代码的可重用
多态:同一个类的不同对象使用同一个方法可以得到不同的结果,增加了灵活性和重用性
面对对象的五大原则
单一职责原则:一个类的功能单一
开放封闭原则:在扩展上是开放的,在更改性能方面是封闭的
替换原则:子类可以替换父类出现在父类可以出现的地方
依赖原则:具体依赖抽象,上层依赖下层
接口隔离原则:模块间要通过接口隔离开,而不是通过具体的类强耦合
PHP7 比 PHP5 性能高
变量存储字节看小,减少内存占用,提升变量的操作速度
改善数组结构,数组元素和 hash 映射表分配在同一内存,降低内存占用,提高了 cpu 的缓存命中率
改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高了执行效率
PHP7 和 PHP5 的区别
性能提升了 2 倍
全面一致的支持 64 位
之前出现的致命错误,现在改为抛出异常
增加了空结合操作符
增加了函数返回类型声明
增加了标量类型声明
增加了匿名函数
移除了一些老的不再支持的SPAI(服务器端应用编程端口)和扩展(mysql mssql)
可以定义常量数组
php.ini 的优化
内存分配
zend opcache 缓存操作码
设置文件上传大小
设置进程超时时间
处理会话(将会话存入缓存中而不是数据库)
缓冲输出(用最少的块输出最多的数据)
抽象和接口的区别
接口的访问控制必须是 public,抽象三种都可以
继承接口用 implement,继承抽象用 extends
声明接口用 interface,声明抽象用 abstract
接口没有构造函数
一个类可以继承多个接口,只能继承一个抽象
抽象
里面至少有一个抽象方法 abstract
只声明了方面,没有具体实现
被继承时,子类必须实现继承的所有方法
子类的访问控制必须比父类更加宽松
接口
定义的所有方法必须是公有的
用 interface 来定义接口,用implement 来继承接口
实现接口必须实现接口里的所有方法
可以继承多个接口,用逗号分隔
final 关键字
类声明 final 关键字,不能被继承
方法声明 final 关键字,不能被重写
yield 生成器及时计算并产出后续值,不占用宝贵的内存,简单的迭代器
访问修饰符public/protected/private
PHP 常用的魔术常量1. __FILE__ // 完整文件路径或文件名
2. __LINE__ // 当前行号
3. __DIR__ // 文件所有目录
4. __FUNCTION__ // 函数名称
5. __CLASS__ // 类名称
6. __METHOD__ // 方法名称
7. __NAMESPACE__ // 当前命名空间
PHP 常用的魔术方法1. __construct()
2. __destruct()
3. __isset()
4. __toString()
5. __get()
6. __set()
7. __unset()
8. __clone()
9. __debugInfo()
单点登录session 共享来实现
权限系统设计
用户
角色
权限
用户角色
角色权限
MySQLSql 语句应该考虑哪些安全性
防止 sql 注入,对特殊字符进行转义和过滤
用最小权限原则,最好不用 root 连接数据库
当 sql 运行出错时,不要把错误信息展示给用户
Sql 索引
普通索引
唯一索引
主键索引
复合索引
MySQL 索引的优缺点
优点
加快查询速度
可以加速表与表之间的连接
在使用分组和排序进行检索的时候,可以减少查询中分组和排序的时间
减少服务器对数据的扫描
帮助服务器避免排序和临时表
将随机 I/O 变成顺序 I/O
缺点
占用磁盘空间
对于写的操作,会降低速度
创建和维护索引要消耗时间,这种时间随着数据量的增加而增加
MySQL 什么时候会产生临时表
union 查询
order by 和 group by 子句不一样
distinct 加上 order by 查询
from 中的子查询
表连接中,order by 的列不是驱动表中的
什么时候应该创建索引
经常需要搜索的列上,可以加快搜索的速度
做为主键的列上
经常用在 where 子句上的列
经常用做排序和分组的列
经常用在连接的列上,主要是一些外键,可以加快连接的速度
什么时候不需要创建索引
查询中很少使用的列
只有很少数据值的列
经常进行增删改的列,频繁更新的列
数据重复且平均分布的列,比如 男女
什么时候索引失效
条件中带有 or
like 模糊查询中以 % 开头
如果列是字符串,没有用引号引用起来
使用函数或者四则运算
判断索引不是某个值 !=
not in 查询
char 和 varchar 的区别
char 是定长,不管存储是否达到设定的值,都按设定的值存储,效率较高
varchar 是变长,存储的字符要比 char 长
char 的效率比 varchar 要高
优化 SQL 语句
尽量选择较少的列查询
在 where 后面频繁使用的字段加上索引
避免是用 select * 查询
避免在索引列上做运算,使用 not in 和 <> 等操作
合理的使用 limit
合适表分割,在查询较慢的地方使用 explain 分析查询语句
MySQL 中的事务(ACID)
原子性(A):一组 sql 要么全部成功要么全部失败
一致性(C):一致的从一种状态改变为另一种状态
隔离型(I):一个事务未完成之前不会被另一个事务读取
持久性(D):一旦食物提交,数据就会永久写入系统
MySQL 优化
选取合适的字段属性,字段的宽度尽可能的小
用连接查询来替代子查询
使用事务
使用外键
建立索引
优化查询语句
锁定表
数据库的三大范式
保证每一列都是不可再分的属性值,保证每一列的原子性,减少冗余
保证每一列都必须依赖主键
保证每一列都与主键有直接关系,而不是间接关系
数据库内部实现机制
MySQL 脏读/虚读/幻读解决方法解决方法:通过事务的隔离级别(读未提交/读已提交/可重复读/串行化)
脏读:指的是一个线程中的事务读取到另一个线程中未提交的数据(读已提交)
虚读:指的是一个线程中的事务读取到另一个线程中提交的 update 的数据(可重复读/加锁)
幻读:指的是一个线程中的事务读取到另一个线程中提交的 inster 的数据(串行化)
数据库的存储引擎
MyISAM
插入数据快,空间和内存使用比较低
不支持事务
数据存储在文件中
支持表级锁
InnoDB
支持事务/行锁/外键
数据存储在共享表空间
支持奔溃后修复
Memory
所有数据在内存中,数据处理速度快
对表的大小有要求,不能建立太大的表
安全性不高
Archive
适合查询和存储
悲观锁和乐观锁
乐观锁:每次去拿数据都会认为别人不会修改数据,但是在更新数据的时候会判断在此期间有没有更新这个数据,适合多读的场景
悲观锁:每次去拿数据都会认为别人会修改数据,所以每次都拿数据都会上锁,适合多写的操作
主从复制1. 基本过程
主库在事务提交时会把数据更作事件记录在二进制文件 binlog 中,主库上的 sync_binlog 参数控制 binlog 日志刷新到磁盘中
主库推送二进制文件 binlog 到从库的中继日志 relay-log,之后从库根据 relay log 日志做数据变更操作
2. 主要的三个线程
Binlog dump 线程(主库)
I/O 线程(从库)
SQL 线程(从库)
当从库上启动复制,首先创建 I/O 线程连接主库,主库随后创建 Binlog dump 线程读取数据库事件发送给 I/O 线程,I/O 线程读取到事件数据之后更新到从库的中继日志 Relay log 中,之后从库的 SQL 线程读取中继日志中更新的数据库事件并应用
3. 三种复制方式
基于 SQL 语句的复制
每条修改数据的 SQL 都会保存在 binlog 日志中
基于行的复制
每行的数据变化都会记录到 binlog 日志中
混合复制模式
基于语句和行混合使用
4. 复制的三种常见架构
一主多从
一个主库多个从库,读写分离,主库主要负责写和实时性较高的读的操作,从库主要负责读取的操作
多级复制
两个 master,多个 slave,其中一个 master 主要负责推送 binlog 日志到 slave
优点:解决了主库的 I/O 负载和网络压力
缺点:数据延时比较大(优化:master2 上选择 BLACKHOLE 引擎来降低延时,原理是 BLACKHOLE 表的数据不会写回到磁盘上,永远是空表,只用来记录 bin log 日志)
双主复制
两个 master 库,适合 DBA 做维护,master1 和 master2 互为主从,写的操作访问 master1 ,读的操作访问 master1 或者 master2
5. 复制类型
异步复制
数据库事务提交之后,在主库写入 bin log 日志就可以成功返回给客户端
半同步复制
数据库事务提交之后,bin log 不仅要写在主库上,还要同时向从库推送,等到从库收到 bin log 日志后才会返回成功给客户端,如果从库长时间没有返回,则自动调整为异步复制
Nginx负载均衡五种策略
轮询(默认)
每个请求按时间顺序逐一分配到不同后端服务器,如果服务器 down掉,能自动剔除
权重(weight)
指定轮询的几率,weight 和访问比率成正比
ip_hash
解决用户登录信息丢失的情况,每次请求都定位到同一个服务器
Url_hash
按 url 的 hash 结果来分配请求,使每个 url 定向到同一个对应的后端服务器
第三方 fair
按后端服务器响应时间来分配,响应时间短的优先分配
反向代理1. 理解反向代理是指代理服务器接收 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就变现为一个服务器
2.为什么使用反向代理
可以起到保护网站安全的作用,因为任何来自 internet 的请求都必须先经过代理服务器
通过缓存静态资源,加速 web 请求
实现负载均衡
HTTPurl 访问网站的过程
dns 解析,将域名解析为 ip 地址
tcp 连接,tcp 的三次握手
由浏览器发起,告诉服务器要开始请求数据了
由服务器发起,告诉了浏览器准备好了接收数据,可以发起请求
由浏览器发起,告诉服务器马上发送数据,准备接收
发送请求
接收响应
渲染页面
断开连接,tcp 的四次挥手
由浏览器发起,告诉服务器请求报文发送完毕,准备关闭
由服务器发起,告诉浏览器,请求报文接收完毕,准备关闭,你也准备关闭
由服务器发起,告诉浏览器,响应报文发送完毕,你准备关闭
由浏览器发起,告诉服务器,响应报文接收完毕,准备关闭
常见的 http 状态码
1xx:请求被接收
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
301:永久重定向
302:临时重定向
401:权限不足,请求认证用户身份信息
403:拒绝访问
404:无法找到请求的资源
405:客户端请求中的方法被禁止
500:服务器内部错误
501:此请求方法不被服务器支持且无法被处理
502:网关错误
503:服务器繁忙
504:不能及时响应
osi 的七层模型 和 tcp/ip 四层关系
OSI 七层网络模型
TCP/IP四层概念模型
对应网络协议
应用层
应用层
HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层
Telnet, Rlogin, SNMP, Gopher
会话层
SMTP, DNS
传输层
传输层
TCP, UDP
网络层
网络层
IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层
数据链路层
FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层
IEEE 802.1A, IEEE 802.2到IEEE 802.11
跨域怎么出现的,怎么解决跨域出现:浏览器的同源策略,限制了一个源的文件或者脚本如何和另一个源的资源进行交互,如果没有同源策略,容易收到 XSS/CSRF 等攻击
解决:
jsonp,利用 <script> 标签没有跨域限制的漏洞,页面可以动态的得到其他源的 json 数据
优点:兼容性好,可以用于主流浏览器的跨域访问问题
缺点:仅支持 get 方法;不安全,容易遭受 xss 攻击
cors 跨域资源共享,分为简单请求和复杂请求
简单请求
复杂请求,在正式请求之前,增加一次 http 查询请求
nginx 的反向代理
配置一个代理服务器做跳板机
node 中间件代理(两次跨域)
实现原理:就是服务器向服务器请求
RedisRedis 和 memcached 的区别
redis 支持更加丰富的数据存储类型(string/hash/list/set/sorted set);memcached 只支持简单的 key-value 结构
redis 支持简单的事务
redis 支持数据持久型,可以将内存中的数据保存在磁盘中
持久性:
RDB:在一定周期内,将内存中的数据以快照的形式保存到硬盘的二进制文件
AOF:redis 将每个收到的写命令都通过 write 函数追加到文件最后,redis 重启会重新执行文件中保存的写命令来在内存中重建整个数据库的内容
redis 只是单核,memcached 是多核
缓存雪崩/穿透
雪崩:当缓存服务器重启或者是大量缓存在同一时间失效,给后台系统带来很大的压力,导致系统崩溃
解决:
当缓存失效时,增加锁来保证某个 key 只有一个线程操作数据库
分散缓存失效时间
做二级缓存