基础
函数
|
|
面向对象编程
SPL
1. SplStack 栈
|
|
2. SplQueue 队列
|
|
3. SplMiniHeap 堆(最小堆) 资料
说明: 堆是一颗完全二叉树,特点是父节点的值大于(小于)两个子节点的值,应用场景包括堆排序、优先队列等
|
|
4.SplFixedArray 固定长度的数组
|
|
PHP魔术方法
1.get/set //获取/设置变量
2.call/callStatic 调用不存在的方法/静态方法时调用
3.toString 直接输出对象时调用
4.invoke 将对象当函数执行时运行的方法
反射
类和对象
基本概念
parent,self,static
parent引用的是父类作用域,self引用当前类作用域,static引用全部静态作用域,表现为子类覆盖父类,无子类则使用父类
new self 创建本类对象(创建语句定义位置类的对象)
new static 创建本类对象(创建最终调用语句的类的对象) 静态延迟绑定
new parent创建父类的对象
注意:
对对象直接赋值是对对象的引用
extends可以实现单继承,子类中可以覆盖父类的方法,使用final关键字修饰的方法不可以被覆盖,使用final关键字修饰的类不能被继承
|
|
成员
成员访问:
- 非静态属性: 可以使用$this->property来访问
类可见性
|
|
|
|
组合与继承
|
|
|
|
静态延迟绑定
get_called_class()
static::
自动加载
- 利用composer
- 利用spl_autoload_register
性能分析
方案1: tideways+xhgui (适用于现代PHP) 参考文档 参考文档2
方案2: xhprof+xhgui (只适用于php5)
扩展开发
配置
查找PHP配置文件
php --ini
#执行结果
Configuration File (php.ini) Path: /usr/local/etc/php/5.5
Loaded Configuration File: /usr/local/etc/php/5.5/php.ini
Scan for additional .ini files in: /usr/local/etc/php/5.5/conf.d
Additional .ini files parsed: /usr/local/etc/php/5.5/conf.d/ext-igbinary.ini,
/usr/local/etc/php/5.5/conf.d/ext-mcrypt.ini,
/usr/local/etc/php/5.5/conf.d/ext-memcached.ini,
/usr/local/etc/php/5.5/conf.d/ext-mongo.ini,
/usr/local/etc/php/5.5/conf.d/ext-redis.ini,
/usr/local/etc/php/5.5/conf.d/ext-swoole.ini
- php会扫描Scan for additional .ini files in目录,并读取将其中的.ini文件,等同于在php.ini中添加配置
- Scan for additional .ini files in目录在编译时通过—with-config-file-scan-dir=PATH设定
PHP-FPM
Fpm(fastCGI进程管理器)是PHP FastCGI进程管理
|
|
与php-fpm相关的有两个文件php.ini和php-fpm.conf,后者是php-fpm的配置文件
php-fpm.conf
|
|
信号处理
pcntl_signal 安装信号处理器
pcntl_alarm 创建计时器,指定秒数后向进程发送SIGALRM信号
pcntl_signal_dispatch 分发信号
信号
SIGALRM 定时器信号
SIGTERM kill pid时会将SIGTERM发送给进程
SIGKILL kill -9 pid”时会将SIGKILL发送给进程
历史
- PHP5.3
- 闭包
- __callStatic
- 命名空间
- PHP5.4
- traits
- new生成对象的同时调用对象成员
Session
自定义session处理
1.session_set_save_handler()
2.session.save_handler
为什么不推荐使用php自带的文件型session处理方式
php官方手册有这么一段话
无论是通过调用函数 session_start() 手动开启会话, 还是使用配置项 session.auto_start 自动开启会话, 对于基于文件的会话数据保存(PHP 的默认行为)而言, 在会话开始的时候都会给会话数据文件加锁, 直到 PHP 脚本执行完毕或者显式调用 session_write_close() 来保存会话数据。 在此期间,其他脚本不可以访问同一个会话数据文件。
为了证明这段话
|
|
访问session1.php后马上访问session2.php,等待5秒后session1.php和session2.php页面才打开,而只打开session2.php的话是秒开。这是因为当session1.php开启session后就对session文件加锁,只有显式使用session_write_cloese()或等待脚本执行完毕才会释放锁,期间其他相同session_id的请求就会被阻塞,只能被迫等待。
所以推荐使用redis或memecache作为session处理器
Session数据什么时候删除
官方手册中的说明
session.gc_maxlifetime
指定过了多少秒之后数据就会被视为”垃圾”并被清除。 垃圾搜集可能会在 session 启动的时候开始( 取决于session.gc_probability
和session.gc_divisor
)。session.gc_probability
与session.gc_divisor
合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_probability
默认为 1,session.gc_divisor
默认为 100。
FAQ
1. json_decode的坑
|
|
2. 单双引号转义
|
|
3. PHP中浮点数精度问题
|
|
参考资料 http://php.net/float
4. 过滤emoji表情
|
|
5. call_user_func对函数及类中方法的访问权限
|
|
6. 空数组在json_encode后会变成[],而前端期望的是对象{},如何解决
|
|
7. 类型转换
|
|
发起一个请求后,中途如果断开,比如关闭网页,此后php代码是否会继续执行
会继续执行,直到达到最大执行时间