Modern PHP 笔记(三):部署测试和调优

系列笔记:
Modern PHP 笔记(一):语言特性
Modern PHP 笔记(二):良好实践
Modern PHP 笔记(三):部署测试和调优

第六章:主机

可选:

  • 共享服务器
  • 虚拟私有服务器VPS
  • 专用服务器
  • PaaS

第七章:配置

目标:安装Web服务器,以便接收HTTP请求;设置并管理一组PHP进程,处理PHP请求,
进程可以与web服务器通信。

设置服务器

一般选择nginx。因为apache为每个PHP请求派生一个子进程,比较耗资源。

然后作者展示了一个登陆VPS的例子:需要ssh登陆、创建非根用户管理web服务器,不要使用root

SSH密钥对认证

因为使用密码登陆有漏洞,尽量使用SSH密钥对认证。
SSH密钥对登录流程如下:

使用SSH密钥对认证方式登录远程设备时,远程设备随机创建一个消息,使用公钥加密,然后把密
文发给本地设备,本地设备收到密文后使用私钥解密,然后把解密后的消息发给远程服务器。远程
服务器验证解密后的消息之后,再赋予你访问服务器的权限。

适合在一台电脑中登录远程,多台不适合。

    // 生成私钥、公钥文件 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub
    ssh-keygen
    // 复制公钥到服务器
    scp ~/.ssh/id_rsa.pub deploy@100.10.3.1:
    // 末尾要加':',会复制到家目录
    // deploy用户登录服务器
    // 确认有~/.ssh目录,没有则创建目录和文件,文件存储允许登录的公钥
    touch ~/.ssh/authorized_keys
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    // 修改几个目录和文件的权限,只让deploy用户访问
    chown -R deploy:deploy ~/.ssh
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

禁用密码,禁止根用户登录

这样最安全

    // /etc/ssh/sshd_config
    PassWordAuthentication 设置为no
    PermitRootLogin 设置为no

PHP-FPM

PHP FastCGI Process Manager(PHP FastCGI进程管理器)。它会创建一个主进程(root用户),
控制何时以及如何把HTTP请求转发给一个或多个子进程处理。PHP-FPM还需控制何时创建、销毁PHP子
进程。

全局配置

CentOS主配置文件:/etc/php-fpm.conf
建议修改默认配置:

    emergency_restart_threshold = 10
        // 指定时间内,失效的PHP-FPM子进程超过这个值,让PHP-FPM主进程优雅重启
    emergency_resttart_interval = 1m
        // 指定时间跨度

配置进程池

让各个PHP-FPM进程池都以指定的操作系统用户和用户组的身份运行,每个PHP用户一个非根用户,
这样查看和管理都很方便。

Nginx

配置虚拟主机

CentOS: /etc/nginx/conf.d/example.conf

    server {
        listen 80;
        server_name example.com;
        index index.php;
        client_max_body_size 50M;
        error_log /home/deploy/apps/logs/example.error.log;
        access_log /home/deploy/apps/logs/example.access.log;
        root  /home/deploy/apps/example.com;

        location / {
            try_files $uri $uri/ /index.php$is_args$args;
        }

        location ~ \.php {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_index index.php;
            fastcgi_pass 127.0.0.1:9000;
        }
    }

location / {}使用try_files指令查找匹配所请求的URI文件,先查询所请求的URI文件,找
不到则查询目录,也找不到会改写URL为index.php开头的,交给location ~ \.php {}处理。把
请求交给9000端口处理,前面已经设置PHP-FPM监听9000端口。

自动配置服务器

  • Puppet
  • Chef
  • Ansible
  • SaltStack

第八章:调优

php.ini文件

一般在/etc/php5/fpm/, 命令行php运行的是另一个php.ini文件,一般在/etc/php5/cli/

我也在安装目录下lib找到了这个文件。

内存

memory_limit = 128M

这个值可以考虑总共分配内存,和每个PHP进程占用内存,大概算出。也可以用apache bench或seige
做压测

Zend OPcache

主要是ini文件里一堆opcache开头的配置,用的时候查文档吧

文件上传

    file_uploads = 1
    upload_max_filesize = 10M
    max_file_uploads = 3

默认同时上传20个,每个2M,不很合适。

最长执行时间

    max_execution_time = 5

PHP进程最长用时,默认30秒太长了。
如果有长时间运行的任务,要在单独的职程中运行。

PHP中的exec()函数调用bash的at命令。用于派生单独的非阻塞进程,不耽误当前PHP进程。
exec()要使用escapeshellarg()函数转义shell参数。比如要生成一个pdf文件,
需要等待10分钟,应该单独编写一个php文件create_report.php,让
这个文件运行10分钟。

    <?php
    exec('echo "create_report.php" | at now');
    echo 'Report pending...';

create_report.php脚本在单独的后台执行,运营完毕后可以更新数据库或者通过电子邮件把
报告发给收件人。

如果要派生很多后台进程,最好用专门的队列。PHPResque等。

处理会话

php默认的会话处理会拖慢大型程序,因为需要把会话数据存储在硬盘。我们应该保存在内存中,使用
memcached或者redis。也便于伸缩,硬盘上数据不适合增加额外服务器。

