uri 与 url 区别

URI:统一资源标识符(Uniform Resource Identifier)

URI 格式

标准的 URI 协议方案有 30 多种:

  1. ftp
  2. http/s
  3. mailto
  4. telnet
  5. file
    ….

URL:统一资源定位符(Uniform Resource Locator),同时也是 URI 的子集

造框架过程中通常会用到的一些知识点(转载安正超)

基础

  1. MVC

  2. 自动加载: PHP: 自动加载类;

  3. 错误处理:http://php.net/manual/zh/book.errorfunc.php;

  4. PHP标准库 (SPL)PHP: SPL - Manual;

  5. 输出缓冲控制: PHP:输出控制;

  6. PHP 选项/信息: PHP 选项/信息;

  7. 数据库抽象层:PHP:数据库抽象层;

  8. session拓展:PHP:Session 扩展;

  9. 反射:http://php.net/manual/zh/book.reflection.php;

  10. 类和对象:PHP:类/对象;

  11. 图像处理和 GD:PHP: GD - Manual;

  12. 邮件相关的SMTP;

  13. 文件系统:PHP:Filesystem;

  14. 预定义变量:PHP: 预定义变量;

  15. 字符串处理:PHP: 字符串 - Manual;

  16. 正则表达式: http://php.net/manual/en/book.pcre.php;

附加知识

  1. 常见的设计模式:工厂、单例,外观、观察者等;

  2. 迭代器等预定义接口:PHP: 预定义接口

  3. 数据库拓展:PHP: 数据库扩展;

  4. 国际化与字符编码支持 PHP: 国际化与字符编码支持;

  5. 常用的缓存,Redis, Memcache,Apc等;

  6. 队列服务如ActiveMQ,Beanstalkd等;

  7. 多数据库支持如Mongo;

  8. 事件与钩子;

参考框架:

  1. Slim Framework - 微框架,一个框架基本功能都满足了,很适合用于学习;

  2. Silex - 微框架,基于Symfony2组件;

  3. CodeIgniter - 结构很清晰的PHP框架;

教程参考

  1. Write your own PHP MVC Framework (Part 1)

  2. 使用PHP搭建自己的MVC框架

作者:安正超
链接:https://www.zhihu.com/question/26635323/answer/33812516
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

php 的继承 --- 单继承

在 PHP 中只支持单继承


错误示例

1
2
3
4
class A{}
class B{}

class C extends A, B{} //程序报错

将上方代码改成

1
2
3
4
class A{}
class B extends A {}

class C extends B{} //C 就可以同时继承了 B A

使用 trait 可以实现多继承(只是一种复用机制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A {
public function init()
{
echo 'A------> init' . PHP_EOL;
}
}

trait B {
public function say()
{
parent::init();
echo 'B------> init' . PHP_EOL;
}
}

class C extends A {
use B;
}

$a = new C();
$a->init();
$a->say();

alter table 语法

ALTER TABLE 语法


https://dev.mysql.com/doc/refman/8.0/en/alter-table-generated-columns.html


- 删除一个字段:drop column 字段名
1
ALTER TABLE 表名 DROP COLUMN 字段名;
- 更改某字段类型:modify 字段名 类型
1
ALTER TABLE 表名 MODIFY 字段名 TINYINT NOT NULL, CHANGE b c CHAR(20);
- 重命名表名
1
ALTER TABLE 旧表名 RENAME 新表名;
- 增加索引
1
ALTER TABLE 表名 ADD INDEX (字段), ADD UNIQUE (字段);
- 更改表引擎
1
ALTER TABLE 表名 ENGINE = InnoDB;
- 更改表字符集
1
ALTER TABLE 表名 CHARACTER SET = utf8;
- 重命名字段,指定新字段名以及类型
1
ALTER TABLE 表名 CHANGE 旧字段  新字段 INT NOT NULL(类型);
- 增加表字段
1
2
3
ALTER TABLE 表名 ADD 字段名 字段类型 ……

alter table user add phone char(11) default 0;

解决 MySQL 终端中文乱码

使用 SET NAMES ‘charset_name’

charset_name 列表
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
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)

设置当前会话使用 utf8 字符集:

1
set names 'utf8';

mysql show 语法

https://dev.mysql.com/doc/refman/8.0/en/show.html

MySQL 所有 show 语法

  • 列出服务器上的二进制日志文件

    • SHOW {BINARY | MASTER} LOGS :
  • 显示二进制日志中的事件

    • SHOW BINLOG EVENTS [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count]
