03 30,2016

使用GDB调试PHP core dump

最近线上服务器出现了访问不上的情况,查看php-fpm发现大量的WARNING: [pool www] child 11274 exited on signal 31 (SIGSYS) after 0.089068 seconds from start错误,然后php-fpm进程在不断的重启。

查看PHP的错误日记并没有太多可用信息,既然如此那就尝试抓取core dump使用gdb调试看下吧。

关于core dump

我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。

通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

core dump默认是不生成的文件,所以首先我们要开启下。

设置core dump路径

# echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern

修改ulimit允许生成core dump文件

# ulimit -c unlimited

重启php-fpm。 过一会进入/tmp,就会发现生成很多core.xxx的文件。这个时候设置关闭core dump并重启php-fpm。

# ulimit -c 0

这个时候就可以使用gdb进行调试core dump,注意因为生成core dump的是php-fpm,所以这里需要使用php-fpm进行调试。如果在cli模式使用php生成的core dump才是使用php程序进行调试。

01 06,2015

centos6安装nginx1.7.9+php5.6+mysql5.6

该文章是由于我在docker安装LNMP环境时出现的,原型是张宴大哥这篇文章:http://zyan.cc/nginx_php_v7/ ,只是做了一些软件升级变更。

软件版本

CentOS 6
NGINX 1.7.9
PHP 5.6.2
MySQL 5.6.2

安装关联库

# mkdir -p /data/tgz
# cd /data/tgz
# yum install wget
# yum install pcre
# yum install openssl*
# yum install tar
# yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make gd gd2 gd-devel gd2-devel

# ulimit -SHn 65535
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
# tar zxvf pcre-8.36.tar.gz
# cd pcre-8.36
# ./configure --prefix=/data/apps/pcre
# make && make install
# cd ../
12 28,2014

Docker创建centos的LNMP镜像

前段时间重装了系统,今天刚好有时间,就用docker安装一个lnmp开发环境,下面是我的安装笔记。

安装docker

这个就不说了,不会的可以看下我之前的文章《Docker介绍及安装》。

启动docker

# service docker start

下载docker镜像

官网docker镜像网站:https://www.docker.com/ ,可以在这里查看官网或者第三方的docker镜像。当然如果没有VPN,网络比较慢的情况下,可以考虑使用:https://docker.cn/ ,这是一个国内的镜像网站。

# docker pull docker.cn/docker/centos:centos6

说明:docker pull命令是从远程下载镜像的命令,类似git pull。docker.cn/docker/centos 是国内镜像网站centos镜像的地址,如果要下载官方centos镜像,直接使用centos即可。:centos6是指这个镜像的tag,我下载的是centos6,如果要下载最新版本,可以使用:latest或者:centos7

10 27,2014

Docker介绍及安装

Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。更详细的介绍可以看下《5分钟弄懂Docker》。

Docker安装

这里的安装环境为Centos6.4,其他系统的安装请参考这里

首先,你需要安装EPEL仓库,请看这里EPEL installation instructions

docker的包是由EPEL提供的

如果你已经安装了(不相关)的docker包,它会跟docker-io有冲突,有一个错误报告,如果想继续安装docker-io,请先删除docker。

下一步,来让我们安装docker-io在我们的主机上

升级docker-io包

# sudo yum -y install docker-io

现在我们就安装好了,让我们开始docker进程

# sudo yum -y update docker-io

如果你想让他开机启动,我们需要这样做

# sudo service docker start

现在让我们确认一下docker是否工作了

# sudo chkconfig docker on

运行了,OK你现在去运行hello word的实例吧。

# sudo docker run -i -t fedora /bin/bash
07 22,2014

PHP的Trim截取乱码

一直使用Trim过滤首尾两端的字符串,关于Trim的官方描述:

trim — 去除字符串首尾处的空白字符(或者其他字符)

今天发现一个很奇怪的问题, 代码如下:

<?php
$str = '研发、产品、';
echo trim($str, '、');

猜下这个会返回什么?“研发、产品”?NO,这个居然很奇怪的返回了“研发、产��”。

难道是我的打开方式不对,怎么会返回乱码呢。

经过一番测试,发现一个很有趣的问题。

<?php
echo trim('abacabb', 'ab');   //print 'c'

原本以为这个会返回acabb的,但是居然只返回了c。这就是对trim函数的误解了。

其实这个在官方说明文档的Example是有的,只是我没注意看而已。

trim会循环去掉字符串首位存在的字符。如上面的例子,则执行过程如下:

字符串abacabb会从下标0开始循环,如果存在ab中的字符就去掉,一直到没有就停止循环。

所以执行为:

  • 循环a存在字符串ab中,去掉,剩下bacabb
  • 循环b存在字符串ab中,去掉,剩下acabb
  • 循环a存在字符串ab中,去掉,剩下cabb
  • 循环c不存在字符串ab中,停止循环,所以去掉首字符就剩下:cabb。

但是trim是过滤首尾字符,所以还会从末尾循环去掉。

  • 循环b存在字符串ab中,去掉,剩下cab,
  • 循环b存在字符串ab中,去掉,剩下ca,
  • 循环a存在字符串ab中,去掉,剩下c,
  • 循环c不存在字符串ab中,停止循环,所以去掉末端字符就剩下:c。

所以整个结束后,abacabb就剩下了c了。看到这里对trim函数有所了解了吧。

好了,说回乱码的问题,为什么会出现返回乱码的情况呢。

这是因为在PHP中,字符串函数默认都不是 multibyte-safe 的。如果需要 multibyte-safe 则需要使用mb_系列的函数。

“、”的十六进制码为0xe3 0x80 0x81,对于不是 multibyte-safe 的函数会把它当做三个字符。

而“品”的十六进制码为0xe5 0x93 0x81。这里最后一个0x81刚好符合了,被过滤了。所以才会导致出现乱码的情况。

ok,问题找到了,trim没有mb函数,但是我们可以自己封装一个。Function mb_trim

PS:用了trim好久了,但是一直没有真正了解。看官方文档还是很重要的。

上一页 下一页