PHP知识总结

目录

  • PHP的认知php

  • PHP的语言参考mysql

  • PHP安全考虑web

  • PHP的特性算法

  • PHP实用性考虑sql

 

1.PHP的认知

1.1 PHP是什么

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

 

1.2 PHP的主要用途

  • 服务端脚本。开展这项工做须要具有如下三点:PHP 解析器(CGI 或者服务器模块)、web 服务器和 web 浏览器。数组

  • 命令行脚本。仅仅只须要 PHP 解析器来执行。这种用法对于依赖 cron(Unix 或者 Linux 环境)或者 Task Scheduler(Windows 环境)的平常运行的脚原本说是理想的选择。浏览器

  • 编写桌面应用程序,利用 PHP-GTK 来编写这些程序。缓存

 

2.PHP语言参考

2.1 基础语法

  • PHP标记:安全

    • <?php 和 ?>,或者short_open_tag开启后容许使用短标记 <? 和 ?>

    • 分隔符为分号,注释有://, /* * /, / * * */。

  • 数据类型

    • 布尔类型:true或false。整型值0、浮点型值0.0、空字符串,以及字符串 "0"、不包括任何元素的数组、特殊类型NULL、从空标记生成的SimpleXML对象都会当从false。

    • 数据类型包括:整型、浮点型、字符串、数组、对象、资源类型、NULL、callback类型。

  • 变量

    • 预约义变量:$GLOBALS、$SERVER、$GET、$POST、$FILES、$REQUEST、$SESSION、$ENV、$COOKIE、$HTTP_RAW_POST_DATA、$http_response_header、$argc、$argv。

    • 变量的范围:变量有局部变量和全局变量之分,全局变量用global定义。

    • 变量类型:变量类型有可变变量和静态变量,静态变量只会初始化一次而且变量在整个生命过程当中有效。

  • 常量

    • 常量的定义方式:define("FOO", "something");

    • 魔术常量:LINEFILEDIRFUNCTIONCLASSTRAITMETHODNAMESPACE

  • 表达式:复制表达式、比较表达式、三目运算表达式。

  • 运算符:

    • 运算符优先级:递增/递减, 类型转换, !, * / %, + - ., 比较运算符, 引用符, &&, ||, ? :, 赋值运算符, and, or。

    • 错误忽略符号@,若是用 set_error_handler() 设定了自定义的错误处理函数,仍然会被调用。

  • 流程控制

    • 判断控制:if, elseif/else if, else。

    • 循环控制:while、do-while、for、foreach、break、continue、switch、return、goto。

    • 引入控制:include、include_once、require、require_once。include产生E_COMPILE_ERROR错误时报警告,require产生致命错误。

 

