php总结

119 阅读11分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

PHP

是一个基于服务端来创建动态网站的脚本语言

OOP[面向对象]

  • 是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征: 封装、继承、多态
  • 易维护 质量高 效率高 易扩展

SESSION与COOKIE的区别

  • 存储位置
    • session存储于服务器,cookie存储于浏览器
  • 安全性
    • session安全性比cookie高
  • session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用
  • SESSION依赖于COOKIE进行传递. 禁用COOKIE后,session不能正常使用.
  • SESSION的缺点
    • 保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗.
  • SESSION保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定

HTTP状态码

  • 一 消息系列
  • 二 成功系列
    • 200 请求成功
  • 三 重定向系列
    • 302 临时移动
    • 304 未修改
  • 四 请求错误系列
    • 403 禁止访问
    • 404 文件未找到
  • 五 服务器端错误系列
    • 500 服务器内部错误
    • 502 错误网关
    • 503 服务器超时

get与post表单提交方法

  • get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到
  • post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址
  • get传值一般在2KB以内,post传值大小可以在php.ini中进行设置
  • get安全性非低,post安全性较高,执行效率却比Post高

echo(),print(),print_r()的区别

  • echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
  • Print()只能打印出简单类型变量的值(如int,string)
  • print_r()可以打印出复杂类型变量的值(如数组,对象)
  • echo 输出一个或者多个字符串

魔术方法

  • __call()当调用不存在的方法时会自动调用的方法
  • __autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
  • __set()当给未定义的变量赋值时会自动调用的方法
  • __get()当获取未定义变量的值时会自动调用的方法
  • __construct()构造方法,实例化类时自动调用的方法
  • __destroy()销毁对象时自动调用的方法
  • __unset()当对一个未定义变量调用unset()时自动调用的方法
  • __isset()当对一个未定义变量调用isset()方法时自动调用的方法
  • __clone()克隆一个对象
  • __tostring()当输出一个对象时自动调用的方法

XSS攻击

  • GET或POST内容未过滤,可以提交JS以及HTML等恶意代码.
  • 所有传递到后台的数据都要过滤HTML标签

CSRF跨站攻击

  • 强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为
  • 采用类似随即码或者令牌的形式,让用户操作唯一性(token)

sql注入安全问题

  • 通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
  • POST提交,过滤参数,PDO绑定

php.ini中magic_quotes_gpc, magic_quotes_runtime的作用

  • magic_quotes_gpc的作用是在POST、GET、COOKIE数据上使用addslashes()自动转义
  • magic_quotes_runtime参数的作用是设置状态,当状态为0时则关闭自动转义,设置为1则自动转义,将数据库中取出来的单引号、双引号、反斜线这些字符加上反斜杠转义.

单引号双引号

  • 单引号内部的变量不会执行, 双引号会执行
  • 单引号解析速度比双引号快.
  • 单引号只能解析部分特殊字符,双引号可以解析所有特殊字符

修改session的生存时间

  • 在php.ini 中设置 session.gc_maxlifetime = 1440 //默认时间
  • session_set_cookie_params(24 * 3600)

private、protected、public

  • private
    • 私有成员, 在类的内部才可以访问.
  • protected
    • 保护成员,该类内部和继承类中可以访问.
  • public
    • 公共成员,完全公开,没有访问限制

$this和self、parent

  • $this 当前对象, 在当前类中使用,使用->调用属性和方法.
  • self 当前类, 也在当前类中使用,不过需要使用::调用
  • parent 当前类的父类, 在类中使用

Memcach的理解

  • Memcache是一种缓存技术,在一定的时间内将动态网页经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必在重新访问数据库.
  • 使用memcache做缓存的好处是: 提高网站的访问速度,减轻高并发时服务器的压力.
  • Memcache的优点: 稳定、配置简单、多机分布式存储、速度快