1
2
3
4
5
6
7
show binlog events \G;

show binlog events in '日志名' \G;

show binlog events in '日志名' from 起点位置 \G;

show binlog events in '日志名' from 起点位置 limit 条数;
  • 显示所有可用的字符集
    • SHOW CHARACTER SET [like_or_where]
1
2
3
4
5
6
7
8
show character set;

show character set like 'utf8';

show character set like 'utf8%';

show character set where charset='utf8';

  • 输出包括所有可用的排序规则
    • SHOW COLLATION [like_or_where]
1
2
3
show collation where charset='utf8';

show collation like 'utf8%';
  • 显示表字段结构
    • SHOW [EXTENDED] [FULL] {COLUMNS | FIELDS} {FROM | IN} tbl_name [{FROM | IN} db_name] [LIKE ‘pattern’ | WHERE expr]
1
2
3
4
5
6
7
8
show full {COLUMNS | FIELDS} from 表名; // 除了显示字段结构,还显示对应权限

show {COLUMNS | FIELDS} from 表名; //显示表字段结构

show {COLUMNS | FIELDS} from 表名 from 库名;

show {COLUMNS | FIELDS} from 表名.库名;

  • 显示创建数据库的语句
    • SHOW CREATE DATABASE db_name
1
2
3
4
5
6
show create database 库名;
+----------+--------------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------------+
| larblog | CREATE DATABASE `larblog` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+
  • 显示创建存储函数

    • SHOW CREATE FUNCTION func_name 、 SHOW CREATE PROCEDURE proc_name
      1
      show create function 存储函数名
  • 显示创建命名表的CREATE TABLE语句

    • SHOW CREATE TABLE tbl_name
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      show create table 表名 \G;
      *************************** 1. row ***************************
      Table: bjy_users
      Create Table: CREATE TABLE `bjy_users` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `email_verified_at` timestamp NULL DEFAULT NULL,
      `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `remember_token` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      `deleted_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `bjy_users_email_unique` (`email`)
      ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
      1 row in set (0.00 sec)
  • 显示创建命名触发器的CREATE TRIGGER语句

    • SHOW CREATE TRIGGER trigger_name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SHOW CREATE TRIGGER ins_sum\G
*************************** 1. row ***************************
Trigger: ins_sum
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_ENGINE_SUBSTITUTION
SQL Original Statement: CREATE DEFINER=`me`@`localhost` TRIGGER `ins_sum`
BEFORE INSERT ON `account`
FOR EACH ROW SET @sum = @sum + NEW.amount
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
Created: 2018-08-08 10:10:12.61
  • 显示创建命名用户的CREATE USER语句
    • SHOW CREATE USER user
1
2
3
4
5
6
7
8
9
10
mysql> CREATE USER 'u1'@'localhost' IDENTIFIED BY 'secret';
mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'u1'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for u1@localhost: CREATE USER 'u1'@'localhost'
IDENTIFIED WITH 'caching_sha2_password'
AS 0x244124303035240C7745603626313D613C4C10633E0A104B1E14135A544A7871567245614F4872344643546336546F624F6C7861326932752F45622F4F473273597557627139
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT
  • 显示用于创建命名视图的CREATE VIEW语句
    • SHOW CREATE VIEW view_name
1
2
3
4
5
6
7
8
9
mysql> SHOW CREATE VIEW v\G
*************************** 1. row ***************************
View: v
Create View: CREATE ALGORITHM=UNDEFINED
DEFINER=`bob`@`localhost`
SQL SECURITY DEFINER VIEW
`v` AS select 1 AS `a`,2 AS `b`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  • 显示所有数据库
    • SHOW {DATABASES | SCHEMAS} [LIKE ‘pattern’ | WHERE expr]
1
show databases;
  • 显示有关存储引擎的操作信息
    • SHOW ENGINE engine_name {STATUS | MUTEX}
1
2
3
SHOW ENGINE INNODB STATUS
SHOW ENGINE INNODB MUTEX
SHOW ENGINE PERFORMANCE_SCHEMA STATUS
  • 显示有关服务器存储引擎的状态信息
    • SHOW [STORAGE] ENGINES
1
show engines;
  • 显示错误、警告等信息
    • SHOW ERRORS [LIMIT [offset,] row_count]
    • SHOW COUNT(*) ERRORS;
  • SHOW EVENTS
  • SHOW FUNCTION CODE func_name
  • SHOW FUNCTION STATUS [like_or_where]
  • 显示授权
    • SHOW GRANTS
