PHP细节-02

文件

  • 二进制文件读写 pack() unpack()
  • 系统函数判断图像类型:exif_imagetype()
  • 文件指针

    1
    2
    3
    4
    fseek() 在文件指针中定位
    ftell() 返回文件指针读写的位置
    rewind() 倒回文件指针的位置
    feof() 测试文件指针是否到了文件结束的位置
  • 超大文件上传

    1
    2
    swfUpload、uploadify 等flash组件
    XMLHTTPRequest 大文件断点续传+分段上传 ajax2.0

PHP运行原理

UA -> apache -> SAPI -> zend engine -> php script

PHP运行模式

  • CLI模式 命令行接口

    1
    2
    3
    4
    定时任务
    shell脚本中使用
    桌面应用程序
    PHP server 服务
  • CGI 通用网关接口

    1
    2
    3
    4
    就像桥梁一样,把网页和web服务器中的执行程序连接起来,它把http服务器接收的指令传递给执行程序,再把执行程序的结果返回http服务器。CGI跨平台性及佳,几乎可以在任何操作系统实现

    提供http服务
    性能比较差,一个请求fork一个进程
  • FastCGI 快速通用网关接口

    1
    2
    3
    4
    5
    6
    7
    8
    也是交互程序与web服务器通信协议。致力于介绍服务器与程序之前互动的开销
    web服务器启动时,载入FastCGI进程管理器 对于PHP来讲就是php-fpm
    FastCGI 会启动多个CGI进程等待web服务器的连接
    收到请求时由FastCGI子进程处理。子进程关闭连接时,请求处理完成。子进程接着等待并处理FastCGI进程管理器的下一个连接

    提供http服务
    支持大并发
    多进程消耗较多内存
  • 模块模式 apache 和 ISS

进程、线程、协程

  • 单进程:单个CPU一次只能运行一个任务
  • 一个进程可以包括多个线程(防止多个线程同时读写某一块区域加锁机制)
  • 协程避免了无意义的调度,由此提高了性能。但因此要程序员自己承担调度的责任,同时也失去了标准线程使用多CPU的能力

多进程形式,允许多个任务同时运行
多线程形式,允许单个任务分成不同部分运行

  • ts Thread safe 线程安全,执行时会进程线程安全检查,防止有新要求就启动新线程的执行方式而耗尽系统资源
  • nts Non Thread Safe 非线程安全,在执行时不进行线程安全检查

由于ISAPI是线程执行的,所以选择PHP版本时要选择TS版本的。其它选择NTS版本就行了。

  • Apache 的 prefork 模块

    prefork 采用预派生子进程模式,用单独的子进程来处理不同的请求,进程之间彼此独立。httpd-mpm.conf 配置包括:

    1
    2
    3
    4
    5
    StartServers 5 #  初始化进程数量
    MinSpareServers 5 # 空闲进程总数最小值
    MaxApareServers 10 # 空闲进程总数最大值
    MaxClients 150 # 最大客户端连接数量限制
    MaxRequestsPerChild 0 # 子进程减能处理的请求数量
  • Apache 的 worker 模块

    worker 全新的支持多线程和多进程混合模型的MPM,由于使用线程来处理,所以可以处理相对海量的数据请求。而系统资源的开销要小于基于进程的服务器

  • Apache 的 event 模式

为什么大访问量下NGINX性能更高?

Apache 所采用的select 网络 I/O 模型非常低效
Nginx 使用了最新的epoll 和 kqueue(freebsd) 网络 I/O 模型
PHP是 Apache 的一个扩展模块,所以Apache 进程 干的事情也比较多,执行PHP、输出HTML 都得干,占用的资源也多(CPU,内存)

PHP运行机制与原理

  • PHP 底层原理

    PHP通过 SAPI 和 Apache相连
    PHP总共有三个模块:内核、Zend引擎、以及扩展层
    PHP内核用来处理请求、文件流、错误处理等相关操作
    Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
    扩展层是一株函数、类库和流,PHP使用它们来执行一些特定的操作,如:MySQL扩展来连接MySQL数据库
    ZE引擎执行程序是可能需要连接若干扩展,这是ZE将控制权交给扩展,等待处理完任务和再返还
    最后ZE将程序运行结果反回给PHP内核,它再将结果传送给SAPI传给Apache

  • PHP运行机制

    1. 扫描
  1. 解析
  2. 编译
  3. 执行
  4. 输出

PHP垃圾回收机制

没有引用的内存变量就垃圾,PHP开启了很多内存空间,如果不销毁内存会一点点的被吃掉,最终导致内存溢出。

  1. 找到所有已定义的变量:get_defined_vars
  2. refcount_gc 是否为0 就知道是不是垃圾 无引用的变量 (清除为0的5.2版本以前 5.3以后 采用了引用计数系统中的同步周期回收算法来清除)
  3. 当我们存储的疑似垃圾区域满了的时候,就会被执行清除垃圾的操作。前提是开启了 php.ini 中的 zend.enable_gc 配置 也可以调用 gc_enable() 和 gc_disable() 打开和关闭垃圾回收机制 也可以通过 gc_collect_cycles() 强制执行周期回收

PHP常用选项

  • display_errors 是否显示错误信息 辅助开发使用,不要在生产环境使用
  • error_reporting 设置错误报告的级别
  • variables_order 设置EGPCS超全局变量的解析顺序
  • request_order 确定 $_GET$_POST 等超全局变量的顺序,后面的会把前面的数据重写覆盖 “GP”
  • disable_classes 、 disable_functions 禁用某些类和某些函数

HTTP 协议

1
2
3
4
GET /index.html HTTP/1.1
HOST: www.example.com
Range: bytcs-500-999
Connection:keep-alive
  • HTTP 工作流程
    访问一个网址时,发生了什么?
    1. 通过DNS解析域名对应的服务器IP地址
    2. 建立TCP连接
    3. 向服务器发送请求
    4. 返回内容

javascript

  • 闭包

    闭包使用不当可能会导致内存泄露。
    闭包是指有权访问另一个函数作用域中的变量的函数
    一个外部函数执行完毕后,由于其内部函数被外部引用,导致其作用域中的变量存活,而不能在函数执行完毕后被销毁,包含这些变量的那个对象就被称为闭包