使用xhprof测试slim框架的性能时,发现php抛了Segment Fault错误,试着使用gdb查看是什么导致的。

生成coredump文件

要生成php的coredump文件需要对系统进行一些配置,具体查看:Generating core-dump for php5-fpm

使用gdb调试coredump文件

执行gdb命令,因为coredump是php-fpm进程生成的,还需要指定php-fpm的路径,要不查看不了具体的代码执行信息。

$ gdb /usr/local/php5/sbin/php-fpm -c /tmp/core-php-fpm.1567 

近排开发的一个后台系统(域名:admin.test.test.com)在接入公司统一SSO时,遇到了cookie冲突引起的登录循环重定向的bug。

公司有一个统一的SSO登录页面,我们开发的系统是跳转到该页面实现登录验证的。有用户反映登录不了,浏览器提示循环重定向了,查看用户浏览器发现有两个相同名称的session cookie:

PHPSESSID=token1; path=/; expired=/; domain=.test.com  
PHPSESSID=token2; path=/; expired=/; domain=.test.test.com

显然这两个cookie的domain因为都是admin.test.test.com的根域名,使浏览器都发送到php后台系统了。第一个是后台系统(admin.test.test.com)写入的,是正确的session id,而第二个是由未知系统写入的。测试打印$_COOKIE[‘PHPSESSID’]发现输出是:

token2

很明显php读取到了错误的session id,所以导致系统读取不到保存在session中的登录信息,而误判用户为未登录,之后再把用户跳转回SSO登录页面,跳转回SSO系统后,SSO系统知道用户已登录过,再跳转回系统。。。这样就一直循环下去了=。=
为什么PHP会读取到错误的session id呢?打印全局变量$_SERVER[‘HTTP_COOKIES’]出来查看:

2013年已过,过去一年生活和工作上没有大的变化。年前的计划如英语学习,学车和游戏等都没实现到,在广州现在没什么朋友和同学在,一个人执行力太差了,周六日随便找个偷懒的理由就混过了。。。

今年在工作上是忙碍的一年,上半年忙于把CMS系统数据层切换到数据中心,下半年因公司上市,忙于把服务器从windows切换到linux,开发语言也从最熟悉的.NET转为使用PHP。这一年忙着工作,忙着加班,计划的旅游没去到,生活状态也是越过越差,而公司上市也没为收入带来什么收益,对公司有点失望透了。2014年工作准备把重心放回到生活中,不能被工作绑架了,太累了。

年前因公司策略调整,开发语言变更,很多旧同事都在上半年离职,只剩下一两个人维护频道,下半年新同事陆陆续续入职,挣了半年,春节后应该就能回复到正轨了。不过现在发现怎样也融不进新团队,也不喜欢新团队气氛,只希望年后能找到不错的工作,换下环境。

2014年就计划专业方面学下英语,golang和看多些开源代码,业余方面学下游泳和摄影。生活上希望能变得自信豁达些,让过去都过去吧。对于家人,因为从中学后就一个人出来住和生活,的确没花太多精力关注家人,希望今年能做得更好。 2013年年度选择如下:

预装编译环境

在ubuntu中执行下面命令安装编译依赖软件

> sudo apt-get install \
    libxml2-dev \
    libcurl4-openssl-dev \
    libjpeg-dev \
    libpng-dev \
    libxpm-dev \
    libmysqlclient-dev \
    libpq-dev \
    libicu-dev \
    libfreetype6-dev \
    libldap2-dev \
    libxslt-dev

php中有三个函数与捕捉运行错误有关,分别是: >set_error_handler:运行错误处理函数,php内核执行代码出错时一般是触发error,而不是抛异常,抛异常是面向对象编程中用的

set_exception_handler:运行异常信息处理函数,当代码中throw的异常没有被try-catch捕获时,就会调用该函数。php中error和exception的区别可以看这篇回答:php-exceptions-vs-errors

register_shutdown_function:脚本关闭执行函数,会在php脚本每次执行完成退出前运行。

