《PHP之道》读书摘要

这本书从买到的时候就开始读,由于本能的惰性,读到一半的时候,去享受了一番人生。在享受了大半年的快活人生后,幡然醒悟,原来人生最有意义的事情还是去追逐梦想,去追逐最开始的东西,所以现在重新拿起了这本书,从这本书重新看起。
按理说,一个工作将近一年的PHP程序猿,现在再来看这本书,有点晚了,但是我一直坚信意见事情,“亡羊补牢,为时未晚”。所有的一切都不是一蹴而就的,都是一步一个脚印踩出来的,就像我的领导说的一样,“坑踩多了,你也就成为了专家”。接下来进入正题。

1.性状

性状就像是将一个公共方法的实现放在一个文件中,需要使用的时候直接去use就可以了,就像是一个A类和一个B类,他们有部分功能是一样的,但是还有很多不一样的,而且他们还需要独立的运行,这样的话使用性状是最好的。

2.echo ,和.

在echo时使用最多的是 . 我们使用 . 来连接字符串等等,但是遇到三元运算或者其他需要运算的时候,echo遇到.的时候会先进行.附近的拼接。而,就不一样了,会分部分运算最后再各部分拼接;

// PHP CODE

$a = 0;
$b = 1;
$c = 3;
echo 'num' . (isset($e) ? $e : $a + $b) . '!' . PHP_EOL;
echo 'num', isset($e) ? $e : $a + $b, '?' . PHP_EOL;

3.pdo

pdo是一个数据库扩展,一个抽象了不同数据库的具体实现,但是还需要我们自己编写sql语句,有几个不错东西

bindValue()

指定数据类型的参数
– PDO::PARAM_BOOL
– PDO::PARAM_INT
– PDO::PARAM_NULL
– PDO::PARAM_STR
– PDO::PARAM_LOB

bindParam() 绑定参数

查询结果

  • PDO::FETCH_LAZY 将结果集中的每一行作为一个对象返回
  • PDO::FETCH_ASSOC 将对应结果集中的每一行作为一个由列名索引的数组返回
  • PDO::FETCH_NAMED 将对应结果集中的每一行作为一个由列名索引的数组返回
  • PDO::FETCH_NUM 将对应结果集中的每一行作为一个由列号索引的数组返回
  • PDO::FETCH_BOTH 将对应结果集中的每一行作为一个由列号和列名索引的数组返回
  • PDO::FETCH_OBJ 将结果集中的每一行作为一个属性名对应列名的对象返回
  • PDO::FETCH_BOUND 返回 TRUE 且将结果集中的列值分配给通过 PDOStatement::bindParam() 或 PDOStatement::bindColumn() 方法绑定的 PHP 变量。
  • PDO::FETCH_COLUMN 从结果集中的下一行返回所需要的那一列
  • PDO::FETCH_CLASS 返回一个所请求类的新实例
  • PDO::FETCH_INTO 更新一个请求类的现有实例
  • PDO::FETCH_FUNC 允许在运行中完全用自定义的方式处理数据
  • PDO::FETCH_GROUP 根据值分组返回。通常和 PDO::FETCH_COLUMN 或 PDO::FETCH_KEY_PAIR 一起使用
  • PDO::FETCH_UNIQUE 只取唯一值
  • PDO::FETCH_KEY_PAIR 获取一个有两列的结果集到一个数组,其中第一列为键名,第二列为值
  • PDO::FETCH_CLASSTYPE 根据第一列的值确定类名
  • PDO::FETCH_SERIALIZE 类似 PDO::FETCH_INTO ,但是以一个序列化的字符串表示对象。
  • PDO::FETCH_PROPS_LATE 设置属性前调用构造函数

4.php-fpm 部分配置

  • emergency_restart_threshold = 10 设置失效PHP-FPM子进程最大数,当超过这个值,主进程就会优雅的重启
  • emergency_restart_interval = 1m 设置emergency_restart_threshold设置采用的时间跨度
  • user = deploy 设置拥有进程的用户
  • group = deploy 设置拥有该进程的用户所属用户组名
  • listen = 127.0.0.1:9000 设置php-fpm监听的ip和端口号
  • listen.allowes_clitens = 127.0.0.1 可以向这个php-fpm进程池发送请求的ip地址
  • pm.max_children = 51 最大进程数,这个值没有绝对的正确值,但是会有一个合适的值。公式是进程池总内存/每个进程内存 = 最大进程数
  • pm.start_servers = 3 php-fpm启动时的进程数
  • pm.min_spare_servers = 2 应用最小空闲进程数
  • pm.max_spare_servers = 4 空闲时的最大进程数,超出后会杀掉进程
  • pm.max_requests = 1000 进程最多可以处理的http请求数量,可以避免php扩展或库导致的内存不断泄露的问题
  • slowlog = /path/to/slowlog.log 记录处理时间超过n秒的http请求信息
  • request.slowlog_timeout = 5s 当前http请求处理时间超出该设定值会将请求的回溯信息写入上面写入的日志文件

5.调优

zend opcache

  • opcache.memory_consumption = 64 为操作码缓存分配的 内存量(mb),视php应用的大小而定
  • opcache.interned_strings_buffer = 16 存储驻留字符串的内存量
  • opcache.max_accelerated_files = 400 操作码最多能存储的脚本数量(200-100000)要比文件数目大
  • opcache.validate_timestamps = 1 是否在一定时间后检查脚本的内容变化,时间由opcache.revalidate_freq指定
  • opcache.revalidate_freq = 0 (s)设置多久检查一次PHP脚本内容的变化,生产环境设置为0,这样就不会每次请求都重新编译php脚本了
  • opcache.fast_shutdoun = 1 操作码快速停机

其他配置

max_execution_time = 5 最长执行时间 如果需要长时间运行的话使用exec()函数派生一个单独的后台进程
对于需要快速响应的应用不要使用原生的session处理方式,原生的session是写在磁盘中的,可以考虑将需要缓存的数据写到内存中,例如redis中;缓冲输出,配置php设置缓冲输出,以及设置真实路径缓存

// PHP CODE

output_buffering = 4096
imlicit_flush = false
realpath_cache_size = 64k