04/29/14

php-5.3 下安装pear 和 pecl

环境描述:服务器php安装好之后,bin目录下没有pecl、pear等命令,从而导致安装memcache、apc等php扩展比较麻烦。

一、安装pear、pecl

1、下载go-pear

[root@yf_web_115 bin]# curl -o go-pear.php http://pear.php.net/go-pear.phar
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 3987k  100 3987k    0     0  30213      0  0:02:15  0:02:15 –:–:–  117k

2、php 执行go-pear

[root@yf_web_115 bin]# /opt/phpdba/php-5.3.27/bin/php go-pear.php

Below is a suggested file layout for your new PEAR installation.  To
change individual locations, type the number in front of the
directory.  Type ‘all’ to change all of them or simply press Enter to
accept these locations.

1. Installation base ($prefix)                   : /opt/phpdba/php-5.3.27
2. Temporary directory for processing            : /tmp/pear/install
3. Temporary directory for downloads             : /tmp/pear/install
4. Binaries directory                            : /opt/phpdba/php-5.3.27/bin
5. PHP code directory ($php_dir)                 : /opt/phpdba/php-5.3.27/share/pear
6. Documentation directory                       : /opt/phpdba/php-5.3.27/docs
7. Data directory                                : /opt/phpdba/php-5.3.27/data
8. User-modifiable configuration files directory : /opt/phpdba/php-5.3.27/cfg
9. Public Web Files directory                    : /opt/phpdba/php-5.3.27/www
10. Tests directory                               : /opt/phpdba/php-5.3.27/tests
11. Name of configuration file                    : /opt/phpdba/php-5.3.27/etc/pear.conf

1-11, ‘all’ or Enter to continue:
Beginning install…
Configuration written to /opt/phpdba/php-5.3.27/etc/pear.conf…
Initialized registry…
Preparing to install…
installing phar:///opt/phpdba/php-5.3.27/bin/go-pear.php/PEAR/go-pear-tarballs/Archive_Tar-1.3.11.tar…
installing phar:///opt/phpdba/php-5.3.27/bin/go-pear.php/PEAR/go-pear-tarballs/Console_Getopt-1.3.1.tar…
installing phar:///opt/phpdba/php-5.3.27/bin/go-pear.php/PEAR/go-pear-tarballs/PEAR-1.9.4.tar…
installing phar:///opt/phpdba/php-5.3.27/bin/go-pear.php/PEAR/go-pear-tarballs/Structures_Graph-1.0.4.tar…
installing phar:///opt/phpdba/php-5.3.27/bin/go-pear.php/PEAR/go-pear-tarballs/XML_Util-1.2.1.tar…
install ok: channel://pear.php.net/Archive_Tar-1.3.11
install ok: channel://pear.php.net/Console_Getopt-1.3.1
install ok: channel://pear.php.net/Structures_Graph-1.0.4
install ok: channel://pear.php.net/XML_Util-1.2.1
install ok: channel://pear.php.net/PEAR-1.9.4
PEAR: Optional feature webinstaller available (PEAR’s web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR’s PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR’s PHP-GTK2-based installer)
PEAR: To install optional features use “pear install pear/PEAR#featurename”

******************************************************************************
WARNING!  The include_path defined in the currently used php.ini does not
contain the PEAR PHP directory you just specified:
</opt/phpdba/php-5.3.27/share/pear>
If the specified directory is also not in the include_path used by
your scripts, you will have problems getting any PEAR packages working.

Would you like to alter php.ini </opt/phpdba/php-5.3.27/etc/php.ini>? [Y/n] : Y

php.ini </opt/phpdba/php-5.3.27/etc/php.ini> include_path updated.

Current include path           : .:
Configured directory           : /opt/phpdba/php-5.3.27/share/pear
Currently used php.ini (guess) : /opt/phpdba/php-5.3.27/etc/php.ini
Press Enter to continue:

** WARNING! Old version found at /opt/phpdba/php-5.3.27/bin, please remove it or be sure to use the new /opt/phpdba/php-5.3.27/bin/pear command

The ‘pear’ command is now at your service at /opt/phpdba/php-5.3.27/bin/pear