1
2
3
4
5
6
7
8
SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]

user_or_role: {
user (see Section 6.2.4, “Specifying Account Names”)
| role (see Section 6.2.5, “Specifying Role Names”.
}
1
2
3
4
5
6
7
mysql> SHOW GRANTS FOR 'jeffrey'@'localhost';
+------------------------------------------------------------------+
| Grants for jeffrey@localhost |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jeffrey`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` |
+------------------------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1';
+---------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r2';
+-------------------------------------------------------------+
| Grants for u1@localhost |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+-------------------------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2';
+---------------------------------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------------------------------+
  • 返回表索引信息 - ##### SHOW [EXTENDED] {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]
1
2
SHOW INDEX FROM mytable FROM mydb;
SHOW INDEX FROM mydb.mytable;
  • 显示有关主服务器的二进制日志文件的状态信息
    • SHOW MASTER STATUS
1
2
3
4
5
6
7
8
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: master-bin.000002
Position: 1307
Binlog_Do_DB: test
Binlog_Ignore_DB: manual, mysql
Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
1 row in set (0.00 sec)
  • SHOW OPEN TABLES [FROM db_name] [like_or_where]
  • 显示所有插件

    • SHOW PLUGINS
  • SHOW PROCEDURE CODE proc_name
  • SHOW PROCEDURE STATUS [like_or_where]
  • 显示MySQL服务器支持的系统特权列表

    • SHOW PRIVILEGES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SHOW PRIVILEGES\G
*************************** 1. row ***************************
Privilege: Alter
Context: Tables
Comment: To alter the table
*************************** 2. row ***************************
Privilege: Alter routine
Context: Functions,Procedures
Comment: To alter or drop stored functions/procedures
*************************** 3. row ***************************
Privilege: Create
Context: Databases,Tables,Indexes
Comment: To create new databases and tables
*************************** 4. row ***************************
Privilege: Create routine
Context: Databases
Comment: To use CREATE FUNCTION/PROCEDURE
*************************** 5. row ***************************
Privilege: Create temporary tables
Context: Databases
Comment: To use CREATE TEMPORARY TABLE
...
  • 显示正在运行的线程
    • SHOW [FULL] PROCESSLIST
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
mysql> SHOW FULL PROCESSLIST\G
*************************** 1. row ***************************
Id: 1
User: system user
Host:
db: NULL
Command: Connect
Time: 1030455
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 1004
State: Has read all relay log; waiting for the slave
I/O thread to update it
Info: NULL
*************************** 3. row ***************************
Id: 3112
User: replikator
Host: artemis:2204
db: NULL
Command: Binlog Dump
Time: 2144
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 4. row ***************************
Id: 3113
User: replikator
Host: iconnect2:45781
db: NULL
Command: Binlog Dump
Time: 2086
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 5. row ***************************
Id: 3123
User: stefan
Host: localhost
db: apollon
Command: Query
Time: 0
State: NULL
Info: SHOW FULL PROCESSLIST
5 rows in set (0.00 sec)
  • 当前会话过程中执行的语句的资源使用情况
    • SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]
  • SHOW PROFILES
  • SHOW RELAYLOG EVENTS [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count]
  • 显示当前向主服务器注册的复制从服务器列表

    • SHOW SLAVE HOSTS
1
2
3
4
5
6
7
mysql> SHOW SLAVE HOSTS;
+------------+-----------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+------------+-----------+------+-----------+--------------------------------------+
| 192168010 | iconnect2 | 3306 | 192168011 | 14cb6624-7f93-11e0-b2c0-c80aa9429562 |
| 1921680101 | athena | 3306 | 192168011 | 07af4990-f41f-11df-a566-7ac56fdaf645 |
+------------+-----------+------+-----------+--------------------------------------+
  • 显示从服务器状态

    • SHOW SLAVE STATUS [FOR CHANNEL channel]
  • 显示服务器状态信息

    • SHOW [GLOBAL | SESSION] STATUS [like_or_where]
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
mysql> SHOW STATUS;
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
| Connections | 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 8340 |
| Created_tmp_files | 60 |
...
| Open_tables | 1 |
| Open_files | 2 |
| Open_streams | 0 |
| Opened_tables | 44600 |
| Questions | 2026873 |
...
| Table_locks_immediate | 1920382 |
| Table_locks_waited | 0 |
| Threads_cached | 0 |
| Threads_created | 30022 |
| Threads_connected | 1 |
| Threads_running | 1 |
| Uptime | 80380 |
+--------------------------+------------+
  • 显示表当前状态
    • SHOW TABLE STATUS [FROM db_name] [like_or_where]
