热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

1、MySQL简介

1、MySQL简介什么是MySQL?关系型数据库管理系统,使用标准sql,支持多种语言MySQL是一个关系型数据库管理系统,

1、MySQL 简介


什么是 MySQL?


关系型数据库管理系统,使用标准sql,支持多种语言


  1. MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
  2. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
  3. Mysql是开源的,所以你不需要支付额外的费用。
  4. Mysl支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
  5. MySQL使用标准的SQL数据语言形式。
  6. Mysql可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、Java、Ped、PHP、Eifel、Ruby和TCL等。
  7. Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
  8. MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  9. Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

MySQL 高手是怎样练成的?


  1. mysql内核
  2. sql优化工程师
  3. mysql服务器的优化
  4. 查询语句优化
  5. 主重复制
  6. 软硬件升级
  7. 容灾备份
  8. sql编程

2、Linux 安装 MySQL


2.1、安装 MySQL


CentOS 6 通过 yum 安装mysql 5.6

下面是一些安装方式

\1. https://www.cnblogs.com/micfox/articles/10989905.html

\2. https://blog.csdn.net/MissDreamY/article/details/104938194

\3. 如果上面和下面的安装都失败的是话,试试这个https://www.jianshu.com/p/276d59cbc529

检查当前系统是否安装过 mysql


  • 检查系统是否安装其他版本的 MySQL 数据库

yum list installed | grep mysql
mysql-libs.x86_64 5.1.73-5.el6_6 @anaconda-CentOS-201508042137.x86_64/6.7

  • 有的话干掉老版本数据库

yum -y remove mysql-libs.x86_64

安装及配置


  • 拉取 rpm 包

wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

  • 通过 rpm 安装 mysql

rpm -ivh mysql-community-release-el6-5.noarch.rpm

  • 列举可用的 mysql 版本

yum repolist all | grep mysql

通过命令行下载太慢了,自己在官网上下载了一个,存在了 d:/迅雷下载。

安装 mysql-community-server 版本(好像默认自带 mysql-community-client)

yum install mysql-community-server -y

mysql 服务的启动与停止


  • mysql 服务的启动

service mysqld start

  • mysql 服务的停止

service mysqld stop

  • 查看 mysql 服务的状态

service mysql status

备注:正在启动 mysqld: [失败] 问题

打下面这一套组合拳

