现代php阅读笔记系列-3

Published on 2017 - 01 - 25

今天开始进行现代php阅读笔记系列的第三篇: 部署 测试和调优。主要内容涉及到php相关的部署,测试以及调优内容。

服务器

  • 选个靠谱的服务商比啥都强。 国内我觉得阿里云不错, 国外linode, 少折腾是选择的第一标准。
  • 基于安全考虑不要一直使用root账户登录和操作服务器。设置一个deploy组和用户。必要时需要设置防火墙, Ubuntu使用ufw, Centos使用iptable实现。
  • 配置ssh服务器免登服务。至于原理,我就直接贴图了:

  • php-fpm进程管理。一般都会创建一个主进程和多个子进程,主进程管理子进程的创建和销毁, 子进程可以接受多个http请求,通过php-fpm配置可以设定子进程失败次数达到多少个之后就重启主进程。
  • php-fpm的配置项比较多。我调几个重要的说一下:
### 设置接受http请求的客户端ip地址(一个或者多个),默认是注释掉的(任何ip都可以向php-fpm请求)
listen.allow_clients = 127.0.0.1 
### 设置处理时间超过n秒的请求的慢日志路径
slowlog = /var/log/php-fpm/www-slow.log
  • nginx的设置、
### 请求体最大的容量 比如文件 音频等会触发这个上限
client_max_body_siez 50M

调优

  • php.ini配置文件的安全扫描。项目名称: iniscan
  • memory_limit 设置用于设置单个php进程使用的内存最大值。比如在进行文件操作(读写文件的时候)需要注意别触发了这个限制。
  • 最大上传文件大小的设置。php.ini配置文件中 upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须修改配置。此外你必须修改php.ini配置文件中的post_max_size选项,其代表允许POST的数据最大字节长度,默认为8M。如果POST数据超出限制,那么$_POST$_FILES将会为空。要上传大文件,你必须设定该选项值大于upload_max_filesize指令的值,我一般设定upload_max_filesize和post_max_size值相等。另外如果启用了内存限制,那么该值应当小于memory_limit选项的值。在上传大文件时,你会有上传速度慢的感觉,当超过一定的时间,会报脚本执行超过30秒的错误,这是因为在php.ini配置文件中max_execution_time配置选项在作怪,其表示每个脚本最大允许执行时间(秒),0 表示没有限制。你可以适当调整max_execution_time的值,不推荐设定为0。
  • php输出缓存功能。 主要涉及了 ob_start ob_get_contents ob_end_flush等这几个ob打头的函数。应用场景一般是用在模板缓存技术上了(将生成的子串存储到文件里面,下次渲染页面的时候直接输出文件内容)。 贴段代码看下缓存页面输出的例子:
<?php  
//ob_start():页面缓存开始的标志,此函数一下的内容直至ob_end_flush()或者ob_end_clean()都保存在页面缓存中;
//ob_get_contents():用来获取页面缓存中的内容,获取到以后呢,我们就可以想怎么处理这些内容都行了,过滤字段啦,匹配内容啦,都可以~~~ :)
//ob_end_flush():表示页面缓存结束。并且经我验证,缓存的内容将输出到当前页面上,也就是可以显示缓存内容。
$_time =10;  
$dir="D:\\php\\";  
  
function cache_start($_time, $dir)  
{  
  $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';  
  $cachetime = $_time;  
  ob_start();  
  if(file_exists($cachefile) && (time()-filemtime($cachefile) < $cachetime))  
  {  
    include($cachefile);  
    ob_end_flush();  
    exit;  
  }  
}  
  
function cache_end($dir)  
{  
  $cachefile = $dir.'/'.sha1($_SERVER['REQUEST_URI']).'.html';  
  $fp = fopen($cachefile, 'w');  
  fwrite($fp, ob_get_contents());  
  fclose($fp);  
  ob_end_flush();  
}  
  
cache_start($_time, $dir);  
//以下是输出的内容,放在cache_start和cache_end两个方法之间  
for ($i=0;$i<5;$i++)  
{  
  echo $i;  
  sleep(1);  
}  
cache_end($dir);  
?>   

此外还有一些http://blog.sina.com.cn/s/blog_646e51c40100weu9.html">例子

  • php.ini里面的内容也有可以进行调优的地方。就举一个之前没见过的例子吧。
### 真实路径缓存. 每次导入和包含文件的时候无需不断搜索包括路径了
realpath_cache_seize = 64k

部署

  • 部署需要满足自动化以及可回滚。

测试

  • 单元测试可以尝试使用phpunit
  • 测试分为 TDD 和 BDD, 相关的区别

性能分析

  • xdebug比var_dump在开发阶段更多的错误细节和结果细节,就是安装比较费劲
  • 线上php的性能分析可以使用facebook的xhprof,搭配xhgui这个项目的界面可以更加清晰的分析php的性能,以及还可以看到相互的调用链关系。值得尝试。
  • paas的性能分析。new relic 以及 blackfire。 这里说说new relic,之前自己做兴趣项目的时候,线上的监控用的就是new relic,不管是服务器的,还是框架的,还是前端的,他都会进行性能监控,此外页面还很漂亮,对于个人项目免费的额度又足够,相当棒。老外的这方面产品就是赞。
  • supervisor可以用来监控一些脚本或者进程。supervisor 是用python编写的一款应用,可以监控你的脚本执行情况,如果脚本挂了,他可以自动重启,服务器重启的时候,它也会自动重启,相当好用。

hhvm和hack

  • 这个章节就不多说了,建议大家新项目都用php7就好了。开启严格模式的php其实在某些方面和静态语言差不太多了。

作者

  • 作者不仅仅写了这边书,还写了业界出门的php之道,以及一个轻量级但是现代化的php框架 Slim。Slim的代码非常值得大家学习,总共也就8k行。比Laravel这种重型架子小多了,但是Ioc,容器这些东西该有的都有。感兴趣的可以去github下载阅读。

感想

  • 到此这本书的笔记就写完了。整理笔记相当于重新又读了一遍书,之前都喜欢在书上做标记,偶然的一天想把好久没搭理的博客捡起来,然后三个周末的时候写了三篇博客,写完了后发现做笔记,总结对自己加深理解是非常有帮助的,因为一些知识点的话必须要自己亲手实践后才敢写出来。以后的技术书籍的阅读有时间的话都会采取这种方式。

相关连接:

Comments
Write a Comment