使用memcashed需要安装PECL扩展,然后更改ini

缓存输出

使用较少的块发送更所数据,下面是等凑够4096字节再发

    out_buffering = 4096
    implict_flush = false

真实缓存路径

php会缓存应用使用的文件路径,这样每次包含或导入文件时就无需不断搜索包含路径了。这个缓存
叫真实路径缓存。
realpath_cache_size = 64k

第九章:部署

自动部署

  • 让部署变得简单
  • 部署结果可预知
  • 部署可逆

Capistrano

capistrano运行在本地设备,通过ssh与远程服务器通信。

capistrano的工作方式

capistrano会在远程服务器中保存之前部署的应用,而且每次部署的版本放在各自的目录中。
capistrano还会创建一个current/目录,通过符号连接指向当前部署的应用所在的目录。
当部署应用时,capistrano会首先从git仓库获取最新代码,然后把代码放到realeases/的一个
新子目录,然后把current/符号连接指向新目录。

其他工具

  • Deployer
  • Magallanes
  • Rocketeer

第十章:测试

从长远来看,测试省钱,省精力

何时测试

  • 开发前:把测试工具当做项目开发的重要依赖
  • 开发中,每个功能都要编写并运行测试
  • 开发后,编写新测试,确保修补缺陷的方式是正确的

测试什么

单元测试和功能测试

如何测试

  • 单元测试:使用PHPUnit或者PHPSpec
  • 测试驱动开发(TDD): 编写之前写测试,再开发,然后再写测试,再开发
  • 行为驱动开发(BDD): 编写故事,描述应用的表现。
    • SpecBDD:也是单元测试,使用人类能读懂的语言。比如PHPUnit风格测试命名为
      testRenderTemplate(), 等价SpecBDD命名为itRendersTheTemplate(), 而且会使用诸如
      $this->shouldReturn()、$this->shouldbe()之类易于理解的辅助方法。
    • StoryBDD:类似,但是更多关注整体行为。StoryBDD用于测试产品经理的需求(要生
      成报告,并且电子邮件发送给用户),SpecBDD测试开发的需求(这个类方法只能接收一个数组)

PHPUnit

术语:PHPUnit测试在一起组成测试用例(test case),测试用例在一起组成测试组件(test suite),
PHPUnit会使用测试运行程序(test runner)运行测试组件。

一个测试用例是一个PHP类(且以Test结尾,文件名以Test.php结尾),扩展自
PHPUnit_Framework_TestCase类。测试用例中有一些以test开头的公开方法,一个方法是一个
测试,在方法中我们断言会发生什么事。
断言可能通过也可能失败,目标是使断言都通过。

测试运行程序默认使用命令行运行程序,调用phpunit命令。

安装

PHPUnit用于测试,用composer安装;XDebug用于生成覆盖度信息,是PHP扩展,用包管理器安装。

紧接着,书中有一个具体的测试用例,用的时候找更详细的blog看看吧

使用Travis CI持续测试

原生提供钩子,可以集成github仓库,每次提交后,都能自动测试,并在多个版本中测试。

第十一章:分析

指的是分析应用的性能。

什么时候使用?

当遇到性能瓶颈时再使用。

分析器种类

  • 在开发环境:XDebug。它的结果人类读不懂,需要KCacheGrind或者WinCacheGrind形象化展示。
  • 在生产环境:XHprof,使用XHGUI展示结果。

配置

为节省资源,配置成触发执行,具体配置略

接下来讨论的是PHP的未来。

第十二章:HHVM和HACK

HHVM

传统的PHP解释器是Zend Engine, HHVM(Hip Hop Virtual Machiane)由Facebook开发,目的是
提高性能,HHVM先把PHP代码转换成字节码,然后缓存字节码,然后使用JIT编译器(Just in Time)
转换并优化成x86_64机器码。这样传统的解释型语言就有了一些编译型语言的速度。JIT提供了很多
底层性能优化。

HHVM和Zend Engine是等价的。相当于PHP+PHP-FPM。

HHVM配置也是用php.ini文件

推荐使用Supervisord监控,HHVM挂掉后立即重启。

Hack语言

他们把自己看做PHP的方言,为PHP引入了新的数据类型和结构,以及静态类型。

从PHP转向Hack

<?php改成<?hh

类型

静态语言,通常都要编译,编译器提供类型检查和错误报告,通常更稳定。缺点是要先编译,反馈回路长。

动态语言,通常解释执行,在运行时发现错误。迭代速度快,反馈及时。缺点是,没有类型检查,缺少
内在的准确性。

hack两者兼有

hack基本兼容PHP

Hack与PHP比较

查了下最新(2017年12月)的情况,PHP7性能卓越,Hack优势不明显了,前景不明。

以上就是这本书的精华,不过瘾的话强烈推荐购买。欢迎交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,206评论 5 124
  • Composer Repositories Composer源 Firegento - Magento模块Comp...
    零一间阅读 3,956评论 1 66
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 13,932评论 22 190
  • 策划人说这是一场品牌+商业的策划,主要展现了三个优势:给品牌加分、拉流量、挣钱。
    零橙阅读 89评论 0 0