1
show table status from 库名 where name='对应表名';
  • 列出所有表
    • SHOW [FULL] TABLES [FROM db_name] [like_or_where]
1
show tables;
  • 列出了当前为数据库中的表定义的触发器
    • SHOW TRIGGERS [FROM db_name] [like_or_where]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SHOW TRIGGERS LIKE 'acc%'\G
*************************** 1. row ***************************
Trigger: ins_sum
Event: INSERT
Table: account
Statement: SET @sum = @sum + NEW.amount
Timing: BEFORE
Created: 2018-08-08 10:10:12.61
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_ENGINE_SUBSTITUTION
Definer: me@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
  • 显示MySQL系统变量的值
    • SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
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
mysql> SHOW VARIABLES;
+--------------------------------------------+------------------------------+
| Variable_name | Value |
+--------------------------------------------+------------------------------+
| activate_all_roles_on_login | OFF |
| auto_generate_certs | ON |
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
| avoid_temporal_upgrade | OFF |
| back_log | 151 |
| basedir | /usr/ |
| big_tables | OFF |
| bind_address | * |
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_expire_logs_seconds | 2592000 |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_row_metadata | MINIMAL |
| binlog_row_value_options | |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
| block_encryption_mode | aes-128-ecb |
| bulk_insert_buffer_size | 8388608 |

...

| max_allowed_packet | 67108864 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_connect_errors | 100 |
| max_connections | 151 |
| max_delayed_threads | 20 |
| max_digest_length | 1024 |
| max_error_count | 1024 |
| max_execution_time | 0 |
| max_heap_table_size | 16777216 |
| max_insert_delayed_threads | 20 |
| max_join_size | 18446744073709551615 |

...

| thread_handling | one-thread-per-connection |
| thread_stack | 286720 |
| time_zone | SYSTEM |
| timestamp | 1530906638.765316 |
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
| tmp_table_size | 16777216 |
| tmpdir | /tmp |
| transaction_alloc_block_size | 8192 |
| transaction_allow_batching | OFF |
| transaction_isolation | REPEATABLE-READ |
| transaction_prealloc_size | 4096 |
| transaction_read_only | OFF |
| transaction_write_set_extraction | XXHASH64 |
| unique_checks | ON |
| updatable_views_with_limit | YES |
| version | 8.0.12 |
| version_comment | MySQL Community Server - GPL |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
| version_compile_zlib | 1.2.11 |
| wait_timeout | 28800 |
| warning_count | 0 |
| windowing_use_high_precision | ON |
+--------------------------------------------+------------------------------+
  • SHOW WARNINGS [LIMIT [offset,] row_count]
  • SHOW CREATE EVENT event_name

对称加密与非对称加密

对称加密

  • DES
  • AES

在加密和解密时使用相同的密钥。无需用户配置的密钥

非对称加密

  • RSA

非对称加密要有公钥、私钥。

  1. A 与 B 通信时,A 私钥保密,将公钥提供给 B,B 将公钥提供给 A
  2. A 向 B 发送消息,消息经过已知 B 公钥进行加密,B 使用自己的私钥进行解密
  3. 除了 B 能解密消息明文,其他人在无法获取 B 私钥时无法进行消息解密

字符串匹配算法 Sunday

Sunday 算法(尽可能的移动最大长度)

Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符

  • 如果该字符没有在主模式字符串中出现则跳过,移动位 = 匹配字符串长度 + 1
  • 该字符在主模式字符串中出现,

1)移动位 = 该字符在模式串中最后出现位置距末端长度 + 1
2)移动位 = 模式串长度 - 该字符在模式串中最后出现位置

文本串第1个字符 s != 模式串第1个字符 e,那么关注文本串中参加匹配的未位字符下一个字符: a

a 在 ea 字符串的最后一位,则移动位= 0 + 1 = 2(模式串长度) - 1(a 在模式串最后出现位置)= 1

模式串向右移动 1 位,使上下文的 a 对齐

匹配成功

代码实现

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
<?php


namespace Patterns\Algorithm;

