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

e.k7p.workindex.php,搭建高可用wordpress(keepalived+lvs)

搭建高可用wordpress(keepalivedlvs)搭建MYSQL主从分别在两台MySQL主机上安装MySQL1.使用一键安装脚本安装MySQL[rootmaster~]#t

搭建高可用wordpress(keepalived+lvs)

190d4b8f94df7c2b54d621560aa5e029.png

搭建MYSQL主从

分别在两台MySQL主机上安装MySQL

1.使用一键安装脚本安装MySQL

[root@master ~]# tar xf mysql-5.6.34-onekey-install.tar.gz

[root@master ~]# vim mysql-install.sh

配置MySQL-Master

1.修改配置文件

[root@master ~]# vim /etc/my.cnf

[mysqld]

datadir=/data/mysql

log-bin=/data/bin/mysql-bin

binlog-format=row

server-id=1

2.创建二进制日志目录修改权限

[root@master ~]# mkdir /data/bin

[root@master ~]# chmod -R 700 /data/bin

[root@master ~]# chown -R mysql.mysql /data/bin

3.启动MySQL

[root@master ~]# service mysqld start

Starting MySQL... SUCCESS!

4.授权主从复制账户

[root@master ~]# mysql -e "GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.27.%' IDENTIFIED BY '111111';"

5.查看二进制日志位置

[root@master~]# mysql -e "SHOW MASTER LOGS;"

+------------------+-----------+

| Log_name | File_size |

+------------------+-----------+

| mysql-bin.000001 | 334 |

+------------------+-----------+

配置MySQL-Slave

1.修改配置文件

[root@slave ~]# vim /etc/my.cnf

[mysqld]

server-id=2

read-only

2.启动服务

[root@slave ~]# service mysqld start

3.change master to

mysql> CHANGE MASTER TO MASTER_HOST='192.168.27.31', MASTER_USER='repluser', MASTER_PASSWORD='111111', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1;

4.启动复制线程

mysql> START SALVE;

测试

在主服务器上导入测试数据库

[root@master ~]# mysql

查看从服务器是否复制数据

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| hellodb |

| mysql |

| performance_schema |

| test |

+--------------------+

5 rows in set (0.00 sec)

主从配置完毕

配置web服务器

分别在2台web服务器上安装nginx和php-fpm

安装编译所需的各种软件

yum install -y gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel bzip2 vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils expat-devel bison bison-devel zlib-devel libcurl-devel libarchive-devel boostdevel cmake ncurses-devel gnutls-devel libxml2-devel libevent-devel libaio-devel

编译安装nginx

1.解压nginx源码包

[root@web1 ~]# tar xf nginx-1.14.2.tar.gz

2.检查编译环境

[root@web1 ~]# cd nginx-1.14.2

[root@web1 nginx-1.14.2]# ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

3.编译安装

[root@web1 nginx-1.14.2]# make && make install

4.为应用程序文件建立软连接

[root@web1 nginx-1.14.2]# ln -s /apps/nginx/sbin/nginx /sbin/nginx

5.配置服务启动脚本

[root@web1 nginx-1.14.2]# vim /lib/systemd/system/nginx.service

[Service]

Type=forking

PIDFile=/apps/nginx/logs/nginx.pid

ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s TERM $MAINPID

[Install]

WantedBy=multi-user.target

6.创建启动用户

[root@web1 nginx-1.14.2]# useradd -u2000 www

7.修改配置文件

[root@web1 nginx-1.14.2]# vim /apps/nginx/conf/nginx.conf

user www; #服务启动时以www用户为工作进程

pid /apps/nginx/logs/nginx.pid;

8.启动服务

[root@web1 nginx-1.14.2]# nginx

编译安装php-fpm

1.解压缩源码包

[root@web1 ~]# tar xf php-7.1.30.tar.gz

2.检查编译环境

[root@web1 ~]# cd php-7.1.30

[root@web1 php-7.1.30]# ./configure --prefix=/apps/php --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-mbstring --enable-xml --enable-sockets --enable-fpm --enable-maintainer-zts --disable-fileinfo

