文件
- 二进制文件读写 pack() unpack()
- 系统函数判断图像类型:exif_imagetype()
文件指针
1
2
3
4fseek() 在文件指针中定位
ftell() 返回文件指针读写的位置
rewind() 倒回文件指针的位置
feof() 测试文件指针是否到了文件结束的位置超大文件上传
1
2swfUpload、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
5StartServers 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传给ApachePHP运行机制
- 扫描
- 解析
- 编译
- 执行
- 输出
PHP垃圾回收机制
没有引用的内存变量就垃圾,PHP开启了很多内存空间,如果不销毁内存会一点点的被吃掉,最终导致内存溢出。
- 找到所有已定义的变量:get_defined_vars
- refcount_gc 是否为0 就知道是不是垃圾 无引用的变量 (清除为0的5.2版本以前 5.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 | GET /index.html HTTP/1.1 |
- HTTP 工作流程
访问一个网址时,发生了什么?- 通过DNS解析域名对应的服务器IP地址
- 建立TCP连接
- 向服务器发送请求
- 返回内容
javascript
- 闭包
闭包使用不当可能会导致内存泄露。
闭包是指有权访问另一个函数作用域中的变量的函数
一个外部函数执行完毕后,由于其内部函数被外部引用,导致其作用域中的变量存活,而不能在函数执行完毕后被销毁,包含这些变量的那个对象就被称为闭包