关于php以及web开发的基础知识
- 1.PHP是什么
- 2.CGI
- 3.CGI程序的工作方式
- 4.FastCGI
- 5.PHP-FPM
- 6.PHP-FPM的作用
- 7.php工作流程
- 8.udp和tcp的区别(个人学习总结并不完整)
- 9.udp与tcp的应用场景
- 10.HTTP协议与HTTPS的区别
- 11.echo、print、print_r 的区别
- 12.session和cookie的区别
- 13.对于大流量网站,采用什么方法解决访问量问题?
- 14.获取客户端与服务器端ip
- 15.语句include和require的区别
- 16.http请求返回状态码
- 17.有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
- 18.PHP中error_reporting的作用
- 19.面向对象编程的三个特性
- 20.防止SQL注入
- 21.实现中文字串截取无乱码的方法
- 22.请举例说明在你的开发过程中用什么方法来加快页面的加载速度
- 23.is_writeable作用
- 24.php的数据类型
- 25.如何在PHP中定义常量
- 26.MVC模式
- 27.试述isset()和empty()的区别
- 28.php常见的设计模式
- 29.session的运行机制
- 30.Cookie的原理及使用
- 31.三次握手(three-way handshaking)
- 32.四次挥手(Four-Way-Wavehand)
- 33.apache和niginx的区别
- 34.常用魔术方法
- 35.抽象类和接口
1.PHP是什么
php中文全称’超文本预处理器’,是服务器端动态脚本语言,相对于java来说是一种弱类型的语言
2.CGI
CGI:通用网关接口(Common Gateway Interface),是Web 服务器和请求处理程序之间传输数据的一种标准或协议,只要遵循这个标准就可以用任何动态语言实现处理程序.
通常所说的CGI是指CGI程序,即实现了CGI接口标准的程序.
3.CGI程序的工作方式
Web服务器一般只处理静态文件请求(如 jpg、htm、html),如果碰到一个动态脚本请求(如php),web服务器主进程,就派生出一个新的进程来启动CGI程序,也就是将动态脚本请求交给CGI程序来处理。启动CGI程序需要一个过程,比如,读取配置文件,加载扩展等。CGI程序启动后,就会解析动态脚本,然后将结果返回给Web服务器,最后Web服务器再将结果返回给客户端,刚才派生的进程也会随之关闭。
这样,每次用户请求动态脚本,Web服务器都要重新派生一个新进程,去启动CGI程序,由CGI程序来处理动态脚本,处理完后进程随之关闭。
这种工作方式的效率是非常低下的。
4.FastCGI
FastCGI是cgi的升级模式,它将CGI解释器进程保持在内存中并因此获得高效的性能。
FastCGI进程管理器需要单独启动,启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。
当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。
5.PHP-FPM
PHP-FPM,FastCGI进程管理器(FastCGI Process Manager),提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置等。
php-fpm作为一种fast-cgi进程管理服务,会监听端口,一般默认监听9000端口,并且是监听本机.
6.PHP-FPM的作用
php-fpm用于接收和处理辣子web服务器(如nginx)的请求,当它接到请求后创建一个主进程(通常以操作系统中跟用户的身份运行),控制何时以及如何把http请求转发给一个或多个子进程处理.
php-fpm还控制着什么时候创建(处理web应用更多的流量)和销毁(子进程运行时间太久或不在需要了)php子进程.php-fpm进程池中的每个进程存在的时间都比单个http请求长,可以处理10,50,100,500或更多的http请求(在php的配置文件中进行修改)
7.php工作流程
- 在浏览器中输入url,回车向服务器发送请求.
- 服务器接收请求进行判断.一下部分在cgi的工作流程中有提到过,如果请求的是静态资源如htm,jpg等由服务器直接返回,如果是请求的是php请求那么将请求转发给php-fpm.
- php-fpm再将请求交给嵌入了php解释器的某个php子进程处理,php进程找到相应的php脚本后,读取脚本,吧php脚本编译成操作码(或字节码)格式,然后执行编译得到的操作码,动态生成相应
- 把http响应发给niginx或apache服务器返回客户端
- 客户端浏览器渲染结果
以上流程是我不断补充的结果,个人认为相对于其他描述来说更为详细,比如更大多数人将第3部描述为"php解析脚本"
该流程可概述为:
浏览器发送请求 ->
服务器端判断返回静态资源或转发给php解释器 ->
php解释器生成相应 ->
客户端渲染结果
8.udp和tcp的区别(个人学习总结并不完整)
udp :
用户数据报协议 ,udp信息在ip头的后面,有头部,端口号,DATA,
在udp的头部中包括了校验和 , 用于检查数据是否正确,检查的方式是把数据进行求和进行对比,如"89,11,33,32,58,41"求和得到364,而heard头里面同样存储了校验和364.
udp中的校验和以16位形式机型存储,如果超过了可以表示的最大值,那么高位数被丢掉,保留低位
当对方接到数据包,重复求和的操作,如果双方得到一致的结果,那么数据正确,如果不一致那么说明数据不完整
udp无法得知数据是否到达,而且不修复,一旦发现接到的数据存在问题则直接丢掉
tcp:
由上我们得知udp的传输不保证数据的完整性,而tcp/ip可以认为是udp的高级形式
tcp发送的数据包有序列号
tcp要求接收方接到并且校验后给发送方一个确认码代表收到 ,确认码简称ACK,得知上一个到达发送下一个,如果么有收到确认码则再次发送
可能存在特殊的情况,如确认码可能很久以后才到达或在传输过程中丢失了,tcp在收到重复的确认码时会删掉 (这一段笔记只记录了关键字但是因为时间关系印象模糊了,后续会返回去再找找) ,tcp可以并发
确认码的成功率和来回的时间可以用于推测网路拥塞
tcp用这个调整同时发送的包的数量,解决拥塞的问题
tcp可以处理乱序和数据包丢失问题,丢了就重发,还可以根据网络拥挤情况自动调整传输率
由上我们可以得出一般讲解中的udp与tcp的区别
-
udp无连接,tcp面向连接
-
UDP程序结构较简单
-
UDP具有较好的实时性,工作效率比TCP高
-
流模式(TCP)与数据报模式(UDP);
-
TCP比UDP更安全,TCP保证数据正确性,UDP可能丢包
-
TCP保证数据顺序,UDP不保证
9.udp与tcp的应用场景
udp:
因为不保证数据的准确到达,所以应用的对数据完整性要求较低的场景 如果直播,语音,视频通话
. 我们经常在视频通话的过程中发现视频的清晰度忽然降低一般就是因为有一些数据丢失造成的
TCP:
因为安全性可靠数据完整,用于文件的传输 等等
10.HTTP协议与HTTPS的区别
- http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议
- http和https使用的是完全不同的连接方式,端口也不一样,前者80 或者443
- http连接很简单,是无状态的。https协议是由ssl+http协议构建的可进行加密传输,身份认证的网络协议。
11.echo、print、print_r 的区别
echo是php语句,无返回值.
priint,priint_r是函数,有返回值
print() 只能打印出简单类型变量的值
print_r() 可以打印出复杂类型的变量值(如数组,对象)
echo 输出一个或多个字符串
12.session和cookie的区别
session与cookie相同:跨页面不夸用户,
session与cookie不相同:
1.session可以存储任意类型的数据,但cookie只能存储字符串
2.cookie生产在服务端、存储在客户端
session产生在服务单、存储在服务端
13.对于大流量网站,采用什么方法解决访问量问题?
- 确认服务器的硬件是否足够支持当前的流量
- 优化数据库的访问
- 禁止外部的盗链
- 控制大文件的下载
- 使用不同主机分流主要流量
- 使用流量分析统计软件
14.获取客户端与服务器端ip
$_SERVER[‘REMOTE_ADDR’]:浏览当前页面的用户计算机的ip地址 //无代理情况下
$_SERVER[‘HTTP_X_FORWARDED_FOR’]:客户端的ip //有代理情况下
$_SERVER[‘HTTP_CLIENT_IP’]:客户端的ip
15.语句include和require的区别
除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。
require不能用在文件的中间
16.http请求返回状态码
4xx - 客户端错误
发生错误,客户端似乎有问题。
例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。
5xx - 服务器错误
服务器由于遇到错误而不能完成该请求。
400 请求无效
401 未授权
403 请求被禁止
404 请求资源不存在
405 请求资源被禁止
406 无法接受
407 要求代理身份验证
500 Internal Server Error 服务端源代码错误
600 源站没有返回响应头部,只返回实现内容
17.有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
echo file_get_contents(“http://www.phpres.com/index.html”);
18.PHP中error_reporting的作用
设置错误级别与错误信息回报
19.面向对象编程的三个特性
封装、继承、多态
20.防止SQL注入
- 一般使用 addslashes 函数
addslashes 函数在制定的预定义字符前添加反斜杠 - 对字段和密码MD5加密处理
- pdo预处理过滤处理
21.实现中文字串截取无乱码的方法
mb_substr()
22.请举例说明在你的开发过程中用什么方法来加快页面的加载速度
1 要用到服务器资源时才打开
2 及时关闭服务器资源,
3 数据库添加索引,
4 页面可生成静态,图片等大文件单独服务器。
5 使用代码优化工具啦
23.is_writeable作用
判断一个文件是否可写
24.php的数据类型
1.标量类型:string , int , boolean , float
2.复合类型:array . object
3.特殊类型:resource , null
25.如何在PHP中定义常量
define (“Newconstant”, 30);
26.MVC模式
MVC由Model(模型), View(视图)和Controller(控制器)组成
Model:数据信息存取层。
View:view层负责将应用的数据以特定的方式展现在界面上。
Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
27.试述isset()和empty()的区别
isset() 测试变量是否存在 empty() 测试变量是否为空
28.php常见的设计模式
-
单例模式: 保证一个类仅有一个实例,并提供一个访问他的全局访问点例如框架中的数据库连接
-
简单工厂模式: 它具有创建对象的某些方法,可以使用工厂类创建对象,而不直接使用 new。例如初始化数据库的时候会用到,比如MySQL,MSSQL
-
策略模式: 针对一组算法,将每一个算法封装到具有共同接口的独立的类中,例如进入个人主页时,根据浏览者的不同,给予不同的显示与操作
-
注册模式: 提供了在程序中有条理的存放并管理一组全局对象 (object),例如ZF框架中的Zend_Registry::set
-
适配器模式: 将不同接口适配成统一的API接口,例如数据操作有mysql、mysqli、pdo等,可利用适配器模式统一接口
-
观察者模式: 一个对象通过添加一个方法使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。例如实现实现消息推送
-
装饰器模式: 不修改原类代码和继承的情况下动态扩展类的功能,例如框架的每个Controller文件会提供before和after方法
-
迭代器模式: 提供一个方法顺序访问一个聚合对象中各个元素,在PHP中将继承 Iterator 类
-
原型模式: 实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。
29.session的运行机制
session创建时,是否会在服务端记录一个cookie?cookie里面的内容是什么?
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。_
保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。一般这个cookie的名字都是类似于SEEESIONID。r
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://……/xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764比
另一种是作为查询字符串附加在URL后面,表现形式为http://……/xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764参
为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个SEEESIONID。
30.Cookie的原理及使用
Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着HTTP头发送到服务器端。在Cookie生效之后及失效之前,客户每次发出页面请求的时候(包括PHP页面和静态html页面),都会把Cookie一块发送到服务器,只要我们针对它进行相应的处理,就可以实现变量”追随”。
31.三次握手(three-way handshaking)
原理:
-
发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
-
接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
-
最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。
通俗的说法
-
Client:嘿,李四,是我,听到了吗?
-
Server:我听到了,你能听到我的吗?
-
Client:好的,我们互相都能听到对方的话,我们的通信可以开始了。
32.四次挥手(Four-Way-Wavehand)
-
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
-
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
-
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
-
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
通俗的说法
-
Client:我所有东西都说完了
-
Server:我已经全部听到了,但是等等我,我还没说完
-
Server:好了,我已经说完了
-
Client:好的,那我们的通信结束l
33.apache和niginx的区别
apache :
-
apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
-
apache 发展到现在,模块超多,基本想到的都可以找到
-
apache 更为成熟,少 bug ,nginx 的 bug 相对较多
-
apache 超稳定
-
apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
-
apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
-
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区
niginx:
-
轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源
-
抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
-
nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
-
nginx 的设计高度模块化,编写模块相对简单
-
nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
-
nginx 作为负载均衡服务器,支持 7 层负载均衡
-
nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
-
启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
34.常用魔术方法
- __construct、__destruct
__construct 构造方法,当一个对象被创建时调用此方法,好处是可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么,这样你在改变类的名称时,就不需要改变构造方法的名称
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用.,在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。
- __get、__set
这两个方法是为在类和他们的父类中没有声明的属性而设计的
__get( $property ) 当调用一个未定义的属性时访问此方法
__set( $property, $value ) 给一个未定义的属性赋值时调用
- __isset、__unset
__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
与__get方法和__set方法相同,这里的没有声明包括访问控制为proteced,private的属性(即没有权限访问的属性)
- __call
__call( $method, $arg_array ) 当调用一个未定义(包括没有权限访问)的方法是调用此方法
- __callStatic
它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。
- __autoload
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一机会加载所需的类。
原文链接:https://blog.csdn.net/a_jie_2016_05/article/details/88554615
35.抽象类和接口
- 抽象类中可以有非抽象的方法而接口中只能够有抽象的方法!
- 一个类可以继承多个接口,而一个类只能继承一个抽象类!
- 接口的使用方式通过implements关键字进行,抽象类则是通过继承extends关键字进行!
- 接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另Java接口中的成员变量都要声明为public static final类型)
- 接口没有构造函数,抽象类可以有构造函数。
- 接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。