1. 记一次系统故障

    前段时间,工作中遭遇一次故障,虽然不算什么“疑难杂症”,倒也花了不少时间才真正找到故障的原因,故也值得记录一下。

    为方便读者快速理解故障,先给出系统大致的架构图:

    gxt-tech-arch

    其中,

    1. 每台Web服务器上开启12个PHP-FPM实例,并配置到Nginx的upstream,每个实例最多可以开启10个子进程
    2. “Database Proxy”的代理规则为:写操作及事务中的所有SQL操作都交给主MySQL处理,其余的读操作都交给任意一台从MySQL处理

    故障所表现的现象包括:

    1.大量请求响应为502,但每次故障发生时,错误响应一般集中在一台Web服务器,如下图所示:

    nginx-502-error

    nginx-502-count

    2.(一台或多台)MySQL数据库服务器CPU使用率飙升(但并非总是一起表现故障),如下图所示:

    mysql-slave-server-idle


    故障刚开始出现时,重启/关闭出现故障现象的MySQL服务,或将出现故障的Web服务器上所有PHP-FPM重启,也能解一时的问题,但治不了本,故障还是频繁出现。

    在故障发生时,从相关服务器上收集到的信息如下所示:

    1.出现故障现象的Web服务器 - CPU使用率、内存使用率等系统指标均正常,但PHP-FPM子进程数达到上限(12 x 10 = 120),并且PHP-FPM进程与数据库代理服务器之间的网络连接数量较多(与PHP-FPM子进程数大致相当)

    2.出现故障现象的MySQL服务器 …

    Tagged as : 笔记 故障
  2. Xhprof安装与使用

    前两天遇到一个PHP代码的bug,分析的结果是:因为要处理的数据量过大,内存分配超出了限制(php.ini中配置项memory_limit,默认是128M)。长期使用Python/PHP做Web开发,对于内存使用关注较少,这个事情让我重新关注起代码的内存占用问题,所以为工作中使用的测试开发环境配置Xhprof,进行性能数据收集分析(注:我们项目是用PHP开发的)。之所以选择Xhprof,是因为比较轻量,对性能影响较小,甚至可以一定方式用于生产环境,安装使用也方便。

    安装

    Xhprof是一个PHP扩展,安装方式与一般PHP扩展一致。

    1.从这里下载最新的源码包。假设解压缩后的文件夹为xhprof

    2.编译安装

    cd xhprof/extension
    /path/to/php/bin/phpize
    ./configure --with-php-config=/path/to/php/bin/php-config
    make
    make install …
    Tagged as : PHP 笔记 Xhprof
  3. Yii源码阅读笔记 - 错误/异常处理

    概述

    PHP区分“错误”(Error)和“异常”(Exception)。“错误”通常是由PHP内部函数抛出,表示运行时问题,当然也可以通过函数trigger_erroruser_error抛出一个用户级别的error/warning/notice信息。但在引入面向对象之后,相比使用trigger_error抛出错误,使用throw抛出异常更常用。

    对于“错误”,PHP允许配置报告哪些级别/类型错误、是否(向用户)展示错误、是否对错误记录日志、错误日志记到哪,分别对应php.ini中的配置项:error_reportingdisplay_errorslog_errorserror_log。详细信息见这里

    对于应用程序内层调用抛出的“异常”,一般可以在外层中使用try...catch来捕获并自定义处理过程。但对于“错误”(PHP运行时抛出或者应用程序使用trigger_error抛出的)或者对于-无法使用try...catch来捕获可能的异常/为了做到即使忘记捕获的异常也能得到自定义处理-的情况,该怎么办 …

    Tagged as : PHP Yii 笔记 总结
  4. 那些Python党踩过的PHP坑

    一看题目貌似本文要准备吐槽PHP,但遇到“坑”主要是因为个人经验不足。

    JSON反序列化 json_decode

    函数 json_decode 默认反序列化的结果是对象。Python党在做PHP开发用到这个方法时,很可能会跳进这个坑,认为结果应该是个数组,因为Python中json.loads返回的是一个字典。 json_decode 的第二个参数 $assoc 可用来指定反序列化的结果为数组。

    文档:http://php.net/manual/zh/function.json-decode.php


    数组序列化

    Python党初学PHP,可能类比于Python的列表和字典,认为PHP中明确区分索引数组和关联数组。但:

    PHP 实际并不区分索引数组和关联数组,都是一种有序映射。

    虽然很多时候索引数组和关联数组在表现上是不一样的,比如对以下两个数组进行序列化:

    <?php
    $arrA = array('a', 'b', 'c');
    echo json_encode($arrA) . "\n";
    
    $arrB = array('a …
    Tagged as : PHP 笔记
  5. Yii源码阅读笔记 - 自定义类自动加载

    前两天突然发现:之前的阅读笔记对于Yii应用中如何自动加载自定义类的问题没有解释。这里的自定义类是指非Yii框架本身的类。

    关于组件类的配置加载已在 Yii源码阅读笔记 - 组件集成 一文中做了较为详细的说明, 所以这里不再涉及。

    本文主要解释以下两点:

    1. Yii框架是如何找到请求对应的自定义控制器类?
    2. 在自定义控制器类中使用其他类(如Model类、或其他任意目录下文件中定义的类)时,Yii框架是如何自动加载的?

    Yii源码阅读笔记 - 应用模块化 一文中介绍类 CWebApplication 中的方法 createController , 该方法根据目标路由找到对应的控制器类文件并加载,方法中有行代码:

    $basePath=$owner->getControllerPath();
    

    这里的 getControllerPath 会返回当前应用或模块下的控制器类的存放目录,对应应用级与模块级,其实现有两处,其一是在类 CWebApplication 中:

    /**
     * @return string the directory that contains the controller classes. Defaults to 'protected/controllers'.
     */
    public function …
    Tagged as : PHP Yii 笔记 总结
  6. Slim源码阅读笔记

    以前读过 PHP - The Right Way 一文, 还翻译过其中的 The Baiscs 一节 (译文见 这里)。

    前两周读了 Modern PHP - New Features and Good Practices 一书 (读书笔记见这里), 甚是不错。

    这篇文档和这本书的作者都是Josh Lockhart, 他写了一个Web框架Slim,文档与书籍内容的精华都体现在这个框架中, 所以个人觉得这个框架值得一读。

    Slim的设计与实现都非常精简易懂,其对请求的主处理流程如下图所示:

    slim-process

    其中的核心概念包括:IoC容器、中间件、路由匹配等。

    IoC容器

    IoC,为Inversion of Control的缩写,中文翻译为“控制反转” - 是一种解决组件间依赖关系、配置和生命周期的设计模式,其最常见的实现方式为:依赖注入(DI)- 当系统 …

    Tagged as : PHP slim 笔记 总结
  7. Yii源码阅读笔记 - 日志组件

    使用

    Yii框架为开发者提供两个静态方法进行日志记录:

    Yii::log($message, $level, $category);
    Yii::trace($message, $category);
    

    两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG:

    defined('YII_DEBUG') or define('YII_DEBUG', true);
    

    Yii::log方法的调用需要指定message的level和category。category是格式为“xxx.yyy.zzz”的路径别名字符串,比如日志是在yii/framework/web/CController类中记录的,那么category为“system.web.CController”。level应为以下几种之一:

    • trace:Yii::trace方法即是使用的这个level。用于跟踪执行流
    • info:记录通用信息日志
    • profile:用于性能分析
    • warning:用于记录警告日志
    • error:用于记录重大错误日志

    要想日志真的输出到文件、邮件、web页面等地方 …

    Tagged as : PHP Yii 笔记 总结

Page 2 / 6