为了保证运行错误能被顺利捕捉到,必须保证在有错的程序执行前先注册了错误处理函数。 一般错误处理代码结构如下:

由于国内网络的原因,在安装ruby相关软件时,经常会在请求rubygems.org下载时一直卡着不动,这时可以切换到淘宝的镜像源,速度嗖嗖的。

http://ruby.taobao.org/

详细的更改方法可以访问上面的网址,假如项目下有GemFile文件,还需要更改GemFile文件的配置源地址。

软件环境

继续下面的示例前,需要保证安装了下面的软件:

  • JDK 1.6
  • Android SDK
  • IntelliJ IDEA 12
  • Scala 2.10.2
  • Maven 3 >IntelliJ IDEA 12正常也可以换为Android Studio,不过因为Android Studio是基于IntelliJ IDEA 13 EAP开发的,当前scala plugin还不支持13 EAP,所以还是建议使用IntelliJ IDEA 12,等scala plugin支持最新版后,再换为Android Studio进行开发。

示例项目

hello-scaloid-maven是一个完全使用maven编译的示例项目,借助android maven plugin插件可以把代码编译为android的apk文件。 1、下载hello scaloid maven项目到本地 {% codeblock lang:ruby %} git clone https://github.com/pocorall/hello-scaloid-maven.git hello-scaloid-maven {% endcodeblock %}

工作用电脑将会切换到ubuntu上了,记录下ubuntu常用操作。

===升级到php5.4===

For Ubuntu 11.10/12.04:
sudo add-apt-repository ppa:ondrej/php5
sudo apt-get update
sudo apt-get install php5
For Ubuntu 10.04 LTS, run the following commands (Thanks to Ivan Castellanos for the extra tip):

sudo echo "deb http://ppa.launchpad.net/ondrej/php5/ubuntu lucid main" >> /etc/apt/sources.list
sudo echo "deb-src http://ppa.launchpad.net/ondrej/php5/ubuntu lucid main" >> /etc/apt/sources.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E5267A6C
sudo apt-get update
sudo apt-get install php5
You can check if PHP 5.4.x is successfully installed with this command:

php5 -v

http://www.zimbio.com/Ubuntu+Linux/articles/D_AsJR2qAL6/How+Upgrade+PHP+5+4+Ubuntu

IDA Pro是一款强大的反汇编软件,特有的IDA视图和交叉引用,可以方便理解程序逻辑和快速定位代码片断,以方便修改。 IDA视图

示例程序

下面会通过修改示例程序的输出字符串,来讲解如何使用IDA Pro。

#include

main()
{
    int n;
    scanf ("%d",&n);
    if (n > 0)
       printf("a > 0");  //后面会用IDA Pro把'a'改成'n'
    else
       printf("n < 0");
}

编译后的程序下载:demo

工作中发现一个公共组件因为某个类不带有[Serializable]特性,导致保存到memcache时出错。刚好负责的同事请假不在,尝试了iLSpy反编译方法后,最后决定使用Mono.Cecil直接修改现成的程序集dll解决。

示例代码如下:

class Program
    {
        static void Main(string[] args)
        {
            var asmFile = "TestDll.dll";  // 程序集名
            Console.WriteLine("add serializable attribute for '{0}'.", asmFile);

            var asmDef = AssemblyDefinition.ReadAssembly(asmFile, new ReaderParameters
            {
                ReadSymbols = true        // 标识是否读取修改pdb文件
            });

            // 取类名中包含"Entity"字符串的类
            var types = asmDef.Modules
                .SelectMany(m => m.Types)
                .Where(t => t.Name.Contains("Entity"));

            // 设置类为可序列化
            foreach (var type in types)
            {
                type.IsSerializable = true;
            }

            // 重新保存dll
            var newAsmFileName = "TestDll_new.dll";
            asmDef.Write(newAsmFileName, new WriterParameters
            {
                WriteSymbols = true
            });

            Console.WriteLine("new dll has save as {0}.", newAsmFileName);
        }
    }

Mono.Cecil除了可以更改特性,还能把sealed类更改为public类,功能非常强大。 下载demo