美文网首页
Modern PHP简略笔记

Modern PHP简略笔记

作者: 10xjzheng | 来源:发表于2018-06-11 14:38 被阅读18次

    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://流封装协议:
        1. php://stdin
        2. php://stdout
        3. php://memory
        4. 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()函数获取内存峰值。

      1. 能负担得起多少个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

    12 HHVM和Hack

    相关文章

      网友评论

          本文标题:Modern PHP简略笔记

          本文链接:https://www.haomeiwen.com/subject/tlyceftx.html