php 是最好的语言,嗯,确实是,这门语言异常简单,非常适合做 web 开发,也非常适合作为一门入门的语言来学习。

对于一个没有编程经验的人,想要学习 php 这门语言,该如何上手呢?

本文试图整理一个学习纲要,或者说路线。

一、构建 php 开发环境和开发工具

预先成其事,必先利其器,配置一个好的学习开发环境,使用顺手的工具,能够更加高效的进行学习。

环境

  • 推荐使用 ubuntu 操作系统,安装 php7,mysql,redis 这些基础服务,为 php7 配置必要的扩展。

工具

  • 推荐使用 phpstorm 作为 php 的开发工具。
  • 推荐使用 navicat 或者 datagrip 作为数据库管理工具。

二、了解什么是 php 语言及其特点

PHP 是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。

php 是动态语言,解释性语言,解释型语言的源代码不是直接翻译成机器指令,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。

PHP语言的特性:(摘抄的,了解一下)

1、PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。
2、PHP 支持几乎所有流行的数据库以及操作系统。
3、PHP 可以用C、C++进行程序的扩展!
4、PHP 5 版本之后逐渐规范化,支持面向对象,目前比较完善的支持面向对象。

PHP语言的八大优势:(摘抄的,了解一下)

1、开放源代码,所有的PHP源代码事实上都可以得到。
2、免费性,php和其它技术相比,PHP本身免费且是开源代码。
3、快捷性,程序开发快,运行快,技术本身学习快。嵌入于HTML:因为PHP可以被嵌入于HTML语言,它相对于其他语言。编辑简单,实用性强,更适合初学者。
4、跨平台性强,由于PHP是运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS、Mac OS下。
5、专业专注,PHP 支持脚本语言为主,同为类C语言。
6、效率高, PHP 消耗相当少的系统资源。
7、面向对象,在php4,php5 中,面向对象方面都有了很大的改进,php完全可以用来开发大型商业程序。
8、资料丰富,类库丰富:作为 web 开发, php 依然是主流的语言,开发效率高。

三、了解 php 的基础语法(重点)

参看 《PHP 和 Mysql web 开发中》基础语法相关章节,或者其他的 php 语言基础相关资料。

四、尝试构建一个简单的 php 程序

php 在使用过程中,分为 cgi 应用和 cli 应用,所谓 cgi 应用指的是 web 开发, 而 cli 应用主要指的是 shell 环境下的脚本开发。

  1. 可以尝试写一个脚本:通过 curl 函数,获取天气网站的数据,将数据进行处理之后,保存在一个文件中。脚本每 10 分钟运行一次,将天气的数据按照一定的规范格式存储。
  2. 可以尝试写一个算法题:给定一组数据,将数据从高到低进行排列,并输出。算法题要求,不能使用 php 自带的函数,只能使用基本的数据,字符串操作来编写。
  3. 尝试编写一个 web 页面,该页面接受一个 get 参数,比如参数为城市信息, 页面收到城市信息之后,去抓取天气网的数据,并输出该城市的天气信息,要求该页面输出简洁美观。

五、通过 php 进行文件操作

了解一下即可,后面主要使用框架进行操作,这些扩展下的方法都会被封装到底下。遇到问题的时候可以反过头来再看。

  1. 输出一个目录的文件清单
  2. 递归创建一个目录
  3. 找出一个目录中最大的文件,把它移动到 /tmp 目录下。

六、通过 php 进行数据库操作

了解一下即可,后面主要使用框架进行操作,这些扩展下的方法都会被封装到底下。遇到问题的时候可以反过头来再看。

  1. 连接数据库,输出该数据库中的所有的表。
  2. 向一个数据表中插入一条数据。
  3. 更新一条记录
  4. 删除一条记录
  5. 根据条件查询某表,输出结果,要求把结果展示出来。

七、熟悉 php 的常用函数(重点)

php 在做 web 开发的过程中,常常要处理的是字符串,数组,json,数据,正则表达式这些东西,需要对常用的函数比较熟悉。

这一块可以花一到两天重点学习一下。

八、熟悉 php 面向对象(重点)

php 经过 20 年的发展,从 2000 年之后慢慢的开始从面向过程的函数是风格的语言,逐渐转向面向对象风格为主的语言。面向对象是主流,单纯的函数已经弱化(一些基础的字符串,数组内置函数例外)。

php 有一本面向对象的书籍《深入PHP:面向对象、模式与实践(第三版)》不错,可以翻一翻。