** The ‘pear’ command is not currently in your PATH, so you need to
** use ‘/opt/phpdba/php-5.3.27/bin/pear’ until you have added
** ‘/opt/phpdba/php-5.3.27/bin’ to your PATH environment variable.

Run it without parameters to see the available actions, try ‘pear list’
to see what packages are installed, or ‘pear help’ for help.

For more information about PEAR, see:

http://pear.php.net/faq.php

http://pear.php.net/manual/

Thanks for using go-pear!

3、检查php/bin目录下pear pecl

[root@yf_web_115 bin]# ls
go-pear.php  pear  peardev  pecl  phar  phar.phar  php  php-config  phpize

二、安装过程中遇到的问题

[root@yf_web_115 bin]# curl -o go-pear.php http://pear.php.net/go-pear
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 88959  100 88959    0     0  54233      0  0:00:01  0:00:01 –:–:– 76033

[root@yf_web_115 bin]# /opt/phpdba/php-5.3.27/bin/php go-pear.php
Sorry!  Your PHP version is too new (5.3.27) for this go-pear.
Instead use http://pear.php.net/go-pear.phar for a more stable and current
version of go-pear, more suited to your PHP version.

Thank you for your coopertion and sorry for the inconvenience

原因:go-pear.php 版本比较旧,下载新版本go-pear.php就可以解决问题。

三、知识详解

PECL

即PHP Extension Community Library, PHP扩展库.
这里的扩展指的是使用C语言编写的动态链接库扩展, 通过php.ini配置, 并随PHP进程被装入内存.

常见的PECL扩展比如:

  • apc – 字节码缓存器
  • xdebug – 调试工具
  • PDO_xxoo – 数据库驱动
  • memcache, mongo – NoSQL数据库驱动
  • markdown – 文本处理器
  • zip – 压缩算法

这种动态链接库又分两种, 一种是用户空间扩展, 如mongo, markdown, 旨在通过C代码提升性能, 为PHP代码提供更好的抽象.
另一种是Zend扩展, 这是对Zend内核(PHP引擎内核)的扩展, 如apc, xdebug.

PECL在Windows上并不好用, 通常的做法是直接下载形式如php_xxoo.dll的已编译好的二进制动态链接库.
下载时还应该选择对应PHP版本号, 处理器指令集, 线程安全性的版本.
据说PECL的基础设施还在建设中, 目前有个简陋的网页(http://downloads.php.net/pierre/)可以下载到一部分编译好的Windows PECL扩展.

而在Linux则方便不少, 比如要安装apc, 只需:

pecl install apc

即可, pecl是PHCL的命令行工具, 可以自动完成扩展的安装(通常是下载源代码后自动编译)工作.

PEAR

即PHP Extension and Application Repository, PHP扩展和应用库.
这里的扩展和应用, 指的是用PHP编写的软件包, 一系列类库性质的PEAR包会被安装到PHP的根目录, 然后你就可以在你的代码中直接包含(require)这些类库.

常见的PEAR包如:

  • phpDocumentor – 文档提取工具
  • PHPUnit – 单元测试框架
  • DB – 数据库封装

PEAR希望创建一个规范化的PHP源代码包仓库, PEAR本身也对源代码的格式提出了一些要求, 以便于让源码包更加通用和规范.
同时PEAR也是PECL的上级项目, PECL是PEAR的一部分, pecl的命令行工具也包含在PEAR中.

#安装标配的源码包:
pear install db
#PEAR也采用了`软件源`的设计, 安装非标配的软件包如phpunit, 需要先添加频道(软件源)
pear channel-discover pear.phpunit.de
pear install phpunit

PHAR

PHAR即PHP Archive, 起初只是PEAR中的一个库而已, 后来在PHP5.3后被重新编写成C扩展并内置到PHP中.
PEAR用来将多个.php脚本打包(也可以打包其他文件)成一个.phar的压缩文件(通常是ZIP格式).
目的在于模仿Java的.jar, 不对, 目的是为了让发布PHP应用程序更加方便. 同时还提供了数字签名验证等功能.

.phar文件可以像.php文件一样, 被PHP引擎解释执行, 同时你还可以写出这样的代码来包含(require) .phar 中的代码.

require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");

PEAR中的很多源码包都通过PHAR打包.

bcompiler

提到了PHAR, 我还不得不提一下bcompiler, PHP bytecode Compiler, PHP字节码编译器.
虽然它目前只是个实验性项目. 可以通过pecl安装.

很多PHP编写的商业软件, 有闭源的需要, 通常它们会选择Zend Guard等商业代码加密软件, 它们成熟稳定, 但也价格昂贵.
其实bcompiler就能满足这个需求, 它可以将PHP代码编译成字节码, 虽然保密性不及商业加密软件, 但也很难被轻易修改, 而且因为省去了生成字节码的过程, 会有不少的性能提升, 官方表示编译后体积会减少到原来的20%, 性能会提高30%.

使用bcompiler编译出的PHP字节码文件可以直接使用(就像PEAR那样):

// xxoo.exe 是 xxoo.php 编译后的字节码.
require("xxoo.exe");

 

04/22/14

tcpdump 抓取MySQL执行语句

一、环境描述
192.168.1.116:3320 MySQL实例
192.168.1.118 当前主机
两台主机em2均为内网,em1为外网网口
二、命令实例
1、抓取当前主机与192.168.1.116的3320端口数据库实例sql,实时输出符号条件的sql,Ctrl+c 停止抓取。
tcpdump -i em2 -s 0 -l -w – dst 192.168.1.116 and port 3320|strings |grep -i -E ‘select|update|insert|delete|set’
2、在第1个基础上,可以指定抓取多少个包
tcpdump -i em2 -s 0 -l -c 10000 -w – dst 192.168.1.116 and port 3320|strings |grep -i -E ‘select|update|insert|delete|set’
3、在192.168.1.116实现上述功能
tcpdump -i em2 -c 2000 -w – dst port 3320|strings –target=utf8|grep -i -E ‘select|update|insert|delete|set’
4、tcpdump 结合perl
tcpdump -i em2 -s 0 -w – dst port 3320| strings –target=utf8| perl -e ‘
while(<>) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL)/i) {
if (defined $q) { print “$q\n”; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=” $_”;
}
}’