include与require的区别

  • 加载失败的处理方式不同
    • include在引入不存文件时产生一个警告且脚本还会继续执行
    • require则会导致一个致命性错误且脚本停止执行
  • 文件引用方式
    • include有返回值,而require没有[require的速度比include快]
  • require_once表示了只包含一次,避免了重复包含

PHP运行方式

web server(比如说nginx)只是内容的分发者.
如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据.
如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器
CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议.仔细想想,你在PHP代码中使用的用户从哪里来的.
当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器.接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程.web server再把结果返回给浏览器.

标准的CGI对每个请求都会执行这些步骤,所以处理每个时间的时间会比较长.这明显不合理嘛!那么Fastcgi是怎么做的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker.当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求.这样就避免了重复的劳动,效率自然是高.而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源.这就是fastcgi的对进程的管理.

大家都知道,PHP的解释器是php-cgi.php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理所以就出现了一些能够调度php-cgi进程的程序,PHP-FPM就是这种程序
  • CGI
    • 通用网关接口
    • 是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口
    • 把网页和Web服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页
  • FastCGI
    • 激活后一直运行,像是一个常驻的CGI
    • PHP的FastCGI进程管理器是PHP-FPM
  • CLI
    • 命令行运行
  • Web模块模式
    • Apache等Web服务器运行的模式
    • 以mod_php5模块的形式集成
    • 接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache
  • ISAPI
    • 是微软提供的一套面向Internet服务的API接口.一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI

获取文件扩展名

```php
    function getExt1($filename)
    {
        $arr = explode('.',$filename);
        return array_pop($arr);;
    }

    function getExt2($filename)
    {
        $ext = strrchr($filename,'.');
        return $ext;
    }

    function getExt3($filename)
    {
        $pos = strrpos($filename, '.');
        $ext = substr($filename, $pos);
        return $ext;
    }

    function getExt4($filename)
    {
        $arr = pathinfo($filename);
        $ext = $arr['extension'];
        return $ext;
    }

    function getExt5($filename)
    {
        $str = strrev($filename);
        return strrev(strchr($str,'.',true));
    }
```

MVC优劣

    • 可以为一个模型在运行时同时建立和使用多个视图.变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步.
    • 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换.
    • 模型的可移植性.因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作.需要做的只是在新平台上对视图和控制器进行新的修改.
    • 潜在的框架结构.可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中.
    • 增加了系统结构和实现的复杂性.对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率.
    • 视图与控制器间的过于紧密的连接.视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用.
    • 视图对模型数据的低效率访问.依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据.对未变化数据的不必要的频繁访问,也将损害操作性能.
    • 目前,一般高级的界面工具或构造器不支持MVC架构.改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难

面向对象和面向过程

  • 面向对象
    • 把构成问题事务分解成各个对象,描叙某个事物在整个解决问题的步骤中的行为
      • 结构清晰
      • 封装性
      • 容易扩展
      • 实现简单
      • 和代码底层的直接交互非常少
      • 复杂性高
  • 面向过程
    • 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用
      • 效率高
      • 流程明确
      • 重用性低
      • 扩展能力差,维护起来难度比较高

PHP的错误类型

  • 提示
    • 这都是一些非常正常的信息,而非重大的错误,有些甚至不会展示给用户.比如访问不存在的变量.
  • 警告
    • 这是有点严重的错误,将会把警告信息展示给用户,但不会影响代码的输出,比如包含一些不存在的文件.
  • 错误
    • 这是真正的严重错误,比如访问不存在的php类

file_get_content和fread区别

  • fread() 最大一次性能读取8k长度的字节数,所以不能一次性读取大文件去作下载. 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务器的流量.
  • file_get_contents() 函数把整个文件读入一个字符串中. 与 函数file()不同的是 file_get_contents() 把文件读入一个字符串,而file()把整个文件读入一个数组中.
  • file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法.如果操作系统支持,还会使用内存映射技术来增强性能.在读取小文本内容到字符串变量时,这个函数最适合使用,简单,更快.