九、学习 modern php 这本书

  1. 了解 php 的新特性:面向对象,trait,命名空间,闭包
  2. 了解 composer,自动加载,组件。
  3. 了解 psr 规范
  4. 了解 php 异常处理
  5. 了解 php 单元测试
  6. 了解 php 最佳实践:查看这篇文章 https://wulijun.github.io/php-the-right-way/

十、了解 php 框架,推荐上手 laravel。

十一、用 laravel 做点什么吧~

  • 到这里,你可以自己做一个简单博客了。

如何使用浏览器预览 Excel、PPT、Word 这些类型的文档呢?

最简单的方式是使用第三方服务, 只需要在你的链接前面拼上

http://view.officeapps.live.com/op/view.aspx?src=your link

即可预览.

比如:

http://view.officeapps.live.com/op/view.aspx?src=http%3a%2f%2fvideo.ch9.ms%2fbuild%2f2011%2fslides%2fTOOL-532T_Sutter.pptx

一、mysql 服务命令

1.1 开启 mysql 服务

service mysql start

1.2 关闭 mysql 服务

service mysql stop

1.3 重启 mysql 服务

service mysql restart

1.4 通过 mysql client 连接 mysql

mysql -h 127.0.0.1 -uusername -ppassword

二、mysql 备份与还原操作

2.1 mysql 数据库备份

mysqldump -h host -uusername -ppassword database > database.sql

2.2 mysql 数据库还原

  1. 首先,需要通过 mysql client 连接到 mysql server

其次连接你需要还原到数据库

use database;

三、mysql 库操作

四、mysql 表操作

五、mysql 查询操作

六、mysql 插入操作

七、mysql 更新操作

八、mysql 删除操作

九、mysql 联表操作

十、mysql 权限操作