三、tcpdump用法
1、tcpdump采用命令行方式,它的命令格式为:
  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
          [ -T 类型 ] [ -w 文件名 ] [表达式 ]
2、tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)

04/4/14

Dell R720 内存丢失报错

一、环境描述

a、centos 系统正常识别所有内存

b、/var/log/message 日志中大量保存kernel: sbridge: HANDLING MCE MEMORY ERROR

c、机房接显示器报错如下图:

error_log

 

二、处理方法

1 、 交换CPu1 与CPu2的内存

2、进入BIOS相应设置

开机看到dell标志时,按F2键à“System BIOS Setting” à“System Profile”

(若有)请更改为Maxmum Performance。

或者选择为custom,确保一下4项都处于diable。

3

04/4/14

haproxy+keepalived+mysql+xinetd 实现 mysql 双机机制

1、功能描述

a、192.168.0.103 (以下称103,vip:192.168.0.123),192.168.0.104(以下称104,vip:192.168.0.124)分别部署haproxy,并通过keepalived绑定vip(103->123,104->124)。

b、程序代码通过vip连接数据库,103、104各部署一套slave,104从103slave同步。

c、当103宕机,123ip迁移到104。此时104同时有123、124两个vip,并响应123和124数据库请求。同理,104宕机时,103同时为vip123,124提供服务。

d、haproxy通过xinetd服务,启动mysqlchk服务。数据库正常返回http 200,异常则返回503.

e、优点:一、程序迁移数据库改动比较少,运维可完全控制。二、运维可根据情况,安排调节slave使用权重,合理配置资源。三、高可用行,大大减少了单点故障影响。

2、部署过程

a、haproxy.cfg

global
log 127.0.0.1 local3 notice
maxconn 20480
uid mysql
gid mysql
daemon
nbproc 1
pidfile /opt/phpdba/haproxy/logs/haproxy.pid

defaults
option  dontlognull
retries 3
option  redispatch
#maxconn 20480
contimeout      5000
clitimeout      50000
srvtimeout      50000

frontend db_baobao_read
bind :33080
default_backend cluster_db_baobao_read

frontend db_baobao_write
bind :33081
default_backend cluster_db_baobao_write

