CentOS 5.3 初始使用yum安装的php最高也只有5.1.6的,这是因为官方的yum库里最高就只有这个了。如何升级到高版本呢,
用下面的方法,我这已经升级到php5.3.1了,有点意外啊,呵呵,想想当初在windows下,装个5.3的版本都特别的费劲,linux下用yum,也有好处。当然这里还是提醒大家,最好还是用编译安装好点~
本站是web开发 企业建站的聚集地,一起来看看教程吧
CentOS5.3的php版本默认为5.1.6,然后在5.2.9版本之前的的php都存在一个漏洞,但是目前网上很多地方都无法使用yum update php*升级到5.2.9,比较常见的是升级到5.2.6版本的,经过搜索国外资料,现在终于找到一种升级CentOS的php到5.2.9的方法。
注意,此方法只能在官方的php版本上升级,如果你使用网上的升级到5.2.6版本的升级方法已经升级了,将无法使用本方法升级php。
运行下面命令:
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/5/remi/i386/remi-release-5-7.el5.remi.noarch.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
然后编辑/etc/yum.repos.d/remi.repo
#vi /etc/yum.repos.d/remi.repo
在这个文件的最后增加一行:
priority=1
保存退出。
/etc/yum.repos.d/epel.repo和/etc/yum.repos.d/epel-testing.repo这两个文件也按照上面的方法进行编辑!
使用下面的命令进行升级,但是经过测试,如果单独升级php将提示失败,只有联通mysql一起升级才可以,所以我们必须执行以下命令才能升级php到5.2.9版本:
yum --enablerepo=remi update php* mysql*
转自:开源ISPCP社区 http://www.ispcpcn.com/article/13/
用下面的方法,我这已经升级到php5.3.1了,有点意外啊,呵呵,想想当初在windows下,装个5.3的版本都特别的费劲,linux下用yum,也有好处。当然这里还是提醒大家,最好还是用编译安装好点~
本站是web开发 企业建站的聚集地,一起来看看教程吧
CentOS5.3的php版本默认为5.1.6,然后在5.2.9版本之前的的php都存在一个漏洞,但是目前网上很多地方都无法使用yum update php*升级到5.2.9,比较常见的是升级到5.2.6版本的,经过搜索国外资料,现在终于找到一种升级CentOS的php到5.2.9的方法。
注意,此方法只能在官方的php版本上升级,如果你使用网上的升级到5.2.6版本的升级方法已经升级了,将无法使用本方法升级php。
运行下面命令:
wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/5/remi/i386/remi-release-5-7.el5.remi.noarch.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
然后编辑/etc/yum.repos.d/remi.repo
#vi /etc/yum.repos.d/remi.repo
在这个文件的最后增加一行:
priority=1
保存退出。
/etc/yum.repos.d/epel.repo和/etc/yum.repos.d/epel-testing.repo这两个文件也按照上面的方法进行编辑!
使用下面的命令进行升级,但是经过测试,如果单独升级php将提示失败,只有联通mysql一起升级才可以,所以我们必须执行以下命令才能升级php到5.2.9版本:
yum --enablerepo=remi update php* mysql*
转自:开源ISPCP社区 http://www.ispcpcn.com/article/13/
CentOS 5.4环境下的php5.3.1手动安装
Cent自带的版本是5.1.16,现下载php5.3.1安装包tar.gz,解压到/usr/local/src中
执行下述命令:
Cent自带的版本是5.1.16,现下载php5.3.1安装包tar.gz,解压到/usr/local/src中
执行下述命令:
./configure \
"--prefix=/usr/local/php" \
"--with-apxs2=/usr/sbin/apxs" \
"--with-config-file-path=/usr/local/php/etc" \
"--with-mysql=/usr/local/mysql" \
"--with-mysqli" \
"--with-libxml-dir=/usr/lib/libxml" \
"--with-gd" \
"--with-pdo-mysql" \
"--with-pdo-sqlite" \
"--with-jpeg-dir" \
"--with-png-dir" \
"--with-bz2" \
"--with-pear=/usr/lib/pear" \
"--with-freetype-dir" \
"--with-iconv-dir" \
"--with-zlib-dir " \
"--with-mcrypt=/usr/lib/libmcrypt" \
"--enable-sockets" \
"--enable-soap" \
"--enable-sqlite-utf8" \
"--enable-gd-native-ttf" \
"--enable-ftp" \
"--enable-mbstring" \
"--enable-exif" \
"--disable-ipv6" \
"--disable-cgi"
"--prefix=/usr/local/php" \
"--with-apxs2=/usr/sbin/apxs" \
"--with-config-file-path=/usr/local/php/etc" \
"--with-mysql=/usr/local/mysql" \
"--with-mysqli" \
"--with-libxml-dir=/usr/lib/libxml" \
"--with-gd" \
"--with-pdo-mysql" \
"--with-pdo-sqlite" \
"--with-jpeg-dir" \
"--with-png-dir" \
"--with-bz2" \
"--with-pear=/usr/lib/pear" \
"--with-freetype-dir" \
"--with-iconv-dir" \
"--with-zlib-dir " \
"--with-mcrypt=/usr/lib/libmcrypt" \
"--enable-sockets" \
"--enable-soap" \
"--enable-sqlite-utf8" \
"--enable-gd-native-ttf" \
"--enable-ftp" \
"--enable-mbstring" \
"--enable-exif" \
"--disable-ipv6" \
"--disable-cgi"
enca 文件名
linux文件名编码批量转换
convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK --notest utf8编码的文件名
Linux下批量转换文件内容编码
1.使用enca,例如要把当前目录下的所有文件都转成utf-8
$enca -x utf-8 *
2,使用iconv 转换
iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
比如将一个UTF-8 编码的文件转换成GBK编码
iconv -f GBK -t UTF-8 file1 -o file2
linux文件名编码批量转换
convmv -f 源编码 -t 新编码 [选项] 文件名
常用参数:
-r 递归处理子文件夹
–notest 真正进行操作,请注意在默认情况下是不对文件进行真实操作的,而只是试验。
–list 显示所有支持的编码
–unescap 可以做一下转义,比如把%20变成空格
比如我们有一个utf8编码的文件名,转换成GBK编码,命令如下:
convmv -f UTF-8 -t GBK --notest utf8编码的文件名
Linux下批量转换文件内容编码
1.使用enca,例如要把当前目录下的所有文件都转成utf-8
$enca -x utf-8 *
2,使用iconv 转换
iconv的命令格式如下:
iconv -f encoding -t encoding inputfile
比如将一个UTF-8 编码的文件转换成GBK编码
iconv -f GBK -t UTF-8 file1 -o file2
查看linux文件目录的大小和文件夹包含的文件数
统计总数大小
du -sh xmldb/
du -sm * | sort -n //统计当前目录大小 并安大小 排序
du -sk * | sort -n
du -sk * | grep guojf //看一个人的大小
du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字
查看此文件夹有多少文件 /*/*/* 有多少文件
du xmldb/
du xmldb/*/*/* |wc -l
40752
解释:
wc [-lmw]
参数说明:
-l :多少行
-m:多少字符
-w:多少字
df 查看硬盘的总容量、已用容量与inode等
du 查看文件已用容量
df -[ikm]
-i 使用i-nodes显示结果
-k 使用KB显示结果
-m 使用MB显示结果
du [-abckms] [目录名称]
-a 列出所有文件与目录,默认值是列出目录的值
-b 列出的值以b输出
-c 最后求总total
-k 列出的值 以KB输出
-m 列出的值以mb输出
-s 只列出最后求总的值
统计总数大小
du -sh xmldb/
du -sm * | sort -n //统计当前目录大小 并安大小 排序
du -sk * | sort -n
du -sk * | grep guojf //看一个人的大小
du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字
查看此文件夹有多少文件 /*/*/* 有多少文件
du xmldb/
du xmldb/*/*/* |wc -l
40752
解释:
wc [-lmw]
参数说明:
-l :多少行
-m:多少字符
-w:多少字
df 查看硬盘的总容量、已用容量与inode等
du 查看文件已用容量
df -[ikm]
-i 使用i-nodes显示结果
-k 使用KB显示结果
-m 使用MB显示结果
du [-abckms] [目录名称]
-a 列出所有文件与目录,默认值是列出目录的值
-b 列出的值以b输出
-c 最后求总total
-k 列出的值 以KB输出
-m 列出的值以mb输出
-s 只列出最后求总的值
一个日记文件很大 很难打开我想通过命令把最后几行输入到一新文本知道怎么做吗?
tail -n 10 filename
查看filename的最后10行
后面再加文件名,可将最后10行导出到新文件
tail -n filename > newfile
其中 -n 的 n 为文件最后的几行,
结果重新定向到一个新文件newfile去。
tail -f 可以保持显示新加入到log中的数据
tail filenmae -n num
tail -n 10 filename
查看filename的最后10行
后面再加文件名,可将最后10行导出到新文件
tail -n filename > newfile
其中 -n 的 n 为文件最后的几行,
结果重新定向到一个新文件newfile去。
tail -f 可以保持显示新加入到log中的数据
tail filenmae -n num
二十岁的时候,晚上搂着女友,在校园散步,突然冲出一老头老太,手持电筒,臂套红袖,
执行学校给他们的唯一权利:用手电晃了晃,说:分开分开!
三十岁的时候,I HAVE A DREAM:一天夜里,我潜回母校,又碰上那老头,老太,
我用一只明晃晃的手电筒对他们晃晃,然后说:搂起来搂起来!
二十岁的时候,去看画展,走到一幅裸女前,告戒自己:这是艺术,我在审美!
康德说过:审美是不带功利目的的!
三十岁的时候,会把性感女郎的图片做办公室电脑的屏保,
每天和人开几个荤玩笑。
二十岁的时候,如果碰上现在的自己,肯定会厌恶----白教育了这么多年,简直是浪费!
三十岁的时候,如看看二十岁的自己,会想:我们的教育有问题。
二十岁的时候,我们会当众指出老师的错误,很自豪!
三十岁的时候,只会对领导的英明表示认同,很##!
二十岁的时候,最欣赏“引到成一快,不负少年头!”
三十岁的时候,少年头早没了,只剩引刀——剃刀!
执行学校给他们的唯一权利:用手电晃了晃,说:分开分开!
三十岁的时候,I HAVE A DREAM:一天夜里,我潜回母校,又碰上那老头,老太,
我用一只明晃晃的手电筒对他们晃晃,然后说:搂起来搂起来!
二十岁的时候,去看画展,走到一幅裸女前,告戒自己:这是艺术,我在审美!
康德说过:审美是不带功利目的的!
三十岁的时候,会把性感女郎的图片做办公室电脑的屏保,
每天和人开几个荤玩笑。
二十岁的时候,如果碰上现在的自己,肯定会厌恶----白教育了这么多年,简直是浪费!
三十岁的时候,如看看二十岁的自己,会想:我们的教育有问题。
二十岁的时候,我们会当众指出老师的错误,很自豪!
三十岁的时候,只会对领导的英明表示认同,很##!
二十岁的时候,最欣赏“引到成一快,不负少年头!”
三十岁的时候,少年头早没了,只剩引刀——剃刀!
官方网站
http://spyc.sourceforge.net/
DownLoad:
spyc-0.4.5.zip
Spyc只有2个类方法
php.ini读取ini的解析方式那种配置没法支持多维数组,So,我对yaml生成多维数组很感兴趣,主要想做一下配置文件,如下:
yml:
switches:
转为php多维数组如下:
spyc.yaml :
test.php
PHP code:
特别注意:冒号后需要有一个空格,{} 是php哈希,key=>value ,{key: value},空格。
{one: 1, two: 2},one=>1,two=>2,注意1, two,空格,1逗号后面要有空格!!!否则就变为:
[secondson] => Array
(
[one] => Array
(
[1,two] => 2
)
)
而不是:
[secondson] => Array
(
[one] => 1
[two] => 2
)
这就是:secondson: {one: 1,two: 2} 和 secondson: {one: 1, two: 2} 的区别,空格是yaml的解析核心!!!
关于| 和 >
family:
注意对齐:这儿的name是4个空格,这儿就ddd前面有4个,如果是familiy,那就是2个,否则解析会出问题。
结果:
Array
(
[family] => Array
(
[name] => 'ddd
dfdf
dfd'
)
[family2] => Array
(
[name] => 'ddd dfdf dfd'
)
)
换行和空格的转换, | 为换行,>空格!
http://spyc.sourceforge.net/
DownLoad:
spyc-0.4.5.zip
Spyc只有2个类方法
include('spyc.php');
// 读取YAML文件,生成数组
$yaml = Spyc::YAMLLoad('spyc.yaml');
// 将数组转换成YAML文件
$array['name'] = 'andy';
$array['site'] = '21andy.com';
$yaml = Spyc::YAMLDump($array);
// 读取YAML文件,生成数组
$yaml = Spyc::YAMLLoad('spyc.yaml');
// 将数组转换成YAML文件
$array['name'] = 'andy';
$array['site'] = '21andy.com';
$yaml = Spyc::YAMLDump($array);
php.ini读取ini的解析方式那种配置没法支持多维数组,So,我对yaml生成多维数组很感兴趣,主要想做一下配置文件,如下:
yml:
switches:
- { row: 0, col: 0, func: {tx: [0, 1]} }
转为php多维数组如下:
spyc.yaml :
family:
name:xiangs
general:{frist: {sonone:jackxinag, second: jjjjj}, secondson: {one: 1, two: 2}}
name:xiangs
general:{frist: {sonone:jackxinag, second: jjjjj}, secondson: {one: 1, two: 2}}
test.php
<?php
include('spyc.php');
// 读取YAML文件,生成数组
$yaml = Spyc::YAMLLoad('spyc.yaml');
print_r($yaml);
?>
include('spyc.php');
// 读取YAML文件,生成数组
$yaml = Spyc::YAMLLoad('spyc.yaml');
print_r($yaml);
?>
PHP code:
Array
(
[family] => Array
(
[name] => xiangs
[general] => Array
(
[frist] => Array
(
[0] => sonone:jackxinag
[second] => jjjjj
)
[secondson] => Array
(
[one] => 1
[two] => 2
)
)
)
)
(
[family] => Array
(
[name] => xiangs
[general] => Array
(
[frist] => Array
(
[0] => sonone:jackxinag
[second] => jjjjj
)
[secondson] => Array
(
[one] => 1
[two] => 2
)
)
)
)
特别注意:冒号后需要有一个空格,{} 是php哈希,key=>value ,{key: value},空格。
{one: 1, two: 2},one=>1,two=>2,注意1, two,空格,1逗号后面要有空格!!!否则就变为:
[secondson] => Array
(
[one] => Array
(
[1,two] => 2
)
)
而不是:
[secondson] => Array
(
[one] => 1
[two] => 2
)
这就是:secondson: {one: 1,two: 2} 和 secondson: {one: 1, two: 2} 的区别,空格是yaml的解析核心!!!
关于| 和 >
family:
name: |
'ddd
dfdf
dfd'
family2:
name: >
'ddd
dfdf
dfd'
'ddd
dfdf
dfd'
family2:
name: >
'ddd
dfdf
dfd'
注意对齐:这儿的name是4个空格,这儿就ddd前面有4个,如果是familiy,那就是2个,否则解析会出问题。
结果:
Array
(
[family] => Array
(
[name] => 'ddd
dfdf
dfd'
)
[family2] => Array
(
[name] => 'ddd dfdf dfd'
)
)
换行和空格的转换, | 为换行,>空格!
<?php
include "Spyc.class.php";
function parseYaml($string){
$data = Spyc::YAMLLoadString($string);
return $data;
}
?>
include "Spyc.class.php";
function parseYaml($string){
$data = Spyc::YAMLLoadString($string);
return $data;
}
?>
memcached的基本设置:
[/code]
每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB,启动参数如下:
另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值,就有可能导致内存交换(swap)。连载的第2次中前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比指定的容量要大,这一点应当注意。
mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比指定的容量大很多。因此,我们反复改变内存分配量进行验证,确认了3GB的大小不会引发swap,这就是现在应用的数值。
-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
mixi的设置,单台:-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
[/code]
每台memcached服务器仅启动一个memcached进程。分配给memcached的内存为3GB,启动参数如下:
/usr/bin/memcached -p 11211 -u nobody -m 3000 -c 30720
由于使用了x86_64的操作系统,因此能分配2GB以上的内存。32位操作系统中,每个进程最多只能使用2GB内存。也曾经考虑过启动多个分配2GB以下内存的进程,但这样一台服务器上的TCP连接数就会成倍增加,管理上也变得复杂,所以mixi就统一使用了64位操作系统。另外,虽然服务器的内存为4GB,却仅分配了3GB,是因为内存分配量超过这个值,就有可能导致内存交换(swap)。连载的第2次中前坂讲解过了memcached的内存存储“slab allocator”,当时说过,memcached启动时指定的内存分配量是memcached用于保存数据的量,没有包括“slab allocator”本身占用的内存、以及为了保存数据而设置的管理空间。因此,memcached进程的实际内存分配量要比指定的容量要大,这一点应当注意。
mixi保存在memcached中的数据大部分都比较小。这样,进程的大小要比指定的容量大很多。因此,我们反复改变内存分配量进行验证,确认了3GB的大小不会引发swap,这就是现在应用的数值。
memcached -d -m 1024 -u root -l 172.25.38.70 -p 12000 -c 4096 -P /tmp/memcached.pid 12000
-p 12000 端口
-m 1024 内存设置 1024
-c 4096 同时连接数
-p 12000 端口
-m 1024 内存设置 1024
-c 4096 同时连接数
这几天编译PHP5.3.1 fast cgi的时候发现一个问题;configure的时候加上--disable-rpath就会报:
char *... configure: error: cannot compute sizeof (char *), 77
去掉这个参数就能正常通过,但是并不是所有的机器上都出这个错误;看来还是和环境有关系。
看了下文档;这个参数貌似是运行时不去某些路径搜索动态库。不是太理解。
3.安装magickwand-0.1.8
unzip magickwand-0.1.8.zip
mv magickwand php-4.3.6/ext/
cd php-4.3.6/ext/magickwand
phpize
cd ../../
rm -rf configure
./buildconf –force
export PATH=${PATH}:/usr/local/ImageMagick/bin
#关键一步,否则编译无法通过,会有这样错误误导你:
./configure --with-png-dir=/usr --with-gd --enable-gd-native-ttf --with-ttf --with-freetype --without-gdbm --with-gettext --with-ncurses --with-gmp --with-iconv --with-jpeg-dir=/usr --with-png --enable-ftp --enable-sockets -with-xml --with-dom --with-zlib --enable-track-vars --with-mysql=/usr/local/mysql --with-imagick=/usr/local/ImageMagick --with-apxs2=/usr/local/apache2/bin/apxs
make
make install
补充问题:
如果MagickWand 执行./configure 时,出现checking for MagickSetImageTicksPerSecond in -lWand… NO的错误,可能是您现在安装了两个版本的ImageMagick,且默认的版本低于ImageMagick-6.3.3
可以用Magick-config –version命令查看其版本。
通常是系统安装了rpm包,解决方法是卸载掉libImageMagick包:
rpm -qa | grep 'ImageMagick'
rpm -e ImageMagick*
char *... configure: error: cannot compute sizeof (char *), 77
去掉这个参数就能正常通过,但是并不是所有的机器上都出这个错误;看来还是和环境有关系。
看了下文档;这个参数貌似是运行时不去某些路径搜索动态库。不是太理解。
checking sys/un.h presence... yes
checking for sys/un.h... yes
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking whether zend_object_value is packed... no
checking for sqlite support... yes
checking whether to enable UTF-8 support in sqlite (default: ISO-8859-1)... no
checking for PDO includes... (cached) /usr/local/src/v1.0/software/php-5.3.1/ext
checking for lemon... no
configure: WARNING: lemon versions supported for regeneration of libsqlite parsers: 1.0 (found: none).
checking for char *... yes
checking size of char *... configure: error: cannot compute sizeof (char *), 77
See `config.log' for more details.
checking for sys/un.h... yes
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking whether zend_object_value is packed... no
checking for sqlite support... yes
checking whether to enable UTF-8 support in sqlite (default: ISO-8859-1)... no
checking for PDO includes... (cached) /usr/local/src/v1.0/software/php-5.3.1/ext
checking for lemon... no
configure: WARNING: lemon versions supported for regeneration of libsqlite parsers: 1.0 (found: none).
checking for char *... yes
checking size of char *... configure: error: cannot compute sizeof (char *), 77
See `config.log' for more details.
3.安装magickwand-0.1.8
unzip magickwand-0.1.8.zip
mv magickwand php-4.3.6/ext/
cd php-4.3.6/ext/magickwand
phpize
cd ../../
rm -rf configure
./buildconf –force
export PATH=${PATH}:/usr/local/ImageMagick/bin
#关键一步,否则编译无法通过,会有这样错误误导你:
.......... checking for ImageMagick / MagickWand in provided path... found in /usr/local/ImageMagick checking for ImageMagick / MagickWand 6.2.4 or greater with /usr/local/ImageMagick/bin/Wand-config... 6.2.6 /usr/local/ImageMagick/bin/Wand-config: line 42: Magick-config: command not found /usr/local/ImageMagick/bin/Wand-config: line 39: Magick-config: command not found ........... ........... checking size of char... configure: error: cannot compute sizeof (char), 77 See `config.log' for more details.
./configure --with-png-dir=/usr --with-gd --enable-gd-native-ttf --with-ttf --with-freetype --without-gdbm --with-gettext --with-ncurses --with-gmp --with-iconv --with-jpeg-dir=/usr --with-png --enable-ftp --enable-sockets -with-xml --with-dom --with-zlib --enable-track-vars --with-mysql=/usr/local/mysql --with-imagick=/usr/local/ImageMagick --with-apxs2=/usr/local/apache2/bin/apxs
make
make install
补充问题:
如果MagickWand 执行./configure 时,出现checking for MagickSetImageTicksPerSecond in -lWand… NO的错误,可能是您现在安装了两个版本的ImageMagick,且默认的版本低于ImageMagick-6.3.3
可以用Magick-config –version命令查看其版本。
通常是系统安装了rpm包,解决方法是卸载掉libImageMagick包:
rpm -qa | grep 'ImageMagick'
rpm -e ImageMagick*
突然间,机器上的Mysql不能启动了,查看日志发现,INNODB报这样错误:
090819 10:45:09 InnoDB: Error: cannot allocate 2147500032 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 35493848 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds
InnoDB: Fatal error: cannot allocate the memory for the buffer pool
090819 10:46:09 [ERROR] Plugin 'InnoDB' init function returned error.
090819 10:46:09 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: Normal shutdown
090819 10:46:09 [Warning] 'user' entry 'root@zhangyufeng' ignored in --skip-name-resolve mode.
090819 10:46:09 [Warning] 'user' entry '@zhangyufeng' ignored in --skip-name-resolve mode.
090819 10:46:09 [Note] Event Scheduler: Loaded 0 events
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: ready for connections.
Version: '5.1.32-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
090819 10:46:09 [Note] Event Scheduler: Purging the queue. 0 events
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete
我一开始以为是innoDB的扩展坏掉了,于是重新编译安装了mysql,后来才发现,原来是配置文件中
innodb_buffer_pool_size 设置的值过大了,(我设置了2048M) 呵呵 ,缓冲池过大了,原来没有
出错是因为我没开大的应用,我机器内存是4G,现在跑了个虚拟机后,内存剩余就不足了。
090819 10:45:09 InnoDB: Error: cannot allocate 2147500032 bytes of
InnoDB: memory with malloc! Total allocated memory
InnoDB: by InnoDB 35493848 bytes. Operating system errno: 12
InnoDB: Check if you should increase the swap file or
InnoDB: ulimits of your operating system.
InnoDB: On FreeBSD check you have compiled the OS with
InnoDB: a big enough maximum process size.
InnoDB: Note that in most 32-bit computers the process
InnoDB: memory space is limited to 2 GB or 4 GB.
InnoDB: We keep retrying the allocation for 60 seconds
InnoDB: Fatal error: cannot allocate the memory for the buffer pool
090819 10:46:09 [ERROR] Plugin 'InnoDB' init function returned error.
090819 10:46:09 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: Normal shutdown
090819 10:46:09 [Warning] 'user' entry 'root@zhangyufeng' ignored in --skip-name-resolve mode.
090819 10:46:09 [Warning] 'user' entry '@zhangyufeng' ignored in --skip-name-resolve mode.
090819 10:46:09 [Note] Event Scheduler: Loaded 0 events
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: ready for connections.
Version: '5.1.32-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
090819 10:46:09 [Note] Event Scheduler: Purging the queue. 0 events
090819 10:46:09 [Note] /usr/local/webserver/mysql/libexec/mysqld: Shutdown complete
我一开始以为是innoDB的扩展坏掉了,于是重新编译安装了mysql,后来才发现,原来是配置文件中
innodb_buffer_pool_size 设置的值过大了,(我设置了2048M) 呵呵 ,缓冲池过大了,原来没有
出错是因为我没开大的应用,我机器内存是4G,现在跑了个虚拟机后,内存剩余就不足了。
MYSQL数据库从5.1开始支持分区,本人下载了5.1最后的版本5.1.14(最好的版本应该最稳定)。
当尝试分区时,发现MYSQL分区的约束不少。
我打算使用RANGE分区类型,通过日期'BOOK_DATE'每年一个分区。
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`BOOK_MAIN_ID`),
KEY `FK_Reference_7` (`PROVIDER_ID`),
CONSTRAINT `FK_Reference_7` FOREIGN KEY (`PROVIDER_ID`) REFERENCES `base_provider` (`PROVIDER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
注意:表的PRIMARY KEY是BOOK_MAIN_ID,有一个FOREIGN KEY引用另外一个表的ID("PROVIDER_ID"),
另外被引用的表结构如下:
CREATE TABLE `base_provider` (
`PROVIDER_ID` varchar(32) NOT NULL,
`PROVIDER_NAME` varchar(100) NOT NULL,
`ADDRESS` varchar(200) default NULL,
`PHONE` varchar(20) default NULL,
`CONTRACT_MAN` varchar(20) default NULL,
`Email` varchar(100) default NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`PROVIDER_ID`),
UNIQUE KEY `INDEX_PROVIDER_NAME` (`PROVIDER_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
结果令我 意外的是报错
ERROR 1215 : Cannot add foreign key constraint
外键出错,把添加外键的语句删除
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`BOOK_MAIN_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
又报错,这次轮到主键了。
ERROR 1490 : A PRIMARY KEY must include all columns in the table's partitioning function
再把添加主键的语句删除
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
成功,但不是我所想要的,因为没有了主键和外键。上网找了些资料,了解到确实主键要去掉,但是外键问题没有找到。
牺牲主键我可以接受,但是外键要去掉我很不理解也不能接受。
请~~~
当尝试分区时,发现MYSQL分区的约束不少。
我打算使用RANGE分区类型,通过日期'BOOK_DATE'每年一个分区。
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`BOOK_MAIN_ID`),
KEY `FK_Reference_7` (`PROVIDER_ID`),
CONSTRAINT `FK_Reference_7` FOREIGN KEY (`PROVIDER_ID`) REFERENCES `base_provider` (`PROVIDER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
注意:表的PRIMARY KEY是BOOK_MAIN_ID,有一个FOREIGN KEY引用另外一个表的ID("PROVIDER_ID"),
另外被引用的表结构如下:
CREATE TABLE `base_provider` (
`PROVIDER_ID` varchar(32) NOT NULL,
`PROVIDER_NAME` varchar(100) NOT NULL,
`ADDRESS` varchar(200) default NULL,
`PHONE` varchar(20) default NULL,
`CONTRACT_MAN` varchar(20) default NULL,
`Email` varchar(100) default NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`PROVIDER_ID`),
UNIQUE KEY `INDEX_PROVIDER_NAME` (`PROVIDER_NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
结果令我 意外的是报错
ERROR 1215 : Cannot add foreign key constraint
外键出错,把添加外键的语句删除
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL,
PRIMARY KEY (`BOOK_MAIN_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
又报错,这次轮到主键了。
ERROR 1490 : A PRIMARY KEY must include all columns in the table's partitioning function
再把添加主键的语句删除
CREATE TABLE `in_book_main` (
`BOOK_MAIN_ID` varchar(32) NOT NULL,
`BOOK_DATE` date NOT NULL,
`PROVIDER_ID` varchar(32) default NULL,
`STATUS` varchar(4) NOT NULL,
`RMK` varchar(400) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
partition by range (to_days(BOOK_DATE))
(PARTITION p0 VALUES LESS THAN (to_days('2007-01-01')),
PARTITION p1 VALUES LESS THAN (to_days('2008-01-01')) ,
PARTITION p2 VALUES LESS THAN (to_days('2009-01-01')) ,
PARTITION p3 VALUES LESS THAN (to_days('2010-01-01')) ,
PARTITION p4 VALUES LESS THAN (to_days('2011-01-01')) ,
PARTITION p5 VALUES LESS THAN (to_days('2012-01-01')) ,
PARTITION p6 VALUES LESS THAN (to_days('2013-01-01')) ,
PARTITION p7 VALUES LESS THAN (to_days('2014-01-01')) ,
PARTITION p8 VALUES LESS THAN (to_days('2015-01-01')) ,
PARTITION p9 VALUES LESS THAN (to_days('2016-01-01')) ,
PARTITION p10 VALUES LESS THAN (to_days('2017-01-01')),
PARTITION p11 VALUES LESS THAN MAXVALUE );
成功,但不是我所想要的,因为没有了主键和外键。上网找了些资料,了解到确实主键要去掉,但是外键问题没有找到。
牺牲主键我可以接受,但是外键要去掉我很不理解也不能接受。
请~~~
今天看到一个老兄的问题,
大概如下:
查询出部门的最低工资的userid 号
表结构:
D号 工资 部门
userid salary dept
1 2000 1
2 1000 1
3 500 2
4 1000 2
有一个高人给出了一种答案:
SELECT MIN (salary) OVER (PARTITION BY dept ) salary, dept
FROM ss
运行后得到:
1000 1
1000 1
500 2
500 2
楼主那位老兄一看觉得很高深。大叹真是高人阿~
我也觉得这位老兄实在是高啊。
但我仔细研究一下发现那位老兄对PARTITION BY的用法理解并不深刻。并没有解决楼主的问题。
大家请看我修改后的语句
SELECT userid,salary,dept,MIN (salary) OVER (PARTITION BY dept ) salary
FROM ss
运行后的结果:
userid salary dept MIN (salary) OVER (PARTITION BY dept )
1 2000 1 1000
2 1000 1 1000
3 500 2 500
4 1000 2 500
大家看出端倪了吧。
高深的未必适合。
一下是我给出的答案:
SELECT * FROM SS
INNER JOIN (SELECT MIN(SALARY) AS SALARY, DEPT FROM SS GROUP BY DEPT) SS2
USING(SALARY,DEPT)
运行后的结果:
salary dept userid
1000 1 2
500 2 3
由此我想到总结一下group by和partition by的用法
group by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。
partition by虽然也具有分组功能,但同时也具有其他的功能。
它属于oracle的分析用函数。
借用一个勤快人的数据说明一下:
sum() over (PARTITION BY ...) 是一个分析函数。 他执行的效果跟普通的sum ...group by ...不一样,它计算组中表达式的累积和,而不是简单的和。
表a,内容如下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23
select b,c,sum(d) e from a group by b,c
得到:
B C E
02 01 30
02 02 13
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
而使用分析函数得到的结果是:
SELECT b, c, d, SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C E
02 01 2
02 01 7
02 01 30
02 02 1
02 02 13
02 03 2
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:
SELECT b, c, d,SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C D E
02 01 2 2 d=2,sum(d)=2
02 01 5 7 d=5,sum(d)=7
02 01 23 30 d=23,sum(d)=30
02 02 1 1 c值不同,重新累计
02 02 12 13
02 03 2 2
02 03 5 7
02 04 3 3
02 05 4 4
02 06 6 6
02 07 7 7
大概如下:
查询出部门的最低工资的userid 号
表结构:
D号 工资 部门
userid salary dept
1 2000 1
2 1000 1
3 500 2
4 1000 2
有一个高人给出了一种答案:
SELECT MIN (salary) OVER (PARTITION BY dept ) salary, dept
FROM ss
运行后得到:
1000 1
1000 1
500 2
500 2
楼主那位老兄一看觉得很高深。大叹真是高人阿~
我也觉得这位老兄实在是高啊。
但我仔细研究一下发现那位老兄对PARTITION BY的用法理解并不深刻。并没有解决楼主的问题。
大家请看我修改后的语句
SELECT userid,salary,dept,MIN (salary) OVER (PARTITION BY dept ) salary
FROM ss
运行后的结果:
userid salary dept MIN (salary) OVER (PARTITION BY dept )
1 2000 1 1000
2 1000 1 1000
3 500 2 500
4 1000 2 500
大家看出端倪了吧。
高深的未必适合。
一下是我给出的答案:
SELECT * FROM SS
INNER JOIN (SELECT MIN(SALARY) AS SALARY, DEPT FROM SS GROUP BY DEPT) SS2
USING(SALARY,DEPT)
运行后的结果:
salary dept userid
1000 1 2
500 2 3
由此我想到总结一下group by和partition by的用法
group by是对检索结果的保留行进行单纯分组,一般总爱和聚合函数一块用例如AVG(),COUNT(),max(),main()等一块用。
partition by虽然也具有分组功能,但同时也具有其他的功能。
它属于oracle的分析用函数。
借用一个勤快人的数据说明一下:
sum() over (PARTITION BY ...) 是一个分析函数。 他执行的效果跟普通的sum ...group by ...不一样,它计算组中表达式的累积和,而不是简单的和。
表a,内容如下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23
select b,c,sum(d) e from a group by b,c
得到:
B C E
02 01 30
02 02 13
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
而使用分析函数得到的结果是:
SELECT b, c, d, SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C E
02 01 2
02 01 7
02 01 30
02 02 1
02 02 13
02 03 2
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:
SELECT b, c, d,SUM(d) OVER(PARTITION BY b,c ORDER BY d) e FROM a
B C D E
02 01 2 2 d=2,sum(d)=2
02 01 5 7 d=5,sum(d)=7
02 01 23 30 d=23,sum(d)=30
02 02 1 1 c值不同,重新累计
02 02 12 13
02 03 2 2
02 03 5 7
02 04 3 3
02 05 4 4
02 06 6 6
02 07 7 7
今天看了MYSQL官方网站,发现这个UDFs,UDFs 是 User Defined Functions 的缩写,指 Mysql 的用户定义函数,应用可以通过使用这些函数从 Mysql5.0 以上版本的数据库中访问 Memcached 写入或者获得数据。此外,从 Mysql5.1 开始支持触发器,这样就可以在触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。下面我们简要介绍 UDFs 的安装和使用:
1、安装Libmemcached(memcached的客户端C API)
下载地址:http://download.tangent.org/
# ./configure –prefix=/usr && make && make install
注意:请安装在/usr下,不然后面安装memcached_functions_mysql的时候找不到,还要指定PKG_CONFIG_PATH,麻烦。
2、安装memcached_functions_mysql
下载地址:http://download.tangent.org/
# ./configure –with-mysql=/usr/local/mysql/bin/mysql_config
安装完成之后,需要将 libmemcached_functions_mysql 的库文件拷贝到 mysql/lib 目录下的 plugin 目录中。
# cp /usr/local/lib/libmemcached_functions_mysql* /usr/local/mysql/lib/plugin/.
# shell> mysql <sql/install_functions.sql
3、触发器实现
定义memcached服务器
mysql> SELECT memc_servers_set(’192.168.0.1:11211,192.168.0.2:11211′);
创建测试表:
mysql> create table test3 (
-> id int(3) not null,
-> name varchar(64) not null default ”,
-> primary key (id)
-> );
创建触发器
mysql>DELIMITER |
->CREATE TRIGGER test3_insert
->BEFORE INSERT ON test3
->FOR EACH ROW BEGIN
->SET @mm = memc_set(concat(’id:’,NEW.id), NEW.name);
->END |
可以参见官方网站:http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html
后记:我觉得它的应用场景应该是写操作不太频繁,但查询量非常大的网站,memcache不超时的缓存数据库的数据,当数据库发生更改的时候,利用 mysql的insert,update,delete触发器来更改memcached服务器的数据。但mysql的操作数据类型不支持数组,memc_set应该也不支持对象或者数组等数据类型。实现起来有点难度。
续记:MYSQL UDF OF JSON
基于以上的试用感想,我认为应该有UDF可以将数据行转成json格式的数据,这样就真的可以实现前端不用访问数据库的想法了,GOOGLE真是个好东西,google后还真找到了:UDF Repository for MySQL,外国人真是有开源精神:),这是一个MYSQL UDF库的网站,我在里面找到for json的udf。
下载地址:http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
安装:
# mkdir udf_of_json
# cd udf_of_json
# wget http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
# tar zxvf lib_mysqludf_json_0.0.2.tar.gz
# cp ./lib_mysqludf_json.so /usr/local/mysql/lib/plugin/.
# mysql -u root
mysql> source ./ lib_mysqludf_json.sql
测试:
DELIMITER ||
CREATE TRIGGER user_insert
AFTER INSERT ON users
FOR EACH ROW BEGIN
SELECT json_array(username,user_type,real_name,password,active,last_login,description) into @user_info FROM users where user_id=NEW.user_id;
SET @mm= memc_set(concat(’user_info_’,NEW.user_id), @user_info);
END ||
它还支持中文真是让人很欣喜,但不支持多行集,如果我用存储过程或者自定义函数自己写一个呢。研究中。。。。
继续参看:
http://www.jackxiang.com/post/2494/
1、安装Libmemcached(memcached的客户端C API)
下载地址:http://download.tangent.org/
# ./configure –prefix=/usr && make && make install
注意:请安装在/usr下,不然后面安装memcached_functions_mysql的时候找不到,还要指定PKG_CONFIG_PATH,麻烦。
2、安装memcached_functions_mysql
下载地址:http://download.tangent.org/
# ./configure –with-mysql=/usr/local/mysql/bin/mysql_config
安装完成之后,需要将 libmemcached_functions_mysql 的库文件拷贝到 mysql/lib 目录下的 plugin 目录中。
# cp /usr/local/lib/libmemcached_functions_mysql* /usr/local/mysql/lib/plugin/.
# shell> mysql <sql/install_functions.sql
3、触发器实现
定义memcached服务器
mysql> SELECT memc_servers_set(’192.168.0.1:11211,192.168.0.2:11211′);
创建测试表:
mysql> create table test3 (
-> id int(3) not null,
-> name varchar(64) not null default ”,
-> primary key (id)
-> );
创建触发器
mysql>DELIMITER |
->CREATE TRIGGER test3_insert
->BEFORE INSERT ON test3
->FOR EACH ROW BEGIN
->SET @mm = memc_set(concat(’id:’,NEW.id), NEW.name);
->END |
可以参见官方网站:http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html
后记:我觉得它的应用场景应该是写操作不太频繁,但查询量非常大的网站,memcache不超时的缓存数据库的数据,当数据库发生更改的时候,利用 mysql的insert,update,delete触发器来更改memcached服务器的数据。但mysql的操作数据类型不支持数组,memc_set应该也不支持对象或者数组等数据类型。实现起来有点难度。
续记:MYSQL UDF OF JSON
基于以上的试用感想,我认为应该有UDF可以将数据行转成json格式的数据,这样就真的可以实现前端不用访问数据库的想法了,GOOGLE真是个好东西,google后还真找到了:UDF Repository for MySQL,外国人真是有开源精神:),这是一个MYSQL UDF库的网站,我在里面找到for json的udf。
下载地址:http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
安装:
# mkdir udf_of_json
# cd udf_of_json
# wget http://www.mysqludf.org/lib_mysqludf_json/lib_mysqludf_json_0.0.2.tar.gz
# tar zxvf lib_mysqludf_json_0.0.2.tar.gz
# cp ./lib_mysqludf_json.so /usr/local/mysql/lib/plugin/.
# mysql -u root
mysql> source ./ lib_mysqludf_json.sql
测试:
DELIMITER ||
CREATE TRIGGER user_insert
AFTER INSERT ON users
FOR EACH ROW BEGIN
SELECT json_array(username,user_type,real_name,password,active,last_login,description) into @user_info FROM users where user_id=NEW.user_id;
SET @mm= memc_set(concat(’user_info_’,NEW.user_id), @user_info);
END ||
它还支持中文真是让人很欣喜,但不支持多行集,如果我用存储过程或者自定义函数自己写一个呢。研究中。。。。
继续参看:
http://www.jackxiang.com/post/2494/
/*
index.php 程序入口,用来构造sql(如查询,更新)
config.php 配置参数(memcache,mysql)
init.php 封装memcached操作(memcache连接,设置,获取)
mysqli.php 封闭mysql操作(mysql主连接,mysql从连接,mysql主更新,mysql从查询)
*/
index.php
<?php
require 'init.php'; //加载init.php
$mem = new Memcached; //建立memcached对象,对象为$mem
/*
$mem->set('en_xx','bucuo',0,30); //测试连接memcached,用来调试很不错。
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao',0,30);
echo($mem->get('cn_jjyy'));
*/
require 'mysqli.php';
$sq = new Mysql;
//下面这两个sql是人为构造的,这也可以做成一个接口
$sql = "Select * from traffic";
//$sql = "insert into traffic(id,acct_mth,amount) values(14,14,46)";
//进行判断,如果sql语句中有头有select(不区分大小写)
if(preg_match ("/^select/i", $sql)){
$mdsql = md5($sql);
if(!$result=$mem->get('cn_'.$mdsql)){ //这里选择的是cn memcached,大家也可以根据需求在前面做个条件来将数据存取放入到另一个memcached中。
$result = $sq->fetArray($sql); //查询是 从mysql
foreach($result as $var){
echo $var['amount'];
}
$mem->set('cn_'.$mdsql,$result,0,600); //添加到 名为cn的memcached 服务器
}else{
foreach($result as $var){
echo $var['amount']."<br>";
}
}
}else{
$sq->mquery($sql); //更新是 主mysql
}
?>
config.php
<?php
$memcached = array(
'cn'=>array('192.168.x.y',11211),
'en'=>array('192.168.y.x',11211)
);
$mysql = array(
'master'=>array('x','root','','test'),
'slave_1'=>array('y','root','','test'),
'slave_2'=>array('z','root','','test') //可以灵活添加多台从服务器
);
?>
init.php
<?php
class Memcached
{
private $mem;
public $pflag=''; // memcached pconnect tag
private function memConnect($serkey){ //建立memcached连接,这些都很容易理解
require 'config.php';
$server = $memcached; //$memcached是cn,en的数组
$this->mem = new Memcache;
$link = !$this->pflag ? 'connect' : 'pconnect' ;
$this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');
}
public function set($ser_key,$values,$flag='',$expire=''){ //设置获取数据
$this->memConnect($this->tag($ser_key));
if($this->mem->set($ser_key,$values,$flag,$expire)) return true;
else return false;
}
public function get($ser_key){
$this->memConnect($this->tag($ser_key));
if($var=$this->mem->get($ser_key)) return $var;
else return false;
}
private function tag($ser_key){
$tag=explode('_',$ser_key);
return $tag[0];
}
private function errordie($errmsg){
die($errmsg);
}
/* 这段函数是我用来在类中做调试用的。
public function show($messages){
echo $messages;
}
*/
}
?>
mysqli.php
<?php
class Mysql
{
/* 这段函数是我用来调试的
public function show($messages){
var_dump($messages);
}
*/
private $mysqlmaster;
private $myssqlslave;
public function __construct(){ //构造函数
require 'config.php';
$msg = $mysql; //$mysql是master,slave_1,slave_2
$this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
$this->mysqlslave = $this->autotranscat($msg); // slave mysql
if(mysqli_connect_errno()){
printf("Connect failed: %s\n",mysqli_connect_error());
exit();
}
if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
exit("set charset error");
}
}
private function autotranscat($mysql){ //这段函数的作用是获取从服务器序列号,如1,2
session_start(); //启动会话
$_SESSION['SID']!=0 || $_SESSION['SID']=0; //如果不为0,就不做赋值操作(那第一次访问的话,肯定会做赋值操作的)
if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1; //上面那个动作是为这个动作准备的
else $_SESSION['SID']++;
$key = 'slave_'.$_SESSION['SID'];
return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}
public function mquery($sql){ //mysql主 insert update
if(!$this->mysqlmaster->query($sql)){
return false;
}
}
public function squery($sql){ //mysql从 查询
if($result=$this->mysqlslave->query($sql)){
return $result;
}else{
return false;
};
}
public function fetArray($sql){ //mysql从 查询 入口
if($result=$this->squery($sql)){
while($row=$result->fetch_array(MYSQLI_ASSOC)){
$resultraa[] = $row;
};
return $resultraa;
}
}
}
?>
linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中……
直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思
需要提醒的是:使用这个rm -rf的时候一定要格外小心,linux没有回收站的
当然,rm还有更多的其他参数和用法,man rm就可以查看了
名称:rmdir
使用权限:于目前目录有适当权限的所有使用者
使用方式: rmdir [-p] dirName
说明: 删除空的目录。
参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
范例:
将工作目录下,名为 AAA 的子目录删除 :
rmdir AAA
在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字
-r 就是向下递归,不管有多少级目录,一并删除
-f 就是直接强行删除,不作任何提示的意思
需要提醒的是:使用这个rm -rf的时候一定要格外小心,linux没有回收站的
当然,rm还有更多的其他参数和用法,man rm就可以查看了
名称:rmdir
使用权限:于目前目录有适当权限的所有使用者
使用方式: rmdir [-p] dirName
说明: 删除空的目录。
参数: -p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
范例:
将工作目录下,名为 AAA 的子目录删除 :
rmdir AAA
在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
在同一时期能让万人空巷的电视里,我个人觉得还是<上> 最好.就是因为它塑造了一个很立体的形象.这个形象反应了生活的真实.许文强性格的矛盾性决定了他个人命运的悲惨,同时这也是他有魅力的一个很重要的原因.他生活在流氓的社会里,必须按照流氓的处事规则行事,但他的血液中还流淌着知识分子正直和爱国的一面.就好像生活在狼群中的狗,在努力地做着狼的同时,却摆脱不了狗的习性.他是这个流氓社会里的异类.
一.他勇敢\果断,有头脑.
在一系列的斗争中大家都可以看出,我在这里并不再多加议论.
二.他有独立的个性,不甘心为人下.
冯敬尧看他是个人才,想把他招为帐下之用.但他拒绝了.最后不得不跟随冯敬尧,是在走投无路的情况下,其中多少也有点是出于对丁力的兄弟情感.因为丁力要随他去广州,他为什么不能为丁力而留在上海呢?
三.他注重兄弟感情,知恩图报.
丁力收留了他一晚,他就把丁力作为兄弟相待.就是在丁力为争别人一个小老婆而使他们辛苦创下的基业毁于一旦的时候,他还是像对待亲兄弟一样的待他.就是因为他的诚恳待人,所以他在危难的时候也有很多兄弟帮他.
四.他懂得真爱.这也是他对女人的最吸引人之处.
冯程程爱上了他.但是他却一味的逃避和拒绝.是他不爱她吗?一开始,也许在他的心里感情因素不多.用他自己的话说,他接近冯程程不过是想从她那里知道关于冯敬尧的更多信息.但对于冯程程这样一个女孩,哪个男人会不动心呢?正因为爱她所以才拒绝她. 因为许文强深知,在这样一个打打杀杀的世界里,他迟早都会横尸街头,他不想害自己所爱的人.爱她不一定非得要得到她,知道放弃这才是真爱.他就在冯程程的面前不断地抵毁自己,让她熄灭心中的爱情火焰.但冯程程对他的爱非常的彻底,哪怕是做寡妇也在所不惜.在这样的情况下,他还有什么理由再去拒绝呢?
与他相对应的是丁力.他没有什么文化,对于他来讲,冯程程只是他没有得到的女人,对他的吸引力就是她的外貌.冯程程的聪明与文雅对他来讲豪无意义.所以他们是两种境界的人,根本不可能很好的生活.观众也都认为她和许文强才最相配.所以在丁力和冯程程结婚的时候,大家的心里都不是滋味.
五.许文强是一个爱国者.尽管表现的有限.
爱国使他在流氓社会里有了一次最惨痛的经历.让他失去了辛辛苦苦用生命作为赌注所换来的一切,包括他的爱情.而他的这种悲剧更让我们觉得他值得同情和惋惜.
之所以说许文强的人物形象是立体的,不光是因为作品表现了他性格的多面性,还因为作品表现了他性格的矛盾性.我们在谈及他的诸多优点的时候,无论如何都不能忘记他的流氓这一身分.换句话说,他首先是个流氓,然后才是其他.世界上没有绝对的好人,也没有绝对的坏人,这是公认的哲理.这也决定了人物性格的多样性.我们只记住了他光辉的一面,却忽略了他阴暗的一面.所以对他的印象特别的好.作为一个流氓,他不愿与爱国的精武会有牵扯,但他潜意识里的爱国心还是促使他在无意中帮助精武会杀死了日本间谍山口香子.在做出决定之前,他是矛盾又痛苦的,不问吧,自己的良心过不去,问吧,自己就会失去现在的一切.这种想法在这种情形之下是每下个正常的人心里都要考虑的.所以爱国在有的时候并不都像我们的红色经典中描述的那样大义凛然,义无反顾.这就是一种生活的真实.
我本无心入江湖,江湖却把我带入.
我本有心退江湖,江湖不让我退出.
一.他勇敢\果断,有头脑.
在一系列的斗争中大家都可以看出,我在这里并不再多加议论.
二.他有独立的个性,不甘心为人下.
冯敬尧看他是个人才,想把他招为帐下之用.但他拒绝了.最后不得不跟随冯敬尧,是在走投无路的情况下,其中多少也有点是出于对丁力的兄弟情感.因为丁力要随他去广州,他为什么不能为丁力而留在上海呢?
三.他注重兄弟感情,知恩图报.
丁力收留了他一晚,他就把丁力作为兄弟相待.就是在丁力为争别人一个小老婆而使他们辛苦创下的基业毁于一旦的时候,他还是像对待亲兄弟一样的待他.就是因为他的诚恳待人,所以他在危难的时候也有很多兄弟帮他.
四.他懂得真爱.这也是他对女人的最吸引人之处.
冯程程爱上了他.但是他却一味的逃避和拒绝.是他不爱她吗?一开始,也许在他的心里感情因素不多.用他自己的话说,他接近冯程程不过是想从她那里知道关于冯敬尧的更多信息.但对于冯程程这样一个女孩,哪个男人会不动心呢?正因为爱她所以才拒绝她. 因为许文强深知,在这样一个打打杀杀的世界里,他迟早都会横尸街头,他不想害自己所爱的人.爱她不一定非得要得到她,知道放弃这才是真爱.他就在冯程程的面前不断地抵毁自己,让她熄灭心中的爱情火焰.但冯程程对他的爱非常的彻底,哪怕是做寡妇也在所不惜.在这样的情况下,他还有什么理由再去拒绝呢?
与他相对应的是丁力.他没有什么文化,对于他来讲,冯程程只是他没有得到的女人,对他的吸引力就是她的外貌.冯程程的聪明与文雅对他来讲豪无意义.所以他们是两种境界的人,根本不可能很好的生活.观众也都认为她和许文强才最相配.所以在丁力和冯程程结婚的时候,大家的心里都不是滋味.
五.许文强是一个爱国者.尽管表现的有限.
爱国使他在流氓社会里有了一次最惨痛的经历.让他失去了辛辛苦苦用生命作为赌注所换来的一切,包括他的爱情.而他的这种悲剧更让我们觉得他值得同情和惋惜.
之所以说许文强的人物形象是立体的,不光是因为作品表现了他性格的多面性,还因为作品表现了他性格的矛盾性.我们在谈及他的诸多优点的时候,无论如何都不能忘记他的流氓这一身分.换句话说,他首先是个流氓,然后才是其他.世界上没有绝对的好人,也没有绝对的坏人,这是公认的哲理.这也决定了人物性格的多样性.我们只记住了他光辉的一面,却忽略了他阴暗的一面.所以对他的印象特别的好.作为一个流氓,他不愿与爱国的精武会有牵扯,但他潜意识里的爱国心还是促使他在无意中帮助精武会杀死了日本间谍山口香子.在做出决定之前,他是矛盾又痛苦的,不问吧,自己的良心过不去,问吧,自己就会失去现在的一切.这种想法在这种情形之下是每下个正常的人心里都要考虑的.所以爱国在有的时候并不都像我们的红色经典中描述的那样大义凛然,义无反顾.这就是一种生活的真实.
我本无心入江湖,江湖却把我带入.
我本有心退江湖,江湖不让我退出.