rm -fr /var/lib/mysql/*
rm /var/lock/subsys/mysqld
killall mysqld

然后启动 mysql 的服务

service mysqld start

2.2、配置 MySQL


查看安装时创建的 mysql 用户和mysql 组

查看 mysql 用户

cat /etc/passwd|grep mysql

查看 mysql 用户组

cat /etc/group|grep mysql

mysqladmin

是什么:他是mysql的一个管理器,可以创建、删除数据库,改变数据库的密码等等,有很多功能

怎么使用,如果在linux直接使用mysqladmin或者其他任何命令,linux一般都是去 /usr/bin里去找。有点类似于环境变量。但是如果 /usr/bin里面没有的时候,肯定就找不到啊

所以,在 /usr/bin里建立 mysqladmin的软连接

ln -s /usr/local/mysql/bin/mysqladmin /usr/bin

/usr/local/mysql/bin是自己设置的mysql的安装目录。

然后就可以用mysqladmin了。

设置mysql密码

首先确保mysql服务是开着的。

首次设置密码,mysql刚安装好的时候,不需要密码,直接mysql就能进入mysql系统。此时增加密码

mysqladmin -uroot -p root

就可以了

如果已经有密码,用下面的命令

./mysqladmin -uroot -p password

image.png

设置 mysql 开机启动

设置 mysql 为开机自启动

chkconfig mysqld on

查看是否设置成功:2、3、4都是on代表开机自动启动

chkconfig --list | grep mysqld

image

  • 如果想要关闭 mysql 的开机自启动,输入如下命令,找到 mysqld ,单击空格取消 mysql 的开机自启动,Tab 键选中确定,敲击 Enter 键确定即可

ntsysv

image

输入以上命令,如果mysqld里有星号就代表可以了

找到mysql安装目录

如果想找到msql的安装目录,就用下面的命令

ps -ef|grep mysql

image.pngimage.png

  • 目录含义列举如下

basedir = path安装目录
character-sets-dir = path给出存放着字符集的目录。
datadir = path数据库的数据库。就是各种数据库所在的位置。
pid-file = filename为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。
socket = filename为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下,如果MySQL客户与服务器是通过命名管道进行通信 的,–sock选项给出的将是该命名管道的名字(默认设置是MySQL)。
lower_case_table_name = 1/0新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。

怎么找到mysql 配置文件位置

mysql配置文件默认在/etc下,是my.cnf

修改配置文件位置

将其拷贝至 /etc 目录下,重命名为 my.cnf ,覆盖原有的配置文件

cp /usr/share/mysql/my-default.cnf /etc/my.cnf

修改 mysql 字符集(5.7及以后默认字符集就是utf-8,不用改)

查看 mysql 编码字符集

  • 如果在建库建表的时候, 没有明确指定字符集, 则采用默认客户端和服务器端的字符集都用了 latin1,其中是不包含中文字符的。
  • 如何查看默认的编码字符集:

show variables like '%char%';
# 或者
show variables like '%character%';

image

修改配置文dy.cnf 配置文件,修改字符编码

vim /etc/my.cnf

  • 修改或添加如下内容

[client]
default-character-set=utf8[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci[mysql]
default-character-set=utf8

好像比老师的配置文件少了很多内容???

image

测试配置文件是否生效


  • 建表测试:中文无乱码

create database db01;
create table user(id int not null, name varchar(20));
insert into user values(1,'张三1');
select * from user;

image

  • 查看 mysql 全局变量

show variables like '%char%';

imagemysql 的安装位置

**
**

**
**

**
**

2.5、额外知识


全局查找某文件

find / -name mysql -ls # /是从/开始找, -name mysql是文件名中包含mysql, -ls是显示详细信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AWyZ94as-1616028958991)(https://cdn.nlark.com/yuque/0/2021/png/2840444/1615967369962-9c6041ff-a405-454a-bfc4-b2fa5317a7df.png)]

新建数据库

mysql> create database db01

image.png

查看所有数据库

mysql> show databases

image.png

去数据库文件下查看

image.png

mysql命令:显示表,创建表,插入记录

use db01;
show tables;
create table user(id int not null, name varchar(20));
insert into user values(1,'zs');

3、MySQL 用户组管理


3.1、用户管理相关命令


创建用户

创建名称为 zhang3 的用户, 密码设为 123123;

create user zhang3 identified by '123123';

查看用户和权限的相关信息

查看用和权限的相关信息的 SQL 指令

select host, user, password, select_priv, insert_priv,drop_priv from mysql.user;

1.host :表示连接类型

    1. % 表示所有远程通过 TCP 方式的连接
    2. IP 地址 如 (192.168.1.2,127.0.0.1) 通过制定 ip 地址进行的 TCP 方式的连接
    3. 机器名 通过制定 i 网络中的机器名进行的 TCP 方式的连接
    4. ::1 IPv6 的本地 ip 地址 等同于 IPv4 的 127.0.0.1
    5. localhost 本地方式通过命令行方式的连接 , 比如 mysql -u xxx -p 123xxx 方式的连接。
  1. user:表示用户名


    • 同一用户通过不同方式链接的权限是不一样的。

  1. password:密码

    • 所有密码串通过 password(明文字符串) 生成的密文字符串。 加密算法为 MYSQLSHA1 , 不可逆 。
    • mysql 5.7 的密码保存到 authentication_string 字段中不再使用 password 字段。

  1. select_priv , insert_priv 等

    • 为该用户所拥有的权限。

mysql> select host, user, password, select_priv, insert_priv,drop_priv from mysql.user;
+-----------+------+-------------------------------------------+-------------+-------------+-----------+
| host | user | password | select_priv | insert_priv | drop_priv |
+-----------+------+-------------------------------------------+-------------+-------------+-----------+
| localhost | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | Y | Y | Y |
| heygo | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | Y | Y | Y |
| 127.0.0.1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | Y | Y | Y |
| ::1 | root | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | Y | Y | Y |
+-----------+------+-------------------------------------------+-------------+-------------+-----------+
4 rows in set (0.04 sec)

修改当前用户的密码

set password =password('123456');

修改其他用户的密码

修改李四用户的密码

update mysql.user set password=password('123456') where user='li4';

注意:所有通过 user 表的修改, 必须 用 flush privileges; 命令才能生 效

修改用户名

将王五的用户名修改为李四

update mysql.user set user='li4' where user='wang5';

注意:所有通过 user 表的修改, 必须 用 flush privileges; 命令才能生 效

删除用户

删除李四用户

drop user li4

注意:不要通过 delete from user u where user='li4' 进行删除, 系 统会有残留信息保留。

3.2、MySQL 的权限管理


授予权限

该权限如果发现没有该用户, 则会直接新建一个用户。

grant 权限 1,权限 2,…权限 n on 数据库名称.表名称 to 用户名@用户地址 identified by '连接口令'

示例:给 li4 用户用本地命令行方式下, 授予 atguigudb 这个库下的所有 表的插删改查的权限。

grant select,insert,delete,drop on atguigudb.* to li4@localhost ;

授予通过网络方式登录的的 joe 用户,对所有库所有表的全部权 限, 密码设为 123

grant all privileges on *.* to joe@'%' identified by '123';

收回权限

查看当前用户权限:

show grants;

收回权限命令

revoke [权限 1,权限 2,…权限 n] on 库名.表名 from 用户名@用户地址;

收回全库全表的所有权限

REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost;

收回 mysql 库下的所有表的插删改查 权限

REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;

注意:权限收回后, 必须用户重新登录后, 才能生效。

查看权限


  1. 查看当前用户权限:show grants;
  2. 查看所有用户权限:select * from user ;

4、MySQL 配置文件


二进制日志文件 log-bin

二进制日志文件 log-bin :用于主重复制

错误日志 log-error

默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等

查询日志 log

默认关闭,记录查询的sql语句,如果开启会减低mysql的整体性能,因为记录日志也是需要消耗系统资源的

数据文件


  1. 数据库文件:默认路径:/var/lib/mysql
  2. frm文件:存放表结构
  3. myd文件:存放表数据
  4. myi文件:存放表索引

如何配置


  1. Windows 系统下:my.ini文件
  2. Linux 系统下:etc/my.cnf

5、MySQL 逻辑架构介绍


mysql 的分层思想


  1. 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上。
  2. 插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。

image

mysql 四层架构


1. 连接层:

最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2. 服务层:

第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

Management Serveices & Utilities系统管理和控制工具
SQL InterfaceSQL 接口。 接受用户的 SQL 命令, 并且返回用户需要查询的结果。 比如 select from 就是调用 SQL Interface
Parser解析器。 SQL 命令传递到解析器的时候会被解析器验证和解析
Optimizer查询优化器。 SQL 语句在查询之前会使用查询优化器对查询进行优化, 比如有 where 条件时, 优化器来决定先投影还是先过滤。
Cache 和 Buffer查询缓存。 如果查询缓存有命中的查询结果, 查询语句就可以直接去查询缓存中取 数据。 这个缓存机制是由一系列小缓存组成的。 比如表缓存, 记录缓存, key 缓存, 权限缓存等

3. 引擎层

是啥?比如车子,有的车子可以跑沙漠,有的跑山地,还有的跑雪地。

引擎层就相当于给mysql这部车子配备了多个发动机。当mysql跑雪地的时候,装上雪地发动机。跑沙漠的时候,装上沙漠发动机等等。

存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过APl与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍MyISAM和InnoDB

4. 存储层:

数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

MySQL 部件


  1. Connectors:指的是不同语言中与SQL的交互
  2. Management Serveices & Utilities: 系统管理和控制工具
  3. Connection Pool:连接池

    • 管理缓冲用户连接,线程处理等需要缓存的需求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。
    • 每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信。接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

  1. SQL Interface:SQL接口。接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
  2. Parser:解析器

    • SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
    • 在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 Query,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 Query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。
    • 解析器的主要功能:
      • 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
      • 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

  1. Optimizer:查询优化器

    • SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端发送过来的 sql 语句 ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果
    • 他使用的是“选取-投影-联接”策略进行查询。
      • 用一个例子就可以理解: select uid,name from user where gender = 1;
      • 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
      • 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
      • 将这两个查询条件联接起来生成最终查询结果

  1. Cache和Buffer:查询缓存

    • 他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
    • 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

  1. 存储引擎接口

    • 存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
    • 从上图还可以看出,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。
    • 注意:存储引擎是基于表的,而不是数据库。

SQL 大致的查询流程


mysql 的查询流程大致是:


  1. mysql 客户端通过协议与 mysql 服务器建连接, 发送查询语句, 先检查查询缓存, 如果命中, 直接返回结果,否则进行语句解析,也就是说, 在解析查询之前, 服务器会先访问查询缓存(query cache)——它存储 SELECT 语句以及相应的查询结果集。 如果某个查询结果已经位于缓存中, 服务器就不会再对查询进行解析、 优化、 以及执行。 它仅仅将缓存中的结果返回给用户即可, 这将大大提高系统的性能。
  2. 语法解析器和预处理: 首先 mysql 通过关键字将 SQL 语句进行解析, 并生成一颗对应的“解析树”。 mysql 解析器将使用 mysql 语法规则验证和解析查询; 预处理器则根据一些 mysql 规则进一步检查解析数是否合法。
  3. 查询优化器当解析树被认为是合法的了, 并且由优化器将其转化成执行计划。 一条查询可以有很多种执行方式,最后都返回相同的结果。 优化器的作用就是找到这其中最好的执行计划。
  4. 然后, mysql 默认使用的 BTREE 索引, 并且一个大致方向是:无论怎么折腾 sql, 至少在目前来说, mysql 最多只用到表中的一个索引。

6、MySQL 存储引擎


查看 mysql 存储引擎


  • 查看 mysql 支持的存储引擎

show engines;

image

  • 查看 mysql 默认的存储引擎

show variables like '%storage_engine%';

image

MyISAM 引擎和 InnoDb 引擎的对比


是否支持外键、事务、行锁还是表锁。 MyISAM更关注性能,偏重于读。 而InnoDB全面。

image

阿里巴巴用的是啥数据库?


  1. Percona为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升。该版本提升了在高负载情况下的InnoDB的性能、为DBA提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
  2. 该公司新建了一款存储引擎叫xtradb完全可以替代innodb,并且在性能和并发上做得更好,阿里巴巴大部分mysql数据库其实使用的percona的原型加以修改。

image


推荐阅读
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • WebBenchmark:强大的Web API性能测试工具
    本文介绍了一款名为WebBenchmark的Web API性能测试工具,该工具不仅支持HTTP和HTTPS服务的测试,还提供了丰富的功能来帮助开发者进行高效的性能评估。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • Spring Security基础配置详解
    本文详细介绍了Spring Security的基础配置方法,包括如何搭建Maven多模块工程以及具体的安全配置步骤,帮助开发者更好地理解和应用这一强大的安全框架。 ... [详细]
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • Java中提取字符串的最后一部分
    本文介绍了如何使用Java中的substring()和split()方法来提取字符串的最后一部分,特别是在处理包含特殊字符的路径时的方法与技巧。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
author-avatar
手机用户2502883515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有