frontend db_user_write
bind :8066
default_backend cluster_db_user_write

frontend web_haproxy
bind :80
default_backend web_status

backend cluster_db_baobao_read
mode tcp
option tcpka
balance roundrobin
option httpchk
server db103_slave 192.168.0.103:3316 weight 1 check port 8890 inter 1s rise 5 fall 3
server db104_slave 192.168.0.104:3316 weight 1 check port 8890 inter 1s rise 5 fall 3

backend cluster_db_baobao_write
mode tcp
option tcpka
balance roundrobin
option httpchk
server db110_master 192.168.0.110:3308 weight 1 check port 8890 inter 1s rise 5 fall 3

backend cluster_db_user_write
mode tcp
option tcpka
balance roundrobin
option httpchk
server db46_master 192.168.0.46:3306 weight 1 check port 8890 inter 1s rise 5 fall 3

backend web_status
mode http
stats enable
#stats scope
stats hide-version
stats refresh 5s
stats uri /status
stats realm Haproxy\ statistic
stats auth chen-123:phpdba

 

b、keepalvied_db.conf

! Configuration File for keepalived
global_defs {
router_id LVS_db_ci104
}

vrrp_script chk_http_port {
script “/opt/phpdba/keepalived/etc/keepalived/check_haproxy.sh”
interval 2
weight -10
}

vrrp_instance VI_CiUser {
state BACKUP
interface em2
virtual_router_id 58
priority 99
advert_int 1

authentication {
auth_type PASS
auth_pass phpdba
}

virtual_ipaddress {
192.168.0.123 dev em2 label em2:0
}
}

vrrp_instance VI_CiBlog_QQ {
state MASTER
interface em2
virtual_router_id 68
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass phpdba
}

track_script {
chk_http_port
}

virtual_ipaddress {
192.168.0.124 dev em2 label em2:1
}
}

c、check_haproxy.sh

#!/bin/bash
A=`ps -C haproxy –no-header |wc -l`
if [ $A -eq 0 ];then
/opt/phpdba/haproxy/sbin/haproxy -f /opt/phpdba/haproxy/conf/haproxy.cfg
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi

d、/etc/xinetd.d/mysqlchk

service mysqlcheck
{
flags           = REUSE
socket_type     = stream
port            = 8890
wait            = no
user            = root
server          = /opt/phpdba/keepalived/etc/keepalived/mysqlchk.sh
log_on_failure  += USERID
disable         = no
only_from       = 192.168.0.0/24
}

e、/opt/phpdba/keepalived/etc/keepalived/mysqlchk.sh

#!/bin/bash

MYSQL_HOST=”192.168.0.104″
MYSQL_PORT=”3316″
MYSQL_USERNAME=”admin”
MYSQL_PASSWORD=”123456″
MYSQL_MAXTHREADNUM=”200″

ERROR_MSG=`/opt/phpdba/mysql/bin/mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USERNAME -p$MYSQL_PASSWORD -e “show databases;” 2>/dev/null`

if [ "$ERROR_MSG" != "" ]
then
/bin/echo -e “HTTP/1.1 200 OK\r\n”
/bin/echo -e “Content-Type: Content-Type: text/plain\r\n”
/bin/echo -e “\r\n”
/bin/echo -e “MySQL is running. \r\n”
/bin/echo -e “\r\n”
else
/bin/echo -e “HTTP/1.1 503 Service Unavailable\r\n”
/bin/echo -e “Content-Type: Content-Type: text/plain\r\n”
/bin/echo -e “\r\n”
/bin/echo -e “MySQL is down. \r\n”
/bin/echo -e “\r\n”
fi

f、/etc/services

mysqlcheck      8890/tcp
mysqlcheck      8890/udp

g、xinetd

yum install xinetd -f   &&  /etc/init.d/xinetd start

h、keepalvied

/etc/init.d/keepalived start

3、遇到的问题

a、haproxy 配置中check port 同一ip同一端口,只能监控一次。同一ip多个mysql实例监控,采用不同端口监控。

b、防火墙禁止了8890端口访问,导致check port失败。(iptables -I INPUT -p tcp –dport 8890 -j ACCEPT)

4、haproxy 状态页面

haproxy