3.编译模块并复制模块到指定目录

[root@web1 php-7.1.30]# make && make install

4.复制环境配置文件,修改时区

[root@web1 php-7.1.30]# cp php.ini-production /etc/php.ini

[root@web1 php-7.1.30]# sed -i '/;date.tim/s@.*@data.timezone = "Asia/Shanghai"@' /etc/php.ini

5.配置服务启动脚本

[root@web1 php-7.1.30]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

[root@web1 php-7.1.30]# chmod +x /etc/init.d/php-fpm

[root@web1 php-7.1.30]# chkconfig --add php-fpm

6.复制模板配置文件

[root@web1 php-7.1.30]# cp /apps/php/etc/php-fpm.conf.default /apps/php/etc/php-fpm.conf

[root@web1 php-7.1.30]# cp /apps/php/etc/php-fpm.d/www.conf.default /apps/php/etc/php-fpm.d/www.conf

配置nginx+php

1.修改nginx主配置文件导入其他配置文件

[root@web1 ~]# vim /apps/nginx/conf/nginx.conf

include /apps/nginx/conf/server/*.conf;

2.创建新的server段配置文件

[root@web1 ~]# mkdir /apps/nginx/conf/server

[root@web1 ~]# vim /apps/nginx/conf/server/mylinuxops.conf

server {

server_name www.mylinuxops.com;

listen 80;

location / {

root /data/www;

index index.php index.html;

}

location ~ \.php$ {

root /data/www;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

3.修改php-fpm配置文件

[root@web1 ~]# vim /apps/php/etc/php-fpm.d/www.conf

user = www

group = www

listen = 127.0.0.1:9000

4.重启服务

[root@web1 ~]# nginx -s reload

[root@web1 ~]# service php-fpm start

Starting php-fpm done

测试

创建测试页面

[root@web1 ~]# mkdir /data/www

[root@web1 ~]# vim /data/www/index.php

phpinfo();

?>

浏览器访问

fd77dc505a56820cb3c69fb57de14f14.png

配置keepalived+lvs

配置keepalived+lvs1

1.安装keepalived

[root@lvs1 ~]# yum install keepalived -y

2.修改配置文件

[root@lvs1 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

root@mylinuxops.com

}

notification_email_from root@mylinuxops.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id s1.mylinuxops.com

vrrp_skip_check_adv_addr

vrrp_iptables

#vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_instance VI_1 {

state MASTER

interface ens33

virtual_router_id 27

priority 100

advert_int 2

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.27.100 dev ens33 label ens33:0

192.168.27.101 dev ens33 label ens33:1

}

unicast_src_ip 192.168.27.11

unicast_peer {

192.168.27.12

}

}

virtual_server 192.168.27.100 80 {

delay_loop 5

lb_algo wrr

lb_kind DR

protocol TCP

real_server 192.168.27.21 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 5

retry 3

delay_before_retry 3

}

}

real_server 192.168.27.22 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 5

retry 3

delay_before_retry 3

}

}

}

virtual_server 192.168.27.101 3306 {

delay_loop 5

lb_algo wrr

lb_kind DR

protocol TCP

real_server 192.168.27.31 3306 {

weight 1

TCP_CHECK {

connect_port 3306

connect_timeout 5

retry 3

delay_before_retry 3

}

}

}

重启服务

[root@lvs1 ~]# systemctl restart keepalived

查看是否存在lvs规则

[root@lvs1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.27.100:80 wrr

-> 192.168.27.21:80 Route 1 0 0

-> 192.168.27.22:80 Route 1 0 0

TCP 192.168.27.101:3306 wrr

-> 192.168.27.31:3306 Route 1 0 1

配置keepalived+lvs2

[root@lvs2 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

root@mylinuxops.com

}

notification_email_from root@mylinuxops.com

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id s1.mylinuxops.com

vrrp_skip_check_adv_addr

vrrp_iptables

#vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id 27

priority 80

advert_int 2

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.27.100 dev ens33 label ens33:0

192.168.27.101 dev ens33 label ens33:1

}

unicast_src_ip 192.168.27.12

unicast_peer {

192.168.27.11

}

}

virtual_server 192.168.27.100 80 {

delay_loop 5

lb_algo wrr

lb_kind DR

protocol TCP

real_server 192.168.27.21 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 5

retry 3

delay_before_retry 3

}

}

real_server 192.168.27.22 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 5

retry 3

delay_before_retry 3

}

}

}

virtual_server 192.168.27.101 3306 {

delay_loop 5

lb_algo wrr

lb_kind DR

protocol TCP

real_server 192.168.27.31 3306 {

weight 1

TCP_CHECK {

connect_port 3306

connect_timeout 5

retry 3

delay_before_retry 3

}

}

}

重启服务

[root@lvs2 ~]# systemctl restart keepalived

查看是否存在lvs规则

[root@lvs1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.27.100:80 wrr

-> 192.168.27.21:80 Route 1 0 0

-> 192.168.27.22:80 Route 1 0 0

TCP 192.168.27.101:3306 wrr

-> 192.168.27.31:3306 Route 1 0 1

在后端web服务器及MySQL-master上配置vip

在web1、web2、mysql分别执行lvs_dr_rs脚本

[root@web1 ~]# bash lvs_dr_rs.sh start

脚本内容

#!/bin/bash

vip=192.168.27.100 #mysql将地址改为 192.168.27.101

mask='255.255.255.255'

dev=lo:1

case $1 in

start)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $dev $vip netmask $mask #broadcast $vip up

#route add -host $vip dev $dev

echo "The RS Server is Ready!"

;;

stop)

ifconfig $dev down

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "The RS Server is Canceled!"

;;

*)

echo "Usage: $(basename $0) start|stop"

exit 1

;;

esac

测试

分别在后端服务器上创建测试页面

[root@web1 ~]# echo "

`hostname`" > /data/www/index.html

客户端上测试

[root@localhost ~]# curl www.mylinuxops.com/index.html

web1

[root@localhost ~]# curl www.mylinuxops.com/index.html

web2

暂停lvs1上的keepalived测试vip漂移

[root@lvs1 ~]# systemctl stop keepalived

查看lvs2上是否有vip

[root@lvs2 ~]# ifconfig

ens33:0: flags=4163 mtu 1500

inet 192.168.27.100 netmask 255.255.255.255 broadcast 0.0.0.0

ether 00:0c:29:00:a5:1d txqueuelen 1000 (Ethernet)

测试访问是否正常

[root@localhost ~]# curl www.mylinuxops.com/index.html

web2

[root@localhost ~]# curl www.mylinuxops.com/index.html

web1

测试数据连接

[root@localhost ~]# mysql -urepluser -p111111 -h192.168.27.101 -P3306

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 143

Server version: 5.6.34-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

创建存放图片的nfs服务器

创建出需要共享的目录,并对其进行配置

[root@image ~]# mkdir /data/upload

[root@image ~]# vim /etc/exports

/data/upload *(rw,no_root_squash)

设置为开机启动

[root@image ~]# systemctl enable nfs

Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

安装wordpress

1.在MySQL-Master上授权一个用于数据库操作的账户,创建一个wordpress的数据库

[root@master ~]# mysql -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'192.168.27.%' IDENTIFIED BY'111111';"

[root@master ~]# mysql -e "CREATE DATABASE wordpress;"

[root@master ~]# mysql -e "show databases;"

+--------------------+

| Database |

+--------------------+

| information_schema |

| hellodb |

| mysql |

| performance_schema |

| test |

| wordpress |

+--------------------+

2.分别在后端两个web服务器上解压wordpress

[root@web1 ~]# tar xf wordpress-5.0.1-zh_CN.tar.gz

3.将解压后的数据复制到站点目录

[root@web1 ~]# cp -a wordpress/* /data/www/

4.复制work

[root@web1 ~]# cp /data/www/{wp-config-sample.php,wp-config.php}

[root@web1 ~]# vim /data/www/wp-config.php

// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //

/** WordPress数据库的名称 */

define('DB_NAME', 'wordpress');

/** MySQL数据库用户名 */

define('DB_USER', 'wpuser');

/** MySQL数据库密码 */

define('DB_PASSWORD', '111111');

/** MySQL主机 */

define('DB_HOST', '192.168.27.100');

/** 创建数据表时默认的文字编码 */

define('DB_CHARSET', 'utf8');

/** 数据库整理类型。如不确定请勿更改 */

define('DB_COLLATE', '');

/**#@+

* 身份认证密钥与盐。

*

* 修改为任意独一无二的字串!

* 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org密钥生成服务}

* 任何修改都会导致所有COOKIEs失效,所有用户将必须重新登录。

*

* @since 2.6.0

*/

define('AUTH_KEY', 'Q8B&gE6k?}}bh|:23l/8Pq;#q$?4HT^-riv^Tnk5UcwDIf#g`I3+RJ~^+O7>nUk6');

define('SECURE_AUTH_KEY', '?{2tjkt_KN(+:d|tWA}Th5fi!-y$xVO^sk#>F~{?B$X|#9)6S(~h`0KY?6CY|0jL');

define(&#39;LOGGED_IN_KEY&#39;, &#39;v:_a0a:2Eh^fj9-&#96;&P&#43;.i*V0#-M#jGjw<1*p/9Tea7y&#61;q}R&#61;Hy,Q,9qBX5Kx!ybV&#39;);

define(&#39;NONCE_KEY&#39;, &#39;^5g3j_7:H,_&#61;m/T/ mB&#96;JQxUgXFFjEkhJ)OV qy&|W}aoxQ11t_j;D;yl(w;MV46&#39;);

define(&#39;AUTH_SALT&#39;, &#39;8ZW}E[tXfRDd}$h02-hAgG]zZg4/NX}kM(K_M_Y|[fUz/C!.9|:lfcexu91kIe5q&#39;);

define(&#39;SECURE_AUTH_SALT&#39;, &#39;]r&#43;bt&#43;7&_KkBE~!V&#43;;}8fw|a8,B&#43;-H.ELKN.}!qhFL,LZ&#43;Vj&#61;p0&#64;y5gi5Fo^F&#39;);

define(&#39;LOGGED_IN_SALT&#39;, &#39;jGwl&sWdAh.dNiGSy&#96;qV.-6,DzaFYE;xG;Js*ZgM(E|7a57y(_?]^-u7>;)R

define(&#39;NONCE_SALT&#39;, &#39;*Zl:&#61;N-W!&#43;B8kbaoY&#96;-q)Mq8r7xK|I1^IT0;.ZMiB-Fh$?OtmD/&#43;[![&#96;I&#64;)p~~Lw&#39;);

/**#&#64;-*/

将此文件复制到web2服务器上

[root&#64;web1 ~]# scp /data/www/wp-config.php 192.168.27.22:/data/www

分别在web服务器上挂载nfs&#xff0c;将图片存储到nfs上

[root&#64;web1 ~]# mkdir /data/www/wp-content/uploads

[root&#64;web1 ~]# mount 192.168.27.23:/data/upload /data/www/wp-content/uploads

测试登录

528748522869e8d5552bef7aa049edb9.png



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 安装WLWSupport插件组合使用WindowsLiveWriter,完美支持标签编辑,别名,摘要,上传;完全可视化。WindowsLiveWriter支持有metaweblog ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法
    本文介绍了修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法。首先解释了UEFI的概念和作用,然后提供了两种解决方法。第一种方法是在bios界面中将Boot Mode设置为Legacy Support,Boot Priority设置为Legacy First,并关闭UEFI。第二种方法是使用U盘启动盘进入PE系统,运行磁盘分区工具DiskGenius,将硬盘的分区表设置为gpt格式,并留出288MB的内存。最后,通过运行界面输入命令cmd来完成设置。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
勇胆识_156
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有