/**
* 如果该字符没有在主模式字符串中出现则跳过,移动位 = 匹配字符串长度 + 1
* 该字符在主模式字符串中出现,
1)移动位 = 该字符在模式串中最后出现位置距末端长度 + 1
2)移动位 = 模式串长度 - 该字符在模式串中最后出现位置
* Class Sunday
* @package Patterns\Algorithm
*/
class Sunday
{
public $_needleLen;
public $_haystackLen;
public $_table;

/**
* 返回 -1 表示无法匹配,否则返回首次出现位置
*
* @param string $haystack
* @param string $needle
* @return int
*/
public function strpos(string $haystack, string $needle):int
{
$this->_haystackLen = strlen($haystack);
$this->_needleLen = strlen($needle);

if($this->_needleLen > $this->_haystackLen){
return null;
}

$this->prefixTable($needle);
$p = $this->_haystackLen - $this->_needleLen;
$s = 0;
while ($s <= $p){
$j = 0;
while ($haystack[$s + $j] == $needle[$j]){
$j += 1;
if($j == $this->_needleLen){
return $s;
}
}

$haystackIndex = $s + $this->_needleLen;
if(!isset($haystack[$haystackIndex]))
break;

$hIndexText = $haystack[$haystackIndex];
$s += (isset($this->_table[$hIndexText]) ? $this->_table[$hIndexText] : $this->_needleLen);
}

return -1;
}

/**
* 匹配所有出现位置
* @param string $haystack
* @param string $needle
* @return array
*/
public function strapos(string $haystack, string $needle):array
{
$this->_haystackLen = strlen($haystack);
$this->_needleLen = strlen($needle);

if($this->_needleLen > $this->_haystackLen){
return null;
}

$this->prefixTable($needle);
$p = $this->_haystackLen - $this->_needleLen;
$s = 0;

$pos = [];
while ($s <= $p){
$j = 0;
while (isset($needle[$j]) && $haystack[$s + $j] == $needle[$j]){
$j += 1;
if($j == $this->_needleLen){
array_push($pos, $s);
}
}

$haystackIndex = $s + $this->_needleLen;
if(!isset($haystack[$haystackIndex]))
break;

$hIndexText = $haystack[$haystackIndex];
$s += (isset($this->_table[$hIndexText]) ? $this->_table[$hIndexText] : $this->_needleLen);
}

return $pos;
}

/**
* 模式串字符表
* @param string $needle
*/
public function prefixTable(string $needle)
{
for($i=0; $i < $this->_needleLen; $i++){
//字符最后出现的位置距末端长度:字符串长度 - 字符当前位置
$this->_table[$needle[$i]] = $this->_needleLen - $i;
}

}

}


$haystack = 'search title.';
$needle = 'w';

$obj = new Sunday();
$index = $obj->strpos($haystack, $needle);

echo $index . PHP_EOL;

var_export($obj->strapos($haystack, $needle));

echo strpos($haystack, $needle) . PHP_EOL;

HTTP 状态码

HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成。响应分为五类:信息响应,成功响应,重定向,客户端错误和服务器错误

MDN DOC

信息响应 1xx

100 Continue
1
这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
101 Switching Protocol
该代码是响应客户端的 Upgrade 标头发送的,并且指示服务器也正在切换的协议。
102 Processing (WebDAV)
此代码表示服务器已收到并正在处理该请求,但没有响应可用。
103 Early Hints
此状态代码主要用于与Link 链接头一起使用,以允许用户代理在服务器仍在准备响应时开始预加载资源。

成功响应 2xx

200 OK
1
2
3
4
5
6
请求成功。成功的含义取决于HTTP方法:

GET:资源已被提取并在消息正文中传输。
HEAD:实体标头位于消息正文中。
POST:描述动作结果的资源在消息体中传输。
TRACE:消息正文包含服务器收到的请求消息
201 Created
该请求已成功,并因此创建了一个新的资源。这通常是在POST请求,或是某些PUT请求之后返回的响应。
202 Accepted

请求已经接收到,但还未响应,没有结果。意味着不会有一个异步的响应去表明当前请求的结果,预期另外的进程和服务去处理请求,或者批处理。

203 Non-Authoritative Information

服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。

204 No Content

服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。

205 Reset Content

服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。

206 Partial Content

服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。

207 Multi-Status (WebDAV)

由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。

208 Multi-Status (WebDAV)
在 DAV 里面使用: propstat 响应元素以避免重复枚举多个绑定的内部成员到同一个集合。
226 IM Used (HTTP Delta encoding)
服务器已经完成了对资源的 GET 请求,并且响应是对当前实例应用的一个或多个实例操作结果的表示。

重定向 3xx

300 Multiple Choice

被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。

301 Moved Permanently

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。

302 Found

请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

303 See Other

对应当前请求的响应可以在另一个 URI 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。

304 Not Modified

