• 返回首页

    PHP动态网站教程

    前言

    参考资料: 【黑马程序员PHP零基础入门到精通教程(P1基础6天)】 https://www.bilibili.com/video/BV18x411H7qD

    【PHP零基础入门到精通教程(P2 mysql数据库5天)】 https://www.bilibili.com/video/BV1Vx411g7uJ

    (P2为数据库操作,可参考MySQL笔记(已完结)

    【PHP零基础入门到精通教程(P3 核心编程技术)】 https://www.bilibili.com/video/BV1jx411M7B7

    【PHP: PHP 手册 - Manual】

    说明: 本笔记为本人学习过程中随手写的笔记,为复习使用,笔记中可能存在遗漏或错误,具体请以官方文档和权威书籍为准!谢谢! 笔记中的一些图片等元素因路径配置问题,可能会发生丢失。 笔记中展示的知识点仅为部分内容,完整内容请查阅官方开发文档内容!

     

    PHP介绍

    PHP 是什么?

    PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。

    PHP 页面并不包含大量输出 HTML 的命令(如 C 或 Perl 中所示),而是包含嵌入代码的 HTML,这些代码可执行某些操作(在本例中为输出 Hi, I'm a PHP script!)。PHP 代码包含在特殊的开始和结束处理指令 中,允许跳入和退出 PHP 模式。

    和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端的。如果在服务器上建立了如上例类似的代码,则在运行该脚本后,客户端就能接收到其结果,但无法得知底层代码是什么。甚至可以将 web 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法知道正在使用 PHP。

    使用 PHP 的最大的好处是它对于初学者来说极其简单,同时也给专业的程序员提供了各种高级的特性。当看到 PHP 长长的特性列表时,请不要害怕。使用 PHP,几乎任何人都可以快速上手并编写简单的脚本。

    尽管 PHP 的开发主要侧重于服务器端脚本,但它可以做很多事情。

     

    总结


    PHP 能做什么?

    PHP 能做任何事。PHP 主要是用于服务端的脚本程序,因此可以用 PHP 来完成任何其它的 CGI 程序能够完成的工作,例如收集表单数据,生成动态网页,或者发送/接收 Cookies。但 PHP 的功能远不局限于此。

    PHP 脚本主要用于以下两个领域:

    PHP 可用于所有主流操作系统,包括 Linux、许多 Unix 变体(包括 HP-UX、Solaris 和 OpenBSD)、Microsoft Windows、macOS、RISC OS 以及其他操作系统。PHP 还支持当今大多数 Web 服务器。这包括 Apache、IIS 和许多其他服务器。这包括任何可以使用 FastCGI PHP 二进制文件的 Web 服务器,如 lighttpd 和 nginx。PHP 既可以作为模块工作,也可以作为 CGI 处理器工作。

    因此,使用 PHP,开发者可以自由地选择操作系统和 web 服务器。同时,还可以在开发时选择使用面向过程或者面对对象(OOP),或者两者的混和。

    PHP 不仅限于输出 HTML。PHP 的功能包括输出丰富的文件类型,例如图像或 PDF 文件、加密数据和发送电子邮件。还可以轻松输出任何文本,例如 JSON 或 XML。PHP 可以自动生成这些文件,并将它们保存在文件系统中,而不是将其打印出来,从而形成动态内容的服务器端缓存。

    PHP 最强大最显著的特性之一,是它支持很大范围的数据库。使用任何针对某数据库的扩展(例如 mysql)编写数据库支持的网页非常简单,或者使用抽象层如 PDO,或者通过 ODBC 扩展连接到任何支持 ODBC 标准的数据库。其它一些数据库也可能会用 cURL 或者 sockets,例如 CouchDB。

    PHP 还支持使用 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等协议与其他服务通信,以及其他无数协议。还可以打开原始网络套接字并使用任何其他协议进行交互。PHP 支持几乎所有 web 开发语言之间的 WDDX 复杂数据交换。关于相互连接,PHP 已经支持了对 Java 对象的实例化,并且可以无缝的将其用作 PHP 对象。

    PHP 具有极其有效的文本处理特性,包括 Perl 兼容正则表达式(PCRE)以及许多扩展和工具可用于解析和访问 XML 文档。PHP 将所有的 XML 功能标准化于坚实的 libxml2 扩展,并且还增加了 SimpleXML,XMLReader 以及 XMLWriter 支持以扩充其功能。

    另外,还有很多其它有趣的扩展库。

     

    总结

     

    为什么使用 PHP?

     

    PHP 文件?


     

    您应当具备的基础知识

    在继续学习之前,您需要对下面的知识有基本的了解:

     

    网站

    Website的中文名称是网站,是指在互联网上,根据一定的规则,使用HTML、PHP等代码语言制作的用于展示特定内容的相关网页的集合,有可供管理人员操作的后台及用户使用的前台。简单地说,Website是一种通讯工具,就像布告栏一样,人们可以通过Website来发布自己想要公开的资讯,或者利用Website来提供相关的网络服务。人们可以通过网页浏览器来访问Website,获取自己需要的资讯或者享受网络服务。

     

    静态网站特点

    1. 网页内容一旦发布到网站服务器上,无论是否有用户访问,每个静态页面的内容都是保存在网站服务器上的,每个网页都是一个独立的文件。

    2. 静态网页的内容相对稳定,因此容易被搜索引擎检索。

    3. 静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时,完全依赖静态网页制作比较困难。

    4. 静态网页的交互性较差,在功能方面有较大的限制。

     

    动态网站特点

    1. 交互性:网页会根据用户的要求和选择而动态地改变和响应,浏览器作为客户端,成为一个动态交流的桥梁。

    2. 自动更新:无需手动更新html文档,便会自动生成新的页面,可以大大节约工作量,

    3. 因时因人而变:即当不同时间,不同用户访问同意网站时,会出现不同的界面。 此外动态页面和静态页面是相对应的,也就是说,网页URL的后缀不是.htm,.html,.shtml,.xml等静态网页的的常见形式,而是以.asp,.jsp,.php,.perl,.cgi等形式为后缀。

     

    网站基本概念

    详细内容可以参阅《计算机网络》

    服务器

    服务器(server),,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

    在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器等。

    服务器:能够提供服务的机器,取决于机器上所安装的软件(服务软件)

    Web服务器:提供web服务(网站访问),就需要安装web服务软件,Apache,tomcat,iis等

     

    IP

    IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据报传输服务。

     

    域名

    域名(Domain name)是互联网基础架构的关键部分。它们为互联网上任何可用的 Web 服务器提供了方便人类理解的地址。

    任何连上互联网的电脑都可以通过一个公共 IP 地址访问到,可以 IPv4 地址(例如,192.0.2.172)或 IPv6 地址(例如,2001:db8:8b73:0000:0000:8a2e:0370:1337)。

    计算机可以很容易地处理这些 IP 地址,但是对一个人来说很难找出谁在操控这些服务器以及这些网站提供什么服务。IP 地址很难记忆而且可能会随着时间的推移发生改变。

    为了解决这些问题,我们使用人类可读的地址,称作域名。

     

    域名的结构 一个域名是由几部分(有可能只有一部分、两部分、三部分……)组成的简单结构,以点分隔,并从右到左阅读

     

    获得一个域名

    1. 去域名注册商的网站。

    2. 通常那些网站上都有突出的“获得域名”宣传,点击它。

    3. 按要求仔细填表。特别是要确保你没有将你想要的域名拼错。一旦付款,便为时已晚!

    4. 注册商将会在域名正确注册后通知你。数小时之内,所有 DNS 服务器都会收到你的 DNS 信息。

     

    DNS

    DNS 数据库存储在全球每个 DNS 服务器上,所有这些服务器都源于(refer to)几个被称为“权威名称服务器”或“顶级 DNS 服务器”的特殊服务器——它们就像管理系统的主服务器。

    每当你的注册商为特定域名创建或更新任何信息时,该信息必须在每个 DNS 数据库中刷新。知道特定域名的每个 DNS 服务器在自动失效并刷新之前都会存储其信息一段时间(DNS 服务器会查询权威服务器,并从中获取更新的信息)。因此,对于知道此域名的 DNS 服务器来说,获取最新信息需要一些时间。

    DNS 请求如何工作? 正如我们所看到的,当你想在浏览器中展示一个网页的时候,输入域名比输入 IP 简单多了。让我们看一下这个过程:

    1. 在你的浏览器地址栏输入 mozilla.org。

    2. 你的浏览器询问你的计算机是否已经识别此域名所确定的 IP 地址(使用本地 DNS 缓存)。如果是的话,这个域名被转换为 IP 地址,然后浏览器与 Web 服务器协商内容。结束。

    3. 如果你的电脑不知道 mozilla.org 域名背后的 IP,它会询问 DNS 服务器,这个服务器的工作就是告诉你的电脑已经注册的域名所匹配的 IP。

    4. 现在电脑知道了要请求的 IP 地址,你的浏览器能够与 Web 服务器协商内容。

     

    端口

    什么是网络端口? 在网络技术中,端口包括逻辑端口和物理端口两种类型。

     

    端口的作用 端口号的主要作用是表示一台计算机中的特定进程所提供的服务。网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机,但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、Web服务等,我们就通过端口号来区别相同计算机所提供的这些不同的服务,如常见的端口号21表示的是FTP服务,端口号23表示的是Telnet服务,端口号25指的是SMTP服务等。

    端口的分类 TCP与UDP段结构中端口地址都是16比特,可以有在0---65535范围内的端口号。

    按照端口号分类:

    按照协议类型分类:按协议类型划分可分为TCP端口、UDP端口、IP端口、ICMP。

     

     

    环境搭建

    本教程中操作系统采用的是Linux(centos),web服务器采用nginx,如果你使用的是其他操作系统,可以网络搜索安装方法。

    安装Apache/nginx

    注意:web服务器有很多,包括但不限于ApacheIISGFENginxTomcat等等,你可以选择一个自己喜欢的或更符合业务需求的进行安装.

    1. 准备一台安装Linux系统的服务器/虚拟机等

    2. 启动

    3. 开放80端口

    4. 访问(输入服务器IP,如:http://192.168.237.129/

    5. 配置成功image-20250105175202239

     

     

    如果你是用的是Nginx服务器,可以参考以下教程:云服务器 手动搭建 LNMP 环境(CentOS 7)-实践教程-文档中心-腾讯云

    安装 Nginx

    1. 执行以下命令,在 /etc/yum.repos.d/ 下创建 nginx.repo 文件。

    2. i 切换至编辑模式,写入以下内容。

    3. Esc,输入 :wq,保存文件并返回。

    4. 执行以下命令,安装 nginx。

    5. 执行以下命令,打开 default.conf 文件。

    6. i 切换至编辑模式,编辑 default.conf 文件。

    7. 找到 server{...},并将 server 大括号中相应的配置信息替换为如下内容。用于取消对 IPv6 地址的监听,同时配置 Nginx,实现与 PHP 的联动。

    8. Esc,输入 :wq,保存文件并返回。

    9. 执行以下命令启动 Nginx。

    10. 执行以下命令,设置 Nginx 为开机自启动。

    11. 在本地浏览器中访问以下地址,查看 Nginx 服务是否正常运行。

       

    安装PHP

    1. 先检查是否安装了PHP,如果已经安装,先卸载老版本

    2. 为PHP 8启用流模块

    3. 安装PHP8及其扩展

    4. 查看是否安装成功

    5. 出现以下内容即为安装成功

    6. 如果Apache无法解析PHP,配置Apache对PHP的解析

      1. 编辑/etc/httpd/conf/httpd.conf,寻找以下代码,若没有则加入到LoadModule处

      2. 在文件末尾加入如下代码以支持Apache对PHP的解析

      3. 找到如下代码,在index.html末尾加上index.php

      4. 重启Apache服务

      5. 在/var/www/html下放入php文件,通过web页面访问,若能执行PHP代码而不是直接输出PHP代码,说明配置成功


     

    安装配置 PHP(nginx)

    1. 依次执行以下命令,更新 yum 中 PHP 的软件源。

    2. 运行以下命令,启用 PHP 8.0仓库。

    3. 执行以下命令,安装 PHP 8.0 所需要的包。

    4. 执行以下命令,启动 PHP-FPM 服务。

    5. 执行以下命令,设置 PHP-FPM 服务为开机自启动。

     

    安装数据库(Mysql)

    这里可以参考笔记仓库中的《MySQL笔记(已完结)》,这里不再过多赘述。

    如果你使用MariaDB可以参考以下方法,与mysql基本一致

    1. 执行以下命令,查看系统中是否已安装 MariaDB。

      为避免安装版本不同造成冲突,请执行以下命令移除已安装的 MariaDB。

    2. 执行以下命令,在 /etc/yum.repos.d/ 下创建 MariaDB.repo 文件。

    3. i 切换至编辑模式,写入以下内容,添加 MariaDB 软件库。

      说明:

      以下配置使用了腾讯云镜像源,腾讯云镜像源同步 MariaDB 官网源进行更新,可能会出现 MariaDB 10.4 版本源失效问题(本文以在 CentOS 7.6 上安装 MariaDB 10.4.22 版本为例),您可前往 MariaDB 官网 获取其他版本及操作系统的 MariaDB 软件库安装信息。

      若您的云服务器使用了 内网服务,则可以将 mirrors.cloud.tencent.com 替换为 mirrors.tencentyun.com 内网地址,内网流量不占用公网流量且速度更快。

    4. Esc,输入 :wq,保存文件并返回。

    5. 执行以下命令,安装 MariaDB。此步骤耗时较长,请关注安装进度,等待安装完毕。

    6. 执行以下命令,启动 MariaDB 服务。

    7. 执行以下命令,设置 MariaDB 为开机自启动。

    8. 执行以下命令,验证 MariaDB 是否安装成功。

     

    验证安装环境

     

    这样,PHP环境就配置完成了。当然,你也可以用PHPstudy等工具进行配置。

    phpStudy 是一个PHP开发环境集成包, 可用在本地电脑或者服务器上, 该程序包集成最新的 PHP / MySql / Apache / Nginx / Redis / FTP / Composer, 一次性安装, 无须配置即可使用, 非常方便、好用!

    官网:小皮面板(phpstudy) - 让天下没有难配的服务器环境!

    这种方式比较简单,可以参考官网文档进行安装和配置。

     

    PHP基础语法

    PHP是一种运行在服务器端的脚本语言,它可以嵌入在html中。

    PHP标记

     

    PHP注释

    PHP中注释分为行注释和块注释。

    行注释:一次注释一行。“//”或“#”

    块注释:一次注释多行。“/**/”

     

    语句分隔符

    在PHP中使用";",作为语句结束标记。

     

    变量

    与代数类似,可以给 PHP 变量赋予某个值(x=5)或者表达式(z=x+y)。

    变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。

    PHP 变量命名规则:

     

    预定义变量

    系统中已经定义好的变量,存储了很多需要用到的数据。(预定义变量都是数组)

     

    变量传值

    将一个变量赋值给另外一个变量。有两种方式:值传递,引用传递。

     

    常量

    常量和变量一样们都是用来保存数据的

    常量:const/constant,是程序运行中不可改变的。

     

    常量定义和使用

    1. 使用定义常量的函数

    2. 使用const关键字

     

    在 PHP 7 及以上版本中,常量也可以是数组。

    或者使用 const:

     

    预定义常量

    PHP 提供了一些预定义常量,可以在脚本中直接使用。这些常量通常用于获取 PHP 的配置信息、版本信息等。常见的预定义常量有:

     

    PHP数据类型

    分类

    PHP 变量存储不同的类型的数据,不同的数据类型可以做不一样的事情。

    PHP 支持以下几种数据类型:

     

    类型转换

    在PHP中有两种类型转换方式

    1. 自动转换

    2. 强制转换 语法:(数据类型)变量名

    在转换过程中,常用的是转布尔类型和转数值类型。

     

    数据类型判断

    通过函数(一组is_xxx的函数)来判断变量,返回该变量保存得到数据类型。

    常用的判断函数

    函数说明
    is_int是否为整型
    is_bool是否为布尔
    is_float是否是浮点
    is_string是否是字符串
    is_array是否是数组
    is_object是否是对象
    is_null是否为空
    is_resource是否为资源
    is_scalar是否为标量
    is_numeric是否为数值类型
    is_callable是否为函数
    。。。。。。

     

    可以用下面一组函数获取和设定数据类型

     

    进制转换

    在PHP中,提供了四种整形的定义方式:

    在PHP中默认输出都会自动转换成十进制进行输出。

     

    运算符

    运算符:operator,是一种将数据进行运算的特殊符号。

    算数运算符

    运算符名称描述实例结果
    x + yx 和 y 的和2 + 24
    x - yx 和 y 的差5 - 23
    x * yx 和 y 的积5 * 210
    x / yx 和 y 的商15 / 53
    x % y模(除法的余数)x 除以 y 的余数5 % 2 10 % 8 10 % 21 2 0
    -x设置负数取 x 的相反符号<?php $x = 2; echo -$x; ?>-2
    ~x取反x 取反,按二进制位进行"取反"运算。运算规则:~1=-2; ~0=-1;<?php $x = 2; echo ~$x; ?>-3
    a . b并置连接两个字符串"Hi" . "Ha"HiHa

    赋值运算符

    运算符等同于描述
    x = yx = y左操作数被设置为右侧表达式的值
    x += yx = x + y
    x -= yx = x - y
    x *= yx = x * y
    x /= yx = x / y
    x %= yx = x % y模(除法的余数)
    a .= ba = a . b连接两个字符串

    比较运算符

    运算符名称描述实例
    x == y等于如果 x 等于 y,则返回 true5==8 返回 false
    x === y绝对等于如果 x 等于 y,且它们类型相同,则返回 true5==="5" 返回 false
    x != y不等于如果 x 不等于 y,则返回 true5!=8 返回 true
    x <> y不等于如果 x 不等于 y,则返回 true5<>8 返回 true
    x !== y不绝对等于如果 x 不等于 y,或它们类型不相同,则返回 true5!=="5" 返回 true
    x > y大于如果 x 大于 y,则返回 true5>8 返回 false
    x < y小于如果 x 小于 y,则返回 true5<8 返回 true
    x >= y大于等于如果 x 大于或者等于 y,则返回 true5>=8 返回 false
    x <= y小于等于如果 x 小于或者等于 y,则返回 true5<=8 返回 true

    递增/递减运算符

    运算符名称描述
    ++ x预递增x 加 1,然后返回 x
    x ++后递增返回 x,然后 x 加 1
    -- x预递减x 减 1,然后返回 x
    x --后递减返回 x,然后 x 减 1

    逻辑运算符

    运算符名称描述实例
    x and y如果 x 和 y 都为 true,则返回 truex=6 y=3 (x < 10 and y > 1) 返回 true
    x or y如果 x 和 y 至少有一个为 true,则返回 truex=6 y=3 (x==6 or y==5) 返回 true
    x xor y异或如果 x 和 y 有且仅有一个为 true,则返回 truex=6 y=3 (x==6 xor y==3) 返回 false
    x && y如果 x 和 y 都为 true,则返回 truex=6 y=3 (x < 10 && y > 1) 返回 true
    x || y如果 x 和 y 至少有一个为 true,则返回 truex=6 y=3 (x==5 || y==5) 返回 false
    ! x如果 x 不为 true,则返回 truex=6 y=3 !(x==y) 返回 true

    数组运算符

    运算符名称描述
    x + y集合x 和 y 的集合
    x == y相等如果 x 和 y 具有相同的键/值对,则返回 true
    x === y恒等如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true
    x != y不相等如果 x 不等于 y,则返回 true
    x <> y不相等如果 x 不等于 y,则返回 true
    x !== y不恒等如果 x 不等于 y,则返回 true

    三元运算符

    组合比较符(PHP7+)

    错误抑制符

    错误控制运算符“@”是一个前缀运算符,可以用于抑制表达式中的错误消息和警告。它可以阻止错误信息显示在用户的界面上,并继续执行代码。

     

    位运算符

    计算机码

    计算机码:计算机在实际存储数据的时候,采用的编码规则(二进制规则)

    计算机码:原码、反码和补码,数值本身最左边一位是用来充当符号位:正数为0,负数为1

    原码:数据本身从十进制转换成二进制得到的结果

    正数:左边符号位为0

    负数:左边符号位为1

    反码:针对负数,符号位不变,其他位取反

    补码:针对负数,反码+1

    系统中存在两个0:+0和-0t +0:00000000

    -0:10000000


    符号名称结果
    $a & $bAnd(按位与)将把 $a 和 $b 中都为 1 的位设为 1。
    $a | $bOr(按位或)将把 $a 和 $b 中任何一个为 1 的位设为 1。
    $a ^ $bXor(按位异或)将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
    ~ $aNot(按位取反)将 $a 中为 0 的位设为 1,反之亦然。
    $a << $bShift left(左移)将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
    $a >> $bShift right(右移)将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

     

    流程控制

    任何 PHP 脚本都是由一系列语句构成的。一条语句可以是一个赋值语句,一个函数调用,一个循环,一个条件语句或者甚至是一个什么也不做的语句(空语句)。语句通常以分号结束。此外,还可以用花括号将一组语句封装成一个语句组。语句组本身可以当作是一行语句。

    控制分类:顺序结构,分支结构,循环结构

    仅展示了部分流程控制语法:更多参考->PHP: 流程控制 - Manual

    顺序结构

    最基础的结构,所有代码默认都是从上往下依次执行。

     

    分支结构

    给定一个条件,同时有多种可执行代码块,根据条件执行某一段代码。

    if分支

    if 结构是很多语言包括 PHP 在内最重要的特性之一,它允许按照条件执行代码片段。PHP 的 if 结构和 C 语言相似:

    多条件分支:if、elseif、else

    注意: 必须要注意的是 elseifelse if 只有在类似上例中使用花括号的情况下才认为是完全相同。如果用冒号来定义 if/elseif 条件,必须在一个单词中使用 elseif。如果 else if 分割为两个单词,则 PHP 会产生解析错误。

     

    switch分支

    switch 语句类似于具有同一个表达式的一系列 if 语句。很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码。这正是 switch 语句的用途。

    一个 case 的特例是 default。它匹配了任何和其它 case 都不匹配的情况。

    如果没有匹配到 case 分支且没有 default 分支,则不会执行任何代码,就像 if 不为 true 一样。

    允许使用分号代替 case 语句后的冒号,例如:

     

    循环结构

    在某个条件范围内,指定代码块可以重复执行。

    在PHP中循环有for,while,do-while,foreach(针对数组)

    for循环

    for 循环是 PHP 中最复杂的循环结构。

    for循环的语法

    例子:显示数字 1 到 10

     

    while循环

    while 循环是 PHP 中最简单的循环类型。

    语法:

    例:它们都显示数字 1 到 10

     

    do-while循环

    do-while 循环和 while 循环非常相似,区别在于表达式的值是在每次循环结束时检查而不是开始时。和一般的 while 循环主要的区别是 do-while 的循环语句保证会执行一次(表达式的真值在每次循环结束后检查),然而在一般的 while 循环中就不一定了(表达式真值在循环开始时检查,如果一开始就为 false 则整个循环立即终止)。

    do-while 循环语法:

    示例代码

     

    循环控制

    在循环内部本身进行控制。

    输出1-100中5的倍数

    如果是循环嵌套的形式,也可以使用层次参数跳出多层循环。

     

    流程控制替代语法

    PHP 提供了一些流程控制的替代语法,包括 ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;

    例如:输出99乘法表

     

    文件包含

    在一个PHP文件中,将另一个PHP文件包含进来。

     

    文件包含的作用

    include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

    包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。

     

    文件包含四种形式

    include

    包含并运行指定文件。

    语法

    被包含的文件

     

    include_once

    include_once 表达在脚本执行期间包含并运行指定文件。此行为和 include 表达类似, 唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回 true。

    include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

    require

    require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

    require_once

    require_once 表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

     

    文件加载的原理

     

    PHP代码的执行流程:

    1. 读取代码文件

    2. 编译,将PHP代码转换成字节码(opcode)

    3. zendengine来解析opcode,按照字节码去进行逻辑运算

    4. 转换成对应的HTML代码

     

    文件加载路径

    文件在加载的时候,需要指定文件路径,才能保证PHP正确找到对应的文件

    加载路径分为两类:

    1. 绝对路径: 从磁盘根目录开始——本地绝对路径 从网站根目录就开始——网络绝对路径

    2. 相对路径: 从当前文件所在的目录开始的路径 ./:当前文件夹 ../:上级文件夹

    区别:

    1. 绝对路径相对效率偏低,但是相对安全(路径不会出问题)。

    2. 相对路径相对效率高些,但是容易出错(相对路径会发生改变)

     

    文件嵌套包含

    一个文件包含了另外一个文件,被包含的文件又包含了另外一个文件。

    关于两个相对路径,可以直观的注意上述(二)和(三)相对路径的不同点。有没有./在嵌套包含文件的时候,会有很大的不同!

     

    使用相对路径(当前目录使用./)的注意点:

    相对路径是以某个目录为基准来确定需要包含的文件所在的位置。相对路径的基准目录就是程序执行的入口文件所在的目录,不管包含嵌套多少层。

    例:

    作为入口文件的a.php: require './b/b.php';

    b.php: require './c/c.php'; //请注意这里包含c目录时使用的是./

    那么,注意这里的c.php所在的c目录和b目录是同级的,而并非是c目录在b目录的下面。因为b.php中的包含使用了相对路径,而程序入口是a.php,所以b.php包含使用的相对路径应是以入口文件a.php所在目录来作为基准的。

     

    使用相对路径(当前目录不使用./)的注意点:

    分两步处理,首先以程序入口文件所在目录为基准沿相对路径来寻找,找到存在的文件则包含成功退出(和上述的【相对路径(当前目录使用./)】一样)。如果找不到,则走第二步处理。即在写require语句的php文件所在目录来和require中包含的路径进行拼接,还是以入口文件所在目录为基准,沿这个拼接得到的相对路径来搜寻,文件存在则包含成功,否则表示被包含文件不存在。看例子理解比较容易。

    例:

    作为入口文件的a.php: require './b/b.php';

    b.php: require 'c/c.php'; //请注意这里包含c目录时没有使用./

    那么,首先会在入口文件a.php所在的目录下搜寻c/c.php,如果有,则包含成功。

    如果没找到,接下来就将b.php的所在路径(./b/b.php)和b.php中require的路径(c/c.php)进行拼接,得到拼接后的相对路径./b/c/c.php。在入口文件a.php所在的目录下搜寻./b/c/c.php,存在就包含成功,否则即出错。

     

    函数

    PHP函数是一段代码,可以多次重用。它可以将输入作为参数列表并返回值。

    函数是一种语法结构,将实现某一功能的代码块封装到一个结构中,实现代码的复用。

     

    函数包含:function关键字,函数名,形参,函数体,返回值

    基本语法

    使用函数的目的:实现代码复用,即一个功能一个函数。

    示例:

     

    要写出能经受住时间考验的代码,建议在全局的命名空间中,尽量不要用变量、函数或类名,以避免与其它用户空间代码出现命名空间冲突。

     

    函数的参数

    函数的参数分为两种:形参和实参

    默认值

    default value:指的是形参的默认值,在函数调用时,就给形参进行初始化赋值,如果调用时没有传入参数,那么形参就使用形参定义的值参与运算。

     

    引用传递

    实参在调用时,会将值赋值给形参,这是一种值传递的方式:将实参的值/结果取出来复制个形参,形参与外部的实参没有关联

    引用传值:有时,我们需要在函数内部也能修改实参的值,就需要将实参的内存地址传入。

    定义和使用语法

    例如

    注意:引用传值在传入实参本身时,实参必须是变量。

     

    函数体

    函数体:编程语言中定义一个函数功能的所有代码组成的整体.在函数内部(大括号{}里面)的所有代码都称之为函数体,在函数体内我们可以: 1、定义变量 2、定义常量 3、使用流程控制(分支,循环) 4、调用函数

    函数返回值 返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处):在php中所有的函数都有返回值。(如果没有明确return使用,那么系统默认返回NULL)

    注意:函数的返回值可以是任意数据类型

     

    作用域

    作用域:变量(常量)能够被访问的区域

    1. 变量可以在普通代码中定义

    2. 变量也可以在函数内部定义

    PHP 有函数作用域和全局作用域。在函数之外定义的任何变量都仅限于全局作用域。当包含文件时,该文件中的代码继承了包含语句所在行的变量作用域。

     

    如果函数内部使用全局变量,除了使用$GLOBALS外,还可以使用引用传值的方式。

     

    在PHP中,还有一种方式可以实现全局访问局部,局部访问全局:global关键字。

    global关键字:在函数里面定义变量的一种方式。

     

    静态变量

    静态变量(static):实在函数内部定义的变量,使用static关键字进行修饰,用来实现跨函数(同一个函数被多次调用)共享数据的变量。

    在 PHP 8.3.0 之前,静态变量只能使用常量表达式进行初始化。自 PHP 8.3.0 起,还允许使用动态表达式(例如函数调用)

    静态变量的作用:

     

    可变函数

    当前有一个变量所保存的值,刚好是另一个函数的名字,那么就可以使用"变量()",来充当函数名使用

    可变函数完整说明:PHP: 可变函数 - Manual

     

    匿名函数

    匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数。最经常用作回调函数 callable参数的值。

    语法

    示例 #1 匿名函数示例

    示例 #2 匿名函数变量赋值示例

     

    闭包

    在 PHP 中,闭包(Closure)是指一种可以捕获周围作用域中变量的匿名函数。闭包通常用于将函数作为变量传递或作为回调使用,它们在创建时能够“封闭”变量的值,使这些值在函数内部可以被访问。

    闭包是通过 function 关键字创建的匿名函数,且在 PHP 5.3.0 及之后被引入。

    闭包的特点:

    1. 匿名函数:闭包通常没有名字,直接以变量的形式被赋值或使用。

    2. 捕获外部变量:闭包可以通过 use 关键字捕获外部变量,使它们在闭包中可用。

    3. 可以作为参数或返回值:闭包经常用作回调函数。

     

    闭包可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。 PHP 7.1 起,不能传入此类变量: superglobals、 $this 或者和参数重名。 返回类型声明必须放在 use 子句的 后面 。

     

    伪类型(了解)

    在 PHP 中,伪类型(Pseudo-types)是用来描述函数参数和返回值的特定数据类型的概念。它们不是 PHP 的实际数据类型,而是为了便于理解和描述函数行为而使用的术语。伪类型通常用于 PHP 文档中。

    以下是 PHP 中常见的伪类型及其含义:


    1. mixed

    表示函数参数或返回值可以是多种类型。


    1. number

    表示可以是 intfloat 类型的值。


    1. callback

    表示一个可调用的类型,可以是:


    1. array|object

    表示参数或返回值可以是数组或对象。


    1. void

    表示函数不返回任何值。


    1. bool

    表示布尔值类型,可以是 truefalse


    1. truefalse

    表示函数仅返回 truefalse(特定值)。


    1. null

    表示函数返回 null 或参数可以为 null


    1. resource

    表示一个资源类型值,比如文件句柄、数据库连接等。


    1. iterable

    表示可以被遍历的类型,包括数组和实现了 Traversable 接口的对象。


    1. object

    表示参数或返回值必须是对象类型。


    总结

    PHP 伪类型是用于文档和描述中的术语,帮助开发者更好地理解参数和返回值的含义。PHP 语言中,有些伪类型(如 mixedvoid)已经被支持为实际的类型声明,而其他的(如 callbackresource)主要用于描述代码行为。

     

     

    系统常用函数

    输出函数

    print()

    print — 输出字符串

    print 不是函数而是语言结构。它的参数是跟在 print 关键字后面的表达式,并且不用括号分割。

    和 echo最主要的区别是 print 仅接受一个参数,并始终返回 1

    示例:

    print_r()

    print_r — 打印人类可读的变量信息

    类似于var_dump,比var_dump简单,只会输出值(打印数组用的多),不会输出数据类型。

    时间函数

    date()

    按照指定格式对对应的时间戳进行格式转换

    time()

    获取当前时间戳

    microtime()

    获取微秒级的时间戳

     

    数学函数

    max()

    找到参数值中的最大值

    示例

     

    min()

    找到参数值中的最小值

    使用方法和max类似

     

    rand()

    获取一个随机数

    语法:

    返回值:介于 min (或是 0)和 max (或 getrandmax(),包含该值)之间的伪随机值。

     

    mt_rand()

    获取一个随机数,与rand()一样,效率更高(mt_rand() 函数是旧的 rand() 的临时替代。该函数用了» 梅森旋转中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。)

    通过梅森旋转(Mersenne Twister)随机数生成器生成随机值

    返回 min(或者 0)到 max(或者是到 mt_getrandmax(),包含这个值)之间的随机整数,如果 max 小于 min 则返回 false。

     

    round()

    round — 对浮点数进行四舍五入

    参数解释

    num

    要处理的值。

    precision

    可选的十进制小数点后数字的数目。

    如果 precision 是正数,则 num 会四舍五入到小数点后 precision 位有效数字。

    如果 precision 是负数,则 num 四舍五入到小数点前 precision 位有效数字。即 pow(10, -$precision) 最接近的倍数,例如,precision 为 -1,num 可以四舍五入到十位,precision 为 -2,num 可以四舍五入到百位,等等。

    mode

    使用以下常量指定四舍五入发生的模式。

    常量说明
    PHP_ROUND_HALF_UPnum 恰好处于中间时,将其向远离零的方向舍入,使 1.5 变为 2,-1.5 变为 -2。
    PHP_ROUND_HALF_DOWNnum 恰好处于中间时,将其向靠近零的方向舍入,使 1.5 变为 1,-1.5 变为 -1。
    PHP_ROUND_HALF_EVENnum 四舍五入到最接近的偶数值,1.5 和 2.5 都变为 2。
    PHP_ROUND_HALF_ODDnum 四舍五入到最接近的奇数值,1.5 变为 1,2.5 变为 3。

     

    ceil()

    向上取整

    返回不小于 num 的下一个整数。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 int 要大。

     

    floor()

    对 num 向下取整。floor() 返回的类型仍然是 float。

     

    pow()

    求指定数字的指定指数次的结果

    返回 numexponent 次方的幂。

     

    abs()

    求绝对值

    示例

     

    sqrt()

    求平方根

    返回 num 的平方根,负数时返回 NAN

     

    有关函数的函数

    function_exists()

    function_exists — 如果给定的函数已经被定义就返回 true

    在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找 function。如果 function 存在且的确是一个函数就返回 true,反之则返回 false

    示例

     

    func_get_arg()

    func_get_arg — 返回参数列表的某一项

    从用户自定义函数的参数列表中获取某个指定的参数。

    返回指定的参数,错误则返回 false

     

    fun_get_args()

    func_get_args — 返回一个包含函数参数列表的数组,获取函数参数列表的数组。

    示例

     

    fun_num_args()

    返回传递给函数的参数数量

    示例

     

    错误处理

    在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。

     

    错误报告级别

    这些都是已经被定义的系统常量,可以直接使用。

    常量描述
    1E_ERROR致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。
    2E_WARNING非致命的 run-time 错误。不暂停脚本执行。
    4E_PARSE编译时解析错误。解析错误只由解析器产生。
    8E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
    16E_CORE_ERROR在 PHP 初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由 PHP 引擎核心产生。
    32E_CORE_WARNINGPHP 初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由 PHP 引擎核心产生。
    64E_COMPILE_ERROR致命编译时错误。类似 E_ERROR,但是是由 Zend 脚本引擎产生。
    128E_COMPILE_WARNING编译时警告 (非致命错误)。类似 E_WARNING,但是是由 Zend 脚本引擎产生。
    256E_USER_ERROR致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
    警告:自 PHP 8.4.0 起,已弃用此常量与 trigger_error() 一起使用的用法。建议改为 throw Exception 或调用 exit()。
    512E_USER_WARNING非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
    1024E_USER_NOTICE用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
    16384E_USER_DEPRECATED用户产生的警告信息。 类似 E_DEPRECATED, 由用户自己在代码中使用 PHP 函数 trigger_error() 来产生。
    4096E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
    8191E_ALL所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)

     

    错误显示设置

    方式一:修改php.ini配置

    打开php.ini文件,设置 display_errors = On

     

    方式二:添加下方代码:

    error_reporting最常见的几种设置:

     

    错误日志设置

    对于PHP开发者来 说,一旦某个项目投入使用,应该立即将 display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。

    但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?

    我们可以在单独的文本文件中将错误报告作为日志记录。

    错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。

    如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。

    错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中 或发送给系统syslog,分别介绍如下:

     

    php.ini相关设置说明:

     

    自定义错误处理

    trigger_error

    产生一个用户级别的 error/warning/notice 信息

    用于触发一个用户级别的错误条件,它能结合内置的错误处理器所关联,或者可以使用用户定义的函数作为新的错误处理程序(set_error_handler())。

    参数

    警告:现已弃用传递 E_USER_ERROR 作为 error_level。抛出 Exception 或调用 exit()。

     

    set_error_handler

    设置用户自定义的错误处理函数

    设置用户的函数 (callback) 来处理脚本中出现的错误。

    本函数可用于在运行时定义自定义错误处理程序,例如,在应用程序中发生严重错误,或者在特定条件下触发了错误(使用 trigger_error()),应用程序需要执行文件/数据清理。

    重要的是要记住 error_levels 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 false。 error_reporting() 设置将不会起到作用而继续会调用错误处理函数 —— 不过仍然可以获取 error_reporting 的当前值,并做适当处理。

    同时注意,处理程序有责任在必要时使用 exit() 停止脚本执行。 如果错误处理程序返回了,脚本将会在发生错误的后一行继续执行。

    以下级别的错误不能由用户定义的函数来处理,独立于发生错误的地方: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

    set_error_handler()函数可以定义自定义的错误处理函数。以下是一个简单的示例:

    相关参数解释

    示例 #1 用 set_error_handler() 和 trigger_error() 进行错误处理

     

    字符串

    PHP: String 字符串 - Manual

    字符串语法

    一个字符串可以用 4 种方式表达:

     

    字符串函数

    PHP: 字符串 函数 - Manual

    字符串函数有很多,下面介绍几个常用的函数,详细见上方链接

    字符串长度

     

    转换函数
    截取函数

     

    大小写转换函数

     

    查找函数

     

    替代函数

     

    格式化函数

     

    其他函数

    数组

    PHP: 数组 - Manual

    数组:array,指将一组数据存储到一个指定的容器中,用变量指向该容器,然后通过变量一次性得到该容器中所有的数据。

    PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。

     

    数组的定义

    1. 使用array关键字:(最常用)

    2. 使用[] 包裹数据

    3. 隐式定义

      如果[]中的值不指定,默认从0开始自增。

      如果手动指定了值,那么后面自增元素下标从指定的最大值+1开始。

      特殊值下标(Boolean,Null)会自动转换。

     

    在PHP中,数组元素类型没有限制。

    在PHP中,数组元素长度没有限制。

     

    多维数组

    在多维数组中,主数组中的每一个元素也可以是一个数组,子数组中的每一个元素也可以是一个数组。

    一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组,依照这种方式,我们可以创建二维或者三维数组。

     

    二维数组是常用的多维数组

    二维数组语法格式:

     

    数组遍历

    遍历并输出索引数组的所有值,可以使用 for 循环

    示例:

    也可以使用foreach进行遍历

    数组函数

    排序函数
    指针函数

    示例:

     

    其他函数

     

    数据库

    数据库相关操作,请参考《MySQL学习笔记》部分。

     

    PHP高级

    表单传值

    PHP 一个很有用的特点体现在它处理 PHP 表单的方式。需要理解的非常重要的原理,是表单的任何元素都在 PHP 脚本中自动生效。

    表单传值即浏览器通过表单元素将用户选择或输入的数据提交到服务器后台。

     

    表单传值方式

     

    GET和POST的区别

    1. Get传输的数据主要用来获取数据,不改变服务器上资源:get只是用来获取内容

    2. Post传输的数据主要用来增加数据,改变服务器上资源:POST会改变服务器上数据内

    3. 传输方式上post必须使用form表单,而get可以使用form表单和uRL

    4. get传输数据可以在URL中对外可见,而post不可见:GET传值最终会在浏览器的地址栏中全部显示:?数据名=数据值&数据名2=数据值2

    5. get和post能传输的数据大小不同,get为2K,post理论无限制

     

    PHP接受表单数据

    PHP 中的 $GET 和 $POST 变量用于检索表单中的信息

    PHP接收数据的三种方式

    $GET方式:接收GET方式提交的数据 $POST方式:接收POST方式提交的数据 $REQUEST方式:接收POST或者GET提交的所有数据 1)$REQUEST所存储数据的内容 2)$REQUEST和$POST与$_GET的联系

    示例:

    提交数据html表单

    PHP页面代码

     

    复选框数据处理

    复选框命名方式

    解决方式: 浏览器不会识别[],而在PHP中[]会被识别成数组形式

    示例

    PHP接收到数据后,会自动组合同名元素为数组。

     

    复选框数据处理方式

     

    文件上传

    原理

    文件从用户本地电脑通过传输方式(web表单),保存到服务器知道目录

    实现

    1. 新增文件上传表单,浏览器请求一个服务i其的HTML脚本(含有文件上传表单)

    2. 用户从本地选择一个文件

    3. 用户点击上传:文件通过互联网传输到服务器

    4. 服务器操作系统将文件存到临时文件夹。

    5. 服务器脚本判断文件的有效性。

    6. 服务器脚本将有效文件从临时文件夹移动到指定文件夹下

     

    文件上传表单

    描述
    application/x-www-form-urlencoded默认。所有字符在发送前都会被编码。空格会转换为“+”符号,特殊字符会转换为 ASCII 十六进制值。
    multipart/form-data不对字符编码。如果用户将通过表单上传文件,则此值是必需的。
    text/plain发送数据时完全不进行任何编码。不建议使用。

     

    保存上传的文件

    将上传的临时文件移动到目标位置

    1. 判断是否为上传的文件:is_uploaded_file()

    2. 移动文件:move_uploade_file()

     

    实现步骤

    1. 取得文件信息

    2. 判断是否是上传的文件(临时文件) 2.1 是上传的文件,移动文件 2.2 不是上传的文件,显示错误信息

    3. 移动文件

    示例代码

     

     

    多文件上传

    在HTML5中有一个新属性multiple,添加这一属性后,可以上传多个文件

    文件上传到服务器后,会以数组形式存储在$_FILES

    通过遍历方式处理文件,对文件进行操作等。

     

    Mysql扩展

    数据库连接操作

     

    数据库操作

    准备数据库表

     

     

    数据库函数

    数据库扩展相关函数参照手册PHP: MySQL - Manual

     

    HTTP协议

    HTTP介绍

    HTTP概述

    超文本传输协议(HTTP)是一个用于传输超媒体文档(例如 HTML)的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型,客户端打开一个连接以发出请求,然后等待直到收到服务器端响应。HTTP 是无状态协议,这意味着服务器不会在两个请求之间保留任何数据(状态)。

    HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

    尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。

    通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

     

    HTTP特点

     

    HTTP请求方式及特点

    GET

    POST

    PUT

    PATCH

    DELETE

    HEAD

    OPTIONS

     

    HTTP请求

     

    HTTP响应

    常见的 HTTP 状态码:

     

    常见的HTTP响应设置

    PHP中针对HTTP协议(响应)进行了底层设计,可以通过函数header来实现修改HTTP响应头信息

    常见设置

    注意!

     

    利用CURL扩展模拟HTTP访问

    连接示例

     

    文件编程

    指使用PHP代码对文件(文件夹)进行增删改查操作

    例如:在实际开发中,有很多内容(如:文件上传,配置文件等),不能再一开始就全部手动创建,会根据实际需求和数据本身进行创建和管理。此时就需要使用PHP文件编程来实现文件批量管理等操作。

     

    文件操作类型

     

    目录操作

     

    递归遍历目录

     

    文件操作

    文件相关函数

    PHP: 文件系统 - Manual

     

    打开、关闭文件

    如果尝试打开文件失败,则 fopen() 返回值 false ,否则返回文件指针,该指针用于进一步读取或写入到该文件。

    对打开的文件进行更改之后,使用 fclose()函数将其关闭很重要。 fclose()函数需要文件指针作为其参数,然后在关闭成功时返回 true ,如果失败则返回 false 。

     

    读取文件

    使用 fopen()函数打开文件后,可以使用 fread()的函数读取该文件,此函数需要两个参数,这些必须是文件指针,文件的长度以字节为单位。

    可以使用 filesize()函数找到文件长度,该函数将文件名作为其参数,并返回以字节为单位的文件大小。

    因此,这是使用PHP读取文件所需的步骤。

     

    写入文件

    使用PHP fwrite()函数可以编写新文件或将文本附加到现有文件中,该函数需要两个参数来指定文件指针和要写入的数据字符串。

    在以写入模式打开文件后,我们可以使用fwrite()来添加内容:

    如果你想要向现有文件末尾添加内容而不覆盖其内容,请使用追加模式:

    对于快速写入或追加到文件的快捷方式,file_put_contents()

    FILE_APPEND标志告诉PHP将内容添加到文件的末尾而不是覆盖它。

     

    文件下载

    从服务器将文件通过HTTP协议传输到浏览器,浏览器不解析,将其以文件的形式保存到本地

    文件下载可以使用a标签,但是a标签下载方式有缺点

    1. a标签能够让浏览器自动下载的内容有限,当浏览器发现解析不了时,才会进行下载

    2. a标签会暴露存储路径,暴露服务器存储数据的位置,会引发安全问题

     

    PHP下载

    读取文件内容,以文件流的形式传递给服务器,在响应头中设置浏览器不解析,激活下载框实现文件下载

    1. 指定浏览器解析的字符集

    2. 设置响应头

      • 设置文件返回类型

      • 设置返回的文件计算方式

      • 设置下载提示

      • 设置文件大小

    3. 读取文件

    4. 输出文件

      • 如果文件较小,可以直接使用file_get_contents(file)进行输出

         

      • 文件过大或网络资源不足时,可以使用下面的方式

         

     

     

    会话技术

    会话技术介绍

    web会话可以简单理解为:用户打开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

    HTTP协议的特点是无状态/无连接,当一个浏览器连续多次请求同一个web服务器时,服务器是无法区分多个操作是否来自于同一个浏览器(用户)。会话技术就是通过HTTP协议想办法让服务器能够识别来自同一个浏览器的多次请求,从而方便浏览器(用户)在访问同一个网站的多次操作中,能够持续进行而不需要进行额外的身份验证。

     

    会话技术分类

    1. cookie技术 cookie技术是在HTTP协议下,服务器或脚本可以维持客户工作站上信息的一种方式,cookie是由Web服务器保存在用户浏览器(客户端)上的小文本文件(HTTP协议响应头),它可以包含有关用户的信息。无论何时用户链接到服务器,Web站点都可以访问cookie信息。

    1. session技术 session直接翻译成中文比较困难,一般都翻译成时域,在计算机专业术语中,session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经历的时间。以及如果需要的话,可能还有一定的操作空间。session技术是将数据保存到服务器端,无论何时用户链接到服务器,Web站点都可以访问session信息。session技术的实现是依赖cookie技术的。

    2. 两种会话技术的区别

      • 安全性方面: session存储在服务器端,安全性高 cookie存储在浏览器端,安全性低

      • 数据大小方面 session数据存储不限 cookie的数量和大小都有限制(一个网站最多20个cookie,长度最多4k)

      • 可用数据类型 session 可以存复杂数据(自动序列化) cookie只能存储简单数据,数值或字符串

     

     

    COOKIE原理

    Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。

    客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

    img

    1. 客户端请求服务器 客户端请求IT笔录网站首页,请求头如下: GET / HTTP/1.0 HOST:itbilu.com

    2. 服务器响应请求 Cookie是一种key=value形式的字符串,服务器需要记录这个客户端请求的状态,因此在响应头中包一个Set-Cookie字段。响应头如下:

    HTTP/1.0 200 OK

    Set-Cookie:UserID=itbilu; Max-Age=3600; Version=1

    Content-type:text/html

    ……

    1. 再次请求时,客户端请求中会包含一个Cookie请求头 客户端会对服务器响应的Set-Cookie头信息进行存储。再次请求时,将会在请求头中包含服务器响应的Cookie信息。请求头如下 GET / HTTP/1.0 HOST:itbilu.com Cookie:UserID=itbilu

     

    PHP实现COOKIE

     

    COOKIE生命周期

    Cookie 的生命周期取决于是否设置了过期时间:

    设置COOKIE过期时间

    使用setcookie函数的第三个参数设置,参数传入一个时间戳

     

    COOKIE作用范围

    同一个浏览器,同一个路径下cookie可以共享。如果上级路径想要访问,则设置path属性,如document.cookie = "key=value;path=/";设置整站都可以访问。如果设置不同的二级域名也可以访问(如pan.baidu.com,zhidao.baidu.com),则添加domin属性,如,document.cookie = "key=value;path=/;domain=baidu.com"

    默认,子目录可以访问父目录COOKIE,父目录无法访问子目录COOKIE

     

    Session

    PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。

    原理
    1. 当PHP碰到session_start()时开启session会话,会检测sessionID

      • 如果ID存在,就是用

      • 如果ID不存在,就创建一个sessionID,并通过响应头的形式保存到浏览器

    2. 初始化超全局变量$session

    3. PHP通过sessionID去指定位置(session文件储存),匹配相应的文件

      • 如果文件不存在,创建一个sessionID命名的文件

      • 如果文件存在,读取文件内容,将数据存储到$session

    4. 脚本执行结束,将$session中保存的所有数据序列化到sessionID对应的文件中

     

    基本使用

    启用session,脚本使用到$_session就需要开启一次

     

    删除数据

    删除session就是将session数据清理 如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。

    相关配置文件

     

    配置的形式

     

    垃圾回收

    在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出。 GC的工作就是扫描所有的Session信息,用当前时间减去session最后修改的时间,同session.gc_maxlifetime参数进行比较,如果生存时间超过gc_maxlifetime(默认24分钟),就将该session删除。

    session会话技术后,session文件并不会自动清除,如果每天有大量session文件产生但是又都是失效的,会增加服务器的压力和影响session效率。

    垃圾回收,是指session机制提供了一种解决垃圾session文件的方式:给session文件指定周期,通过session文件最后更改时间与生命周期进行结合判定,如果已经过期则删除对应的session文件,如果没有过期则保留。这样就可以及时清理无效的僵尸文件,从而提升空间利用率和session工作效率。

    垃圾回收程序启动机制

     

    相关配置参数

     

     

    禁用COOKIE后如何使用SESSION

    Session是服务器端的一种技术,服务器为每个浏览器开辟一块内存空间,即Session对象。当服务器端调用request.getSession()时,会创建一个Session对象,同时生成一个Session ID(代表唯一Session的字符串)。服务器会自动通过Cookie的方式将Session ID写给浏览器。当浏览器下次携带Cookie(包括Session ID)访问时,服务器会根据Session ID找到对应的Session对象,从而识别出用户的会话。 如果用户禁用了Cookie,服务器将无法通过Cookie将Session ID发送给浏览器,浏览器也无法在后续请求中携带Session ID返回给服务器。这将导致服务器无法识别用户的会话,因此Session将无法正常工作。

    然而,禁用Cookie后,我们仍然可以通过一些方法使用Session。

    总结起来,如果禁用了Cookie,Session将无法正常工作。但通过URL重写或使用其他客户端存储机制,我们可以解决这个问题。在实际应用中,我们应该考虑到用户可能禁用了Cookie的情况,并采取相应的措施来确保Session的正常使用。

     

    GD图像处理

    PHP: GD - Manual

    GD 库是 php 处理图形的扩展库,GD 库提供了一系列用来处理图片的 API ,使用 GD 库可以处理图片,或者生成图片,也可以给图片加水印。在网站上 GD 库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站数据生成报表等。

    基本使用

    画图的基本流程

    画图的本质就是在内存中开辟一块较大的内存区域用作图片制作

    php.ini 配置文件中开启 GD 扩展即可使用

     

     

    完整代码

     

    案例:图片验证码

    验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写。它是一种常见的在线验证机制,用于确保用户是真正的人而不是机器人。验证码通常由图像或声音组成,要求用户输入正确的答案,以证明其是真实用户。

    实现的功能

    实现代码示例

    生成验证码

    在浏览器展示验证码并实现点击刷新

     

    案例:缩略图

    制作图片缩略图的原理 缩略图:通过原图得到一个较小的图(尺寸上) 缩略图原理:将原图打开,然后放到另一个较小的图片资源中,最后进行保存。

     

    实现固定宽高的缩略图 a. 得到一张原图资源 b. 得到一个缩略图资源(较小) c. 图片采样复制:GD提供了一个函数 d. 保存缩略图 e. 销毁所有资源(原图和缩略图)

     

    示例代码(固定宽高)

     

    示例代码(等比例缩放)

     

     

    案例:水印图

    水印图概念 照片水印主要指的是现代的数字照片上面留下的一些logo、信息、网址什么的,比如图像,声音,视频信号等等在里面加了一些数字信息,这样是为了版权保护,当然加入水印也是不能影响原始文件的可读性以及观瞻的,水印具有以下几个特征,首先是证明各位是这个照片的原始主人,或者有的商家为了做宣传用,也会在照片上增加自己的网址,品牌名字等等。

    使用图片作水印 制作图片水印图原理:将一个带有明显标志的图片放到另外一张需要处理的图片之上 制作流程: a. 获得原图资源 b. 获取水印图资源 c. 合并图片(把水印图合到目标图上) d. 保存输出 e. 清除资源

     

     

    基本实现代码示例

     

    封装实现多位置制作水印

     

    结束

    本教程到此结束!

    感谢使用。

    教程文档字数:约36200字