Modern PHP简略笔记
2018-06-11 本文已影响18人
10xjzheng
0 前言
Modern PHP(中文版)豆瓣评分挺高的,所以找来看看,做个简略笔记,有些我已经熟悉的就不做记录了。
1 语言特性
1 新时代的PHP
略
2 特性
- 命名空间
主要了解一下自动加载原理
__autoload(), spl_autoload_register(),include() - 使用接口
用接口来协调不同对象之间的关系 - 性状
trait 代码复用,解决php没有多继承 - 生成器
关键字 yield
不用实现ilterator接口就能遍历,并且还可以节省内存。
比较:
<?php
function makeRange($length)
{
$dataSet = [];
for ($i = 0; $i < $length; $i++)
{
$dataSet[] = $i;
}
return $dataSet;
}
$customRange = makeRange(100000);
foreach ($customRange as $i) {
echo $i, PHP_EOL;
}
结果:memory usage:6291568 (bytes)
和
$begin = memory_get_usage();
function makeRange($length)
{
for ($i = 0; $i < $length; $i++)
{
yield $i;
}
}
$customRange = makeRange(100000);
foreach ($customRange as $i) {
echo $i, PHP_EOL;
}
echo 'memory usage:' , memory_get_usage() - $begin, PHP_EOL;
结果:memory usage:416(bytes)
这内存省的太多了。
- 闭包
我自己也是经常用,主要是用在array_map() ,call_user_function_array()等等 - Zend OPcache
很多其它扩展APC、XCache等等,但Zend OPcache已集成到内核,编译时打开扩展就行了
2 良好实践
3 标准
PSR-1: 基本的代码风格
PSR-2:严格的代码风格
PSR-3:日志记录器接口
PSR-4:自动加载
4 组件
用Composer安装组件,基本大家都会啦。
可以学习一下怎么写组件,到Packagist注册,提交代码。
Packagist
5 良好实践
- 过滤、验证和转义
htmlentities() //对输入的html转义,用的时候要指定参数
htmlentities($html, ENT_QUOTES, 'utf-8') //第二个参数指定对单引号和双引号转义,第三个 参数指定编码
filter_var()//指定过滤字符
bcrypt 最安全的哈西算法,哈希加盐,防止彩虹表攻击。
PDO 预处理语句,绑定参数
- 流
- file://流封装协议: 使用file_get_contents()、fopen()、fwrite()和fclose()函数读写文件系统;
- php://流封装协议:
- php://stdin
- php://stdout
- php://memory
-
php://temp
file_get_contents还能POST,666,这个我真不知道哈哈
<?php
$requestBody = '{"userName": "json"}';
$context = stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json;charset=utf-8;\r\n" .
"Content_Length" . mb_strlen($requestBody),
'content' => $requestBody
]
]);
$response = file_get_contents('https://my-api.com/users', false, $context);
- 异常
- 错误
作者推荐了一个组件:Monolog
部署、测试和调优
6 主机
主机方案,主要讲根据项目大小选用服务器的,略过
7 配置
- 配置php-fpm(进程数pm.max_children = 51等等)
- 配置nginx
8 调优
-
内存
1.一共能分配给PHP内存:一般512M就够咯
2.单个PHP进程平均消耗多少内存:top可以查看,还可以用memory_get_peak_usage()函数获取内存峰值。- 能负担得起多少个PHP-FPM进程:假设平均每个PHP进程消耗15M,给PHP分配512M,所以可以负担512/15=34个进程
-
Zend OPcache
opcache.memory_consumption = 64 //为操作码缓存分配的内存量(M)
opcache.interned_strings_buffer = 16 //用来储存interned string的内存量
opcache.max_accelerated_files = 4000//操作码缓存中最多能存储多少个PHP脚本
opcache.validate_timestamps = 1//这个设置的值为1时,经过一段时间后PHP会检查PHP脚本的内容是否有变化,0不检查。
opcache.revalidate_freq = 0 //设置多久检查一次PHP脚本的内容是否有变化,单位是秒
opcache.fast_shutdown = 1//这么设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给你Zend Engine的内存管理器完成
- 文件上传
php.ini
file_uploads = 1
upload_max_filesize = 10M
max_file_uploads = 3
- 最长执行时间
php.ini
max_execution_time = 5
- 处理会话
session.save_handler = 'redis'
session.save_path = '127.0.0.1:6379'
- 缓冲输出
output_buffering = 4096
implicit_flush = false
9 部署
- git 熟悉,略过
- Capistrano自动部署 ,使部署可逆
10 测试
- PHPUnit
11 分析
- Xdebug