如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。

305 Use Proxy

被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。

306 unused
在最新版的规范中,306 状态码已经不再被使用。
307 Temporary Redirect

请求的资源现在临时从不同的URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

308 Permanent Redirect

这意味着资源现在永久位于由 Location: HTTP Response 标头指定的另一个 URI。 这与 301 Moved Permanently HTTP 响应代码具有相同的语义,但用户代理不能更改所使用的 HTTP 方法:如果在第一个请求中使用 POST,则必须在第二个请求中使用 POST。

客户端响应 4xx

400 Bad Request
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
401 Unauthorized

当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。

402 Payment Required
此响应码保留以便将来使用,创造此响应码的最初目的是用于数字支付系统,然而现在并未使用。
403 Forbidden

服务器已经理解请求,但是拒绝执行它。与 401 响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个 404 响应,假如它不希望让客户端获得任何信息。

404 Not Found

请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。

405 Method Not Allowed

请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。 鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。

406 Not Acceptable
请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
407 Proxy Authentication Required

与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。

408 Request Timeout

请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。

409 Conflict

由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。

410 Gone

被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用 404 状态码。除非额外说明,否则这个响应是可缓存的。

411 Length Required

服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。

412 Precondition Failed

服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。

413 Payload Too Large

服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。

414 URI Too Long

请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。

415 Unsupported Media Type
对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 Requested Range Not Satisfiable

如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。

417 Expectation Failed
此响应代码意味着服务器无法满足 Expect 请求标头字段指示的期望值。
418 I’m a teapot
服务器拒绝尝试用 “茶壶冲泡咖啡”。
421 Misdirected Request

该请求针对的是无法产生响应的服务器。 这可以由服务器发送,该服务器未配置为针对包含在请求 URI 中的方案和权限的组合产生响应。

422 Unprocessable Entity (WebDAV)
请求格式良好,但由于语义错误而无法遵循
423 Locked (WebDAV)
正在访问的资源被锁定。
424 Failed Dependency (WebDAV)
由于先前的请求失败,所以此次请求失败。
425 Too Early
服务器不愿意冒着风险去处理可能重播的请求。
426 Upgrade Required

服务器拒绝使用当前协议执行请求,但可能在客户机升级到其他协议后愿意这样做。 服务器在 426 响应中发送 Upgrade 头以指示所需的协议。

428 Precondition Required

原始服务器要求该请求是有条件的。 旨在防止“丢失更新”问题,即客户端获取资源状态,修改该状态并将其返回服务器,同时第三方修改服务器上的状态,从而导致冲突。

429 Too Many Requests
用户在给定的时间内发送了太多请求(“限制请求速率”)。
431 Request Header Fields Too Large

服务器不愿意处理请求,因为它的 请求头字段太大( Request Header Fields Too Large)。 请求可以在减小请求头字段的大小后重新提交。

用户请求非法资源,例如:由政府审查的网页。

服务端响应 5xx

500 Internal Server Error
服务器遇到了不知道如何处理的情况。
501 Not Implemented
此请求方法不被服务器支持且无法被处理。只有GET和HEAD是要求服务器支持的,它们必定不会返回此错误代码。
502 Bad Gateway
此错误响应表明服务器作为网关需要得到一个处理这个请求的响应,但是得到一个错误的响应。
503 Service Unavailable

服务器没有准备好处理请求。 常见原因是服务器因维护或重载而停机。 请注意,与此响应一起,应发送解释问题的用户友好页面。 这个响应应该用于临时条件和 Retry-After:如果可能的话,HTTP头应该包含恢复服务之前的估计时间。 网站管理员还必须注意与此响应一起发送的与缓存相关的标头,因为这些临时条件响应通常不应被缓存。

504 Gateway Timeout
当服务器作为网关,不能及时得到响应时返回此错误代码。
505 HTTP Version Not Supported
服务器不支持请求中所使用的HTTP协议版本。
506 Variant Also Negotiates
服务器有一个内部配置错误:对请求的透明内容协商导致循环引用。
507 Insufficient Storage
服务器有内部配置错误:所选的变体资源被配置为参与透明内容协商本身,因此不是协商过程中的适当端点。
508 Loop Detected (WebDAV)
服务器在处理请求时检测到无限循环。
510 Not Extended
客户端需要对请求进一步扩展,服务器才能实现它。服务器会回复客户端发出扩展请求所需的所有信息。
511 Network Authentication Required
511 状态码指示客户端需要进行身份验证才能获得网络访问权限。