2.2 函数

  • 字符串函数:

    • 字符串查找:strrpos()最后一次位置、strripos()最后一次位置、strrchr()返回最后一次位置的剩余部分、stristr()返回第一次位置的剩余部分、stripos()第一次出现的位置、strpos()第一次出现的位置。

    • 字符串增减:chop()删除指定字符、chunk_split()分割更小部分、explode()分割数组、implode()数组组合字符串、trim移除空格、str_replace()字符串替换、str_split()分割字符块、substr()截取字符串。

    • 字符串属性:strlen()字符串长度、strrev()反转字符串、strtolower()字符串小写、strtoupper()字符串大写、ucfirst()首字符大写、lcfirst()首字符小写。

  • 数组函数:

    • 数组比较:array_diff()返回差集(只比较键值)、array_diff_assoc()返回差集(比较键名和键值)、array_diff_key()返回差集(只比较键名)、array_intersect()返回交集(只比较键值)、array_intersect_assoc()返回交集(比较键名和键值)、array_intersect_key()返回交集(只比较键名。

    • 数组排序:array_multisort()对多个数组或多维数组进行排序、arsort()按照键值进行降序排序、asort()按照键值进行升序排序、krsort()按照键名逆向排序、ksort()按照键名排序、rsort()数组逆向排序、sort()对数组排序、uasort()使用用户自定义的比较函数对数组中的键值进行排序。

    • 数组改变:array_change_key_case()把数组中全部键更改成小写或大写、array_chunk()把一个数组分割为新的数组块、array_column()返回输入数组中某个单一列的值、array_combine()经过合并两个数组来建立一个新数组、array_fill()用给定的键值填充数组、array_filter()用回调函数过滤数组中的元素、array_flip()交换数组中的键和值、array_keys()返回数组中全部的键名、array_pop()出栈、array_push()入栈、array_replace()使用后面数组的值替换第一个数组的值、array_reverse()以相反的顺序返回数组、array_shift()删除数组中首个元素、array_unshift()在数组开头插入一个或多个元素等。

 

2.3 类与对象

  • 命名空间

    • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

    • 为很长的标识符名称(一般是为了缓解第一类问题而定义的)建立一个别名(或简短)的名称,提升源代码的可读性。

  • 类的属性

    • 类常量:const,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。

    • 访问控制:public(公有),protected(受保护)或 private(私有) 。

    • 类自动加载:spl_autoload_register() 函数能够注册任意数量的自动加载器,当使用还没有被定义的类(class)和接口(interface)时自动去加载。

    • 构造函数和析构函数:construct、destruct。

    • 对象继承:extends,子类就会继承父类全部公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。

    • 抽象类:abstract,被定义为抽象的方法只是声明了其调用方式,继承一个抽象类的时候,子类必须定义父类中的全部抽象方法,访问控制只能同样或者更轻松。

    • 对象接口:接口是经过 interface 关键字来定义的,就像定义一个标准的类同样,但其中定义全部的方法都是空的。

    • trait:PHP 实现了一种代码复用的方法,称为 trait。Trait 是为相似 PHP 的单继承语言而准备的一种代码复用机制。

    • 重载:PHP所提供的重载(overloading)是指动态地建立类属性和方法。咱们是经过魔术方法(magic methods)来实现的。

    • 魔术方法:construct(), destruct(), call(), callStatic(), get(), set(), isset(), unset(), sleep(), wakeup(), toString(), invoke(), set_state(), clone() 和 __debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。

    • final: 若是父类中的方法被声明为 final,则子类没法覆盖该方法。若是一个类被声明为 final,则不能被继承。

 

2.4 异常处理

  • PHP 7 改变了大多数错误的报告方式。不一样于传统(PHP 5)的错误报告机制,如今大多数错误被做为 Error 异常抛出。

  • 这种 Error 异常能够像 Exception 异常同样被第一个匹配的 try / catch 块所捕获。若是没有匹配的 catch 块,则调用异常处理函数(事先经过 set_exception_handler() 注册)进行处理。 若是还没有注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

 

2.5 生成器

  • 生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大下降。

  • 生成器容许你在 foreach 代码块中写代码来迭代一组数据而不须要在内存中建立一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。相反,你能够写一个生成器函数,就像一个普通的自定义函数同样, 和普通函数只返回一次不一样的是, 生成器能够根据须要 yield 屡次,以便生成须要迭代的值。

 

3.PHP安全考虑

3.1 会话安全

  • 会话管理基础

    • 安全说明:会话模块没法保证你存储在会话中的信息只能被建立会话的用户本人可见。一般须要付出必定的代价,同时会下降便利性。 例如,若是你须要保护用户免受社会工程学攻击, 你须要启用 session.use_only_cookies 选项。

    • 严格会话管理:PHP 是以自适应的方式来管理会话的, 这种方式使用起来很灵活,可是一样也带来了必定的风险。所以须要配置session.use_strict_mode。当启用这个配置项,未经初始化的会话 ID 会被拒绝, 并为其生成一个全新的会话,这能够避免攻击者使用一个已知的会话 ID 来进行攻击。

    • 从新生成会话ID:为了确保会话安全,开发者还须要使用 session_regenerate_id() 函数,按期自动从新生成会话ID。

    • CSRF(跨站请求伪造):会话和认证没法避免跨站请求伪造攻击, 开发者须要本身来实现保护应用不受 CSRF 攻击的功能。

  • 和会话安全相关的配置项

    • session.cookie_lifetime=0 告知浏览器不要持久化存储 cookie 数据。

    • session.use_cookies=On,session.use_only_cookies=On 虽然 HTTP cookie 存在一些问题, 可是它确实是实现会话 ID 管理的优选方案。

    • session.use_strict_mode=On 此设置防止会话模块使用未初始化的会话 ID。

    • session.cookie_httponly=On 禁止JavaScript访问会话cookie。 此设置项能够保护cookie不被JavaScript窃取。

    • session.cookie_secure=On 仅容许在 HTTPS 协议下访问会话ID cookie。 若是你的web站点仅支持HTTPS,那么必须将此配置项设置为On。

    • session.use_trans_sid=Off 禁用会话 ID 透传机制能够 避免会话 ID 被注入以及泄漏, 有效的提升会话安全性。

 

3.2 文件安全

  • PHP听从大多数服务器系统中关于文件和目录权限的安全机制。这就使管理员能够控制哪些文件在文件系统内是可读的。必须特别注意的是全局的可读文件,并确保每个有权限的用户对这些文件的读取动做都是安全的。

  • PHP 被设计为以用户级别来访问文件系统,因此彻底有可能经过编写一段 PHP 代码来读取系统文件如 /etc/passwd,更改网络链接以及发送大量打印任务等等。所以必须确保 PHP 代码读取和写入的是合适的文件。

  • 有两个重要措施来防止此类问题:

    • 只给 PHP 的 web 用户颇有限的权限。

    • 检查全部提交上来的变量。

 

3.3 数据库安全

  • PHP 自己并不能保护数据库的安全。记住一条简单的原则:深刻防护。保护数据库的措施越多,攻击者就越难得到和使用数据库内的信息。正确地设计和应用数据库能够减小被攻击的担心。

  • 直接 SQL 命令注入就是攻击者经常使用的一种建立或修改已有 SQL 语句的技术,从而达到取得隐藏数据,或覆盖关键的值,甚至执行数据库主机操做系统命令的目的。

  • -- 是 SQL 的注释标记,通常可使用来它告诉 SQL 解释器忽略后面的语句。

  • 预防措施

    • 永远不要使用超级用户或全部者账号去链接数据库。要用权限被严格限制的账号。

    • 检查输入的数据是否具备所指望的数据格式。

    • 使用数据库特定的敏感字符转义函数(好比 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义。

    • 也能够选择使用数据库的存储过程和预约义指针等特性来抽象数库访问,使用户不能直接访问数据表和视图。

 

4.PHP的特性

4.1 垃圾回收机制

  • 引用计数基本知识

    • 每一个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个是"is_ref",是个bool值,用来标识这个变量是不是属于引用集合(reference set)。

    • 把一个变量赋值给另外一变量将增长引用次数(refcount).

    • 变量容器在”refcount“变成0时就被销毁. 当任何关联到某个变量容器的变量离开它的做用域(好比:函数执行结束),或者对变量调用了函数 unset()时,”refcount“就会减1。

  • 回收周期

    • 若是一个引用计数增长,它将继续被使用,固然就再也不在垃圾中。若是引用计数减小到零,所在变量容器将被清除(free)。就是说,仅仅在引用计数减小到非零值时,才会产生垃圾周期(garbage cycle)。其次,在一个垃圾周期中,经过检查引用计数是否减1,而且检查哪些变量容器的引用次数是零,来发现哪部分是垃圾。

  • 性能方面考虑

    • 首先,实现垃圾回收机制的整个缘由是为了,一旦先决条件知足,经过清理循环引用的变量来节省内存占用。在PHP执行中,一旦根缓冲区满了或者调用gc_collect_cycles() 函数时,就会执行垃圾回收。

    • 执行时间增长:垃圾回收影响性能的第二个领域是它释放已泄漏的内存耗费的时间。PHP中的垃圾回收机制,回收算法确实运行时会有时间消耗上的增长。

 

4.2 Fast cgi管理

  • 支持平滑中止/启动的高级进程管理功能;

    • 能够工做于不一样的 uid/gid/chroot 环境下,并监听不一样的端口和使用不一样的 php.ini 配置文件(可取代 safe_mode 的设置);

    • stdout 和 stderr 日志记录;

    • 在发生意外状况的时候可以从新启动并缓存被破坏的 opcode;

    • 文件上传优化支持;

    • "慢日志" - 记录脚本(不只记录文件名,还记录 PHP backtrace 信息,可使用 ptrace或者相似工具读取和分析远程进程的运行数据)运行所致使的异常缓慢;

    • fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工做(录入视频转换、统计处理等);

    • 动态/静态子进程产生;

    • 基本 SAPI 运行状态信息(相似Apache的 mod_status);

    • 基于 php.ini 的配置文件。

 

5.PHP实用性考虑

5.1 大量数据的处理

  • 足够的批处理

    • 记录在业务事务过程当中对数据库有影响的全部变化,并在操做结束后,做为一种结果保存到数据库。

    • 解决大量规模很小的数据库调用。

  • 充分的异步处理

    • 分而治之的思想:把复杂的业务流程拆分为独立的几个子流程。

    • 把不影响主流程的数据加载进行异步处理

 

5.2 内存使用状况

  • 使用生成器

    • 生成器提供简易的方法实现对象迭代,性能开销和复杂性大大下降。

    • 生成器能够避免,大变量致使的内存溢出问题。

  • 在长时间执行的脚本中,尽量手动unset()变量。避免PHP垃圾回收机制的耗时,和内存碎片致使的内存增长问题。

 

5.3 并发处理状况

  • 乐观锁机制

    • 在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,若是发现冲突了,则让返回用户错误的信息,让用户决定如何去作。

  • 悲观锁机制

    • 悲观锁的实现方式是使用数据库的锁机制,例如:select * from goods where goods_code ='111' for update ;

相关文章
相关标签/搜索