1.linux下启动mysql的命令:

  mysqladmin start

  /ect/init.d/mysql start (前面为mysql的安装路径)

  2.linux下重启mysql的命令:

  mysqladmin restart

  /ect/init.d/mysql restart (前面为mysql的安装路径)

  3.linux下关闭mysql的命令:

  mysqladmin -u root -p密码 shutdown

  /ect/init.d/mysql shutdown (前面为mysql的安装路径)

  4.连接本机上的mysql:

  进入目录mysqlbin,再键入命令mysql -uroot -p, 回车后提示输入密码。

  退出mysql命令:exit(回车)

  5.修改mysql密码:

  mysqladmin -u用户名 -p旧密码 password 新密码

  或进入mysql命令行SET PASSWORD FOR '用户名'@'主机' = PASSWORD(‘密码');

  GRANT USAGE ON . TO '用户名'@'主机' IDENTIFIED BY 'biscuit';

  修改自己的密码SET PASSWORD = PASSWORD('biscuit');

  6.增加新用户。(注意:mysql环境中的命令后面都带一个分号作为命令结束符)

  grant all privileges on . to 用户名@'%' identified by '密码' with grant option;

  flush privileges;(刷新权限设置)

  grant select on 数据库.* to 用户名@登录主机 identified by "密码"

  如增加一个用户test密码为123,让他可以在任何主机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:

  grant select,insert,update,delete on . to " Identified by "123";

  7.跳过授权访问mysql

  mysqld_safe --user=mysql --skip-grant-tables --skip-networking &

  二、有关mysql数据库方面的操作

  必须首先登录到mysql中,有关操作都是在mysql的提示符下进行,而且每个命令以分号结束

  1、显示数据库列表。

  show databases;

  2、显示库中的数据表:

  use mysql; //打开库

  show tables;

  3、显示数据表的结构:

  describe 表名;

  4、建库:

  create database 库名;

  5、建表:

  use 库名;

  create table 表名(字段设定列表);

  6、删库和删表:

  drop database 库名;

  drop table 表名;

  7、将表中记录清空:

  delete from 表名;

  8、显示表中的记录:

  select * from 表名;

  9、编码的修改

  如果要改变整个mysql的编码格式:

  启动mysql的时候,mysqld_safe命令行加入

  --default-character-set=gbk

  如果要改变某个库的编码格式:在mysql提示符后输入命令

  alter database db_name default character set gbk;

  三、数据的导入导出

  1、文本数据转到数据库中

  文本数据应符合的格式:字段数据之间用tab键隔开,null值用来代替。例:

  1 name duty 2006-11-23

  数据传入命令 load data local infile "文件名" into table 表名;

  2、导出数据库和表

  mysqldump --opt news > news.sql(将数据库news中的所有表备份到news.sql文件,news.sql是一个文本文件,文件名任取。)

  mysqldump --opt news author article >author.article.sql(将数据库news中的author表和article表备份到author.article.sql文件,author.article.sql是一个文本文件,文件名任取。)

  mysqldump --databases db1 db2 > news.sql(将数据库dbl和db2备份到news.sql文件,news.sql是一个文本文件,文件名任取。)

  mysqldump -h host -u user -p pass --databases dbname > file.dump

  就是把host上的以名字user,口令pass的数据库dbname导入到文件file.dump中

  mysqldump --all-databases > all-databases.sql(将所有数据库备份到all-databases.sql文件,all-databases.sql是一个文本文件,文件名任取。)

  3、导入数据

  mysql < all-databases.sql(导入数据库)

  mysql -u root -p fukai –force < dmc010003_db.myisam.sql(强行导入)

  mysql>source news.sql;(在mysql命令下执行,可导入表)

  MySQLimport的常用选项介绍:

  -d or --delete 新数据导入数据表中之前删除数据数据表中的所有信息

  -f or --force 不管是否遇到错误,MySQLimport将强制继续插入数据

  -i or --ignore MySQLimport跳过或者忽略那些有相同唯一关键字的行, 导入文件中的数据将被忽略。

  -l or -lock-tables 数据被插入之前锁住表,这样就防止了,你在更新数据库时,用户的查询和更新受到影响。

  -r or -replace 这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。

  --fields-enclosed- by= char 指定文本文件中数据的记录时以什么括起的, 很多情况下数据以双引号括起。 默认的情况下数据是没有被字符括起的。

  --fields-terminated- by=char 指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。您可以用此选项指定数据之间的分隔符。

  默认的分隔符是跳格符(Tab)

  --lines-terminated- by=str 此选项指定文本文件中行与行之间数据的分隔字符串或者字符。 默认的情况下MySQLimport以newline为行分隔符。

  您可以选择用一个字符串来替代一个单个的字符:

  一个新行或者一个回车。

  MySQLimport命令常用的选项还有-v 显示版本(version),-p 提示输入密码(password)

  例子:导入一个以逗号为分隔符的文件

  文件中行的记录格式是这样的:

  "1", "ORD89876", "1 Dozen Roses", "19991226"

  我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中,我们使用这个命令:

  bin/MySQLimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt

  一、连接MySQL

  格式: mysql -h主机地址 -u用户名 -p用户密码

  1、例1:连接到本机上的MYSQL。

  首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>。

  2、例2:连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令:

  mysql -h110.110.110.110 -uroot -pabcd123

  (注:u与root可以不用加空格,其它也一样)

  3、退出MYSQL命令: exit (回车)。

  mysql常用维护命令

  1、show global status;列出MySQL服务器运行各种状态值

  2、show variables;查询MySQL服务器配置信息语句

  3、查看慢查询

  show variables like '%slow%';

  show global status like '%slow%';

  4、最大连接数

  show variables like 'max_connections';MySQL服务器最大连接数

  show global status like 'Max_used_connections'; 服务器响应的最大连接数

  5、查看表结构

  desc Tablename;

  describe Tablename;

  show columns from Tablename;

  show create table Tablename;

一、Nginx 简介

Nginx是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,目前已经是最主要的 web 服务器软件。

nginx 有一个主进程和几个 worker 进程。主进程的作用是读取并执行配置,并维护 worker 进程。worker 进程是实际处理请求的进程。

nginx 采用事件驱动模型和基于系统的一些机制来高效分发请求给多个 worker 进程。worker 进程的数量可以在配置文件中配置。

二、Nginx 的特点

  • 模块化设计,较好的扩展性。
  • 高可靠性。
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件。
  • 低内存消耗:10000 个 keep-alive 连接模式下的非活动连接,仅需要 2.5M 内存。

三、Nginx 能用来做什么?

  • 静态资源的web服务器。
  • FastCGI(lnmp),uWSGI(python)等协议 :web 服务器,fastcgi 配合 php-fpm 实现 php web 服务。
  • http 协议反向代理服务器。
  • pop3/imap4协议反向代理服务器。

四、Nginx与web服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte 路径别名
  • 基于 IP 及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程
  • SSL 支持
  • gzip 支持
  • cache 支持

五、Nginx 如何安装?

  • 包安装:apt-get,yum,用于安装系统默认支持的版本。
  • 编译安装:用于安装指定的版本。

六、Nginx 配置文件详解

nginx 配置文件是分层配置的,从外到内,main > http > server > location

nginx 配置文件

6.1 段

6.1.1 main 段

nginx 在运行时与具体业务功能无关的一些参数,比如工作进程数,运行的身份等。

woker_processes 2

在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。

这个数值简单一点可以设置为cpu的核数, 也是 auto 值,如果开启了 ssl 和 gzip 更应该设置成与逻辑 CPU 数量一样甚至为 2倍,可以减少I/O操作, 如果nginx服务器还有其它服务,可以考虑适当减少。

worker_cpu_affinity

在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如

worker_cpu_affinity 0001 0010 0100 1000; (四核)。
worker_rlimit_nofile 10240

可以限制为操作系统最大的限制 65535。

6.1.2 events 段

worker_connections 2048

每一个 worker 进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。

nginx作为反向代理服务器,计算公式最大连接数 = worker_processes * worker_connections / 4,不能超过worker_rlimit_nofile。当 nginx 作为 http 服务器时,计算公式里面是除以 2。

use epoll

在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。

6.1.3 http 段

与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。

sendfile on
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

keepalive_timeout 65 : 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。

send_timeout : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

client_max_body_size 10m
允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值

client_body_buffer_size 128k
缓冲区代理缓冲用户端请求的最大字节数
模块http_proxy:
这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能(另见文章)

proxy_connect_timeout 60
nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 60
连接成功后,与后端服务器两个成功的响应操作之间超时时间(代理接收超时)

proxy_buffer_size 4k
设置代理服务器(nginx)从后端realserver读取并保存用户头信息的缓冲区大小,默认与proxy_buffers大小相同,其实可以将这个指令值设的小一点

proxy_buffers 4 32k
proxy_buffers缓冲区,nginx针对单个连接缓存来自后端realserver的响应,网页平均在32k以下的话,这样设置

proxy_busy_buffers_size 64k
高负荷下缓冲大小(proxy_buffers*2)

proxy_max_temp_file_size
当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与 proxy_cache 没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。

proxy_temp_file_write_size 64k
当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。proxy_temp_path(可以在编译的时候)指定写到哪那个目录。

proxy_pass,proxy_redirect见 location 部分。

模块http_gzip:

gzip on : 开启gzip压缩输出,减少网络传输。
gzip_min_length 1k : 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
gzip_http_version 1.0 : 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.0,故请设置为 1.0。
gzip_comp_level 6 : gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_types :匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
gzip_proxied any : Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。
gzip_vary on : 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。。

    fastcgi_connect_timeout 3000s;
    fastcgi_send_timeout 6000s;
    fastcgi_read_timeout 6000s;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 8 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_intercept_errors on;

    client_header_timeout 3000s;
    client_body_timeout 3000s;
    client_max_body_size    20m;
    client_body_buffer_size 256k;

6.1.4 server 段

典型的 server 段配置文件

server {
    # 监听 HTTP 协议默认的 [80] 端口。
    listen 80;
    # 绑定主机名 [example.com]。
    server_name example.com;
    # 服务器站点根目录 [/example.com/public]。
    root /example.com/public;

    # 添加几条有关安全的响应头;与 Google+ 的配置类似,详情参见文末。
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # 站点默认页面;可指定多个,将顺序查找。
    # 例如,访问 http://example.com/ Nginx 将首先尝试「站点根目录/index.html」是否存在,不存在则继续尝试「站点根目录/index.htm」,以此类推...
    index index.html index.htm index.php;

    # 指定字符集为 UTF-8
    charset utf-8;

    # Laravel 默认重写规则;删除将导致 Laravel 路由失效且 Nginx 响应 404。
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # 关闭 [/favicon.ico] 和 [/robots.txt] 的访问日志。
    # 并且即使它们不存在,也不写入错误日志。
    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    # 将 [404] 错误交给 [/index.php] 处理,表示由 Laravel 渲染美观的错误页面。
    error_page 404 /index.php;

    # URI 符合正则表达式 [\.php$] 的请求将进入此段配置
    location ~ \.php$ {
        # 配置 FastCGI 服务地址,可以为 IP:端口,也可以为 Unix socket。
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        # 配置 FastCGI 的主页为 index.php。
        fastcgi_index index.php;
        # 配置 FastCGI 参数 SCRIPT_FILENAME 为 $realpath_root$fastcgi_script_name。
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        # 引用更多默认的 FastCGI 参数。
        include fastcgi_params;
    }
    # 通俗地说,以上配置将所有 URI 以 .php 结尾的请求,全部交给 PHP-FPM 处理。

    # 除符合正则表达式 [/\.(?!well-known).*] 之外的 URI,全部拒绝访问
    # 也就是说,拒绝公开以 [.] 开头的目录,[.well-known] 除外
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

6.1.5 location 段

6.2 重定向

6.3 邪恶的 if

其他

  • gzip
  • http code
  • try
  • access log
  • error log
  • proxy
  • ssl
  • map

七、Nginx 高级使用

openresty

  • access control
  • 复杂的重定向
  • 缓存管理

八、测试相关

8.1 搭建一个最小的测试单元

其实,当你的 nginx 跑起来之后,你访问 127.0.0.1 就可以看到一个 nginx 的默认页面了。

你看到这个页面,说明你的 nginx 服务已经正常在运行,默认的页面是 nginx 的默认 server 段在执行,如果感兴趣的话,可以了解下默认 server 的配置文件。

搭建自己的 web 站点,你需要做以下几件事情:

8.1.1 dns 解析:

这个 dns 解析可以是真实的域名增加 A 记录,也可以是修改自己的 hosts 表,比如:

127.0.0.1 abc.test # test 域名 chrome 会识别,其他后缀的测试域名,可能会有问题。

当做好域名解析之后,你就可以在 nginx 的 vhosts 目录下增加虚拟主机了。

8.1.2 设置站点目录:

遵照习惯,我们设定 web 的根目录为 /srv/www
在这个目录下,我们建立 abc.test 目录。
在 abc.test 目录下,我们新建一个 index.html 文件,敲入如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p> hello, world! </p>
</body>
</html>

在 abc.test 目录下,新建 phpinfo.php, 敲入如下代码:

<?php

echo phpinfo();

?>

8.1.3 增加虚拟主机:

server {
    listen       80;
    server_name  abc.test;
    index index.html index.php;
    root  /srv/www/abc.test;

    # logs
    error_log  /var/log/nginx/abc_error.log error;
    access_log /var/log/nginx/abc_access.log;

    # rewrite
    location / {
        try_files $uri $uri/ @rewrite;
    }

    # static cache
    location ~* .(js|css|png|jpg|gif|ico)$ {
        expires 7d;
    }


    if ( $fastcgi_script_name ~ ..*/.*php ) {
        return 403;
    }

    location @rewrite {
        rewrite ^(.*)$ /index.php$1;
    }

    location ~ \.php($|/) {
        fastcgi_pass unix:/var/run/php/php5.6-fpm.sock;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include  fastcgi.conf;
    }
}

8.1.4 重启 nginx,并访问 abc.test, 以查看效果。

  • 访问 abc.test
  • 访问 abc.test/index.html
  • 访问 abc.test/phpinfo.php

如果以上访问都正常,说明 nginx 环境配置正常, php 环境配置正常。

相关

通过 curl 检测网站是否开启了 gzip 压缩

curl -H "Accept-Encoding: gzip" -I https://www.guohuawei.com

返回结果:

HTTP/2 200
date: Thu, 30 May 2019 10:22:26 GMT
content-type: text/html; charset=UTF-8
set-cookie: __cfduid=da62a867e8f6cabdd6cfc5b8c606145001559211746; expires=Fri, 29-May-20 10:22:26 GMT; path=/; domain=.guohuawei.com; HttpOnly
x-pingback: http://www.guohuawei.com/action/xmlrpc
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 4deffca51a00962f-SJC
content-encoding: gzip

通过 curl 查看请求响应时间

# curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" http://www.guohuawei.com

0.014::0.015::0.018::0.019::1516256.00

-o:把curl 返回的html、js 写到垃圾回收站[ /dev/null]
-s:去掉所有状态
-w:按照后面的格式写出rt

time_namelookup:DNS 解析域名 www.guohuawei.com 的时间
time_commect:client和server端建立TCP 连接的时间
time_starttransfer:从client发出请求;到web的server 响应第一个字节的时间
time_total:client发出请求;到web的server发送会所有的相应数据的时间
speed_download:下周速度 单位 byte/s

上面这条命令及返回结果可以这么理解:

0.014: DNS 服务器解析 www.guohuawei.com 的时间单位是s
0.015: client发出请求,到c/s 建立TCP 的时间;里面包括DNS解析的时间
0.018: client发出请求;到s响应发出第一个字节开始的时间;包括前面的2个时间
0.019: client发出请求;到s把响应的数据全部发送给client;并关闭connect的时间

1516256.00 :下载数据的速度

建立TCP连接到server返回client第一个字节的时间:0.018s - 0.015s = 0.003s
server把响应数据发送给client的时间:0.019s - 0.018 = 0.01s

使用 curl post 数据

curl -d "param1=value1&param2=value2" -X POST http://domain.com/api/something