背景:装了个桌面版本的微信,台式机是win7版,只要点微信(RTX的链接也一样)里的链接会不在浏览器上打开,用了word打开。点里面的链接是用word打开的...
在word中打开的那些链接都是*.php类型的,而在windows的文件类型或协议与程序关联”中,并没有对*.php做出关联,所以就变成了由word打开了*.php文件。那么解决的办法就是--打开控制面板,选择“默认程序”,然后选择“设置默认程序”,接着在打开的列表中选择自己使用的浏览器类型,将它设置为“将此程序设置为默认值”,即”使用所选程序打开在默认情况下能打开的所有文件类型和协议“,问题解决~
实践如下:
控制面板\程序\默认程序\设置默认程序 选中chrome浏览器,设置为默认打不开的文件,即是说所有打不开的文件类型邮chrome来打开,后再点一下桌面的微信聊天对方发出来的链接Url,就是很自然的由chrome打开了,相当方便~
图形参考:http://jingyan.baidu.com/article/1709ad80ae52fb4634c4f08b.html
上述文字摘自:http://wenku.baidu.com/link?url=d8ltSiLtUAKr15pKbMzovglYaQUupDlyOwUM6JMBJqM8hspmPkCwFlBKVKpjUPje2ShbQ6Hw2BM9bgc4Yy7KZYIlLQkBIqrqEUGrusN9iWW
阅读全文
在word中打开的那些链接都是*.php类型的,而在windows的文件类型或协议与程序关联”中,并没有对*.php做出关联,所以就变成了由word打开了*.php文件。那么解决的办法就是--打开控制面板,选择“默认程序”,然后选择“设置默认程序”,接着在打开的列表中选择自己使用的浏览器类型,将它设置为“将此程序设置为默认值”,即”使用所选程序打开在默认情况下能打开的所有文件类型和协议“,问题解决~
实践如下:
控制面板\程序\默认程序\设置默认程序 选中chrome浏览器,设置为默认打不开的文件,即是说所有打不开的文件类型邮chrome来打开,后再点一下桌面的微信聊天对方发出来的链接Url,就是很自然的由chrome打开了,相当方便~
图形参考:http://jingyan.baidu.com/article/1709ad80ae52fb4634c4f08b.html
上述文字摘自:http://wenku.baidu.com/link?url=d8ltSiLtUAKr15pKbMzovglYaQUupDlyOwUM6JMBJqM8hspmPkCwFlBKVKpjUPje2ShbQ6Hw2BM9bgc4Yy7KZYIlLQkBIqrqEUGrusN9iWW
阅读全文
详解jquery插件中(function ( $, window, document, undefined )的作用:为什么要将window和undefined作为参数传给它?
Php/Js/Shell/Go jackxiang 2015-3-17 10:27
背景:在一个项目中,有一个兄弟用init jquery时,用了这种写法,而不是$().ready( ,参考:http://jackxiang.com/post/1983/ ,于是了解了一下~
学习一:
提问,
(function(window,undefined){})(window);
这个,为什么要将window和undefined作为参数传给它?
回答:
因为 javascript 执行JS代码是从里到外,因此把全局变量传进来,就避免了到外层去寻找。提高效率
提问Q:
不明白为什么JS 的undefined还可以做变量名。 undefined算是JS里面的什么呢?不是关键字,不是保留字,true跟false还有null也不是,不过跟undefined不同,不能用作变量名。
这些到底算是什么呢?
回答A:
可以避免 undefined 被别人定义了。
var undefined=8;
(function(window){
alert(window.undefined); //8
alert(undefined); //8
})(window);
与
var undefined=8;
(function(window,undefined){
alert(window.undefined); //8
alert(undefined); //此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);
所以后者,就算外面的人把 ,undefined 定义了,里面的 undefined 依然不受影响。
大概是为了最大程度防止外界的变量定义对 所做封装的内部影响吧。
学习二,更和jquery结合更紧密:
详解jquery插件中(function ( $, window, document, undefined )的作用:
在jquery插件中我们经常看到以下这段代码
;(function ( $, window, document, undefined ){
//函数体内具体代码
})(jQuery, window,document);
对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用。
1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。
2、匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。
3、$实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。
4、window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然如果你的插件用不到这两个对象,那么就不用传递这两个参数了。
5、最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,因此增加一个形参undefined
http://www.bcty365.com/content-47-805-1.html
————————————————————为何有这一问(代码来自)————————————————————
代码来自:
http://jackxiang.com/post/7864/
更多疑问参考解答Url:http://zhidao.baidu.com/link?url=P4soG5CQSsXaZUo5DBfUX9uoFl9Mkbncf_dFs7CdC3XwdVdy7rSjWCAyTy4VWIMtIAkRzpV87TJh6uHxlvYPyq
学习一:
提问,
(function(window,undefined){})(window);
这个,为什么要将window和undefined作为参数传给它?
回答:
因为 javascript 执行JS代码是从里到外,因此把全局变量传进来,就避免了到外层去寻找。提高效率
提问Q:
不明白为什么JS 的undefined还可以做变量名。 undefined算是JS里面的什么呢?不是关键字,不是保留字,true跟false还有null也不是,不过跟undefined不同,不能用作变量名。
这些到底算是什么呢?
回答A:
可以避免 undefined 被别人定义了。
var undefined=8;
(function(window){
alert(window.undefined); //8
alert(undefined); //8
})(window);
与
var undefined=8;
(function(window,undefined){
alert(window.undefined); //8
alert(undefined); //此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);
所以后者,就算外面的人把 ,undefined 定义了,里面的 undefined 依然不受影响。
大概是为了最大程度防止外界的变量定义对 所做封装的内部影响吧。
学习二,更和jquery结合更紧密:
详解jquery插件中(function ( $, window, document, undefined )的作用:
在jquery插件中我们经常看到以下这段代码
;(function ( $, window, document, undefined ){
//函数体内具体代码
})(jQuery, window,document);
对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用。
1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。
2、匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。
3、$实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。
4、window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然如果你的插件用不到这两个对象,那么就不用传递这两个参数了。
5、最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,因此增加一个形参undefined
http://www.bcty365.com/content-47-805-1.html
————————————————————为何有这一问(代码来自)————————————————————
代码来自:
http://jackxiang.com/post/7864/
更多疑问参考解答Url:http://zhidao.baidu.com/link?url=P4soG5CQSsXaZUo5DBfUX9uoFl9Mkbncf_dFs7CdC3XwdVdy7rSjWCAyTy4VWIMtIAkRzpV87TJh6uHxlvYPyq
背景:centos一兄弟把那个/etc/sudoer给权限变更了,于是否,出现sudo su -因为权限进入不了root,sudo su - sudo: /etc/sudoers is mode 0640, should be 0440 ,于是否,查了一下网络,有下面两种解决办法,特别是我自己有一个方法,那就是我有一个c文件是有root的权限,它能以root的权限让php去执行这个popen的类windows的cmd命令,于是在没有root密码的情况下也能修改这个文件,解决了问题。
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
ubuntu或者CentOS中,/etc/sudoer 的权限为 0440时才能正常使用,否则sudo命令就不能正常使用。出现类似:sudo: /etc/sudoers is mode 0640, should be 0440 的对话。
解决办法:
1、Ctrl+Alt+F1 进入文本模式。用超级用户登录,如root
2、输入:chmod 0440 /etc/sudoers 。Enter
3、exit 退出
4、Ctrl+Alt+F7 返回图形模式。
5、在试试sudo命令,可以用了
P:其实另开一个端口,su -进入root,然后chmod 0440 /etc/sudoers
效果是一样的
example:
[BIngo@windows ~]$ sudo chmod u+w /etc/sudoers
口令:
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
[BIngo@windows ~]$ sudo chmod u-w /etc/sudoers
sudo: /etc/sudoers is mode 0640, should be 0440
[BIngo@windows ~]$ ls -l /etc/sudoers
-rw-r----- 1 root root 3210 11-16 02:40 /etc/sudoers
另开端口
[root@windows ~]# chmod 0440 /etc/sudoers
[root@windows ~]# exit
[BIngo@windows ~]$ ls -l /etc/sudoers
-r--r----- 1 root root 3210 11-16 02:40 /etc/sudoers
方法二(不是每台机器都有我这样的二进制,我是为了显示svn的版本号才临时用php调这个c,再用php调shell下的svn命令获取项目代码位置里的svn的版本号):
-rwsrwxrwx 1 root root 11711 Oct 9 17:29 resetServerAndOptSVN //有root权限,它会调一个php文件,这个php的shell也有root权限,于是我只对php作了修改即可:
vi resetServerAndOptSVN.php
./resetServerAndOptSVN disvnver jack
于是,Ok了,这块主要是利用这个c编译的文件有root权限,让它去修改了权限,于是解决了问题~
[实践Ok]find exec 接合rm -Rf 删除文件和拷备文件的小应用脚本。
Unix/LinuxC技术 jackxiang 2015-3-13 14:11
将目录中的文件查找出来并全部拷备文件到指定目录:
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
阅读全文
find . -type f -exec cp -rf {} /tmp/pdf \;
背景:删除一些vim的临时文件及批量文件修改时间,有用xargs的也有用exec......但是这个命令的后面这一部分得小心点写,有一个空格。
第一:花括号}后面必须得有空格.
第二:最后斜杠后面必须得有分号。
第三:exec前面有一个中横线,否则也不行,三者必须要注意。
如:
#!/bin/bash
Redisdb_file=/data/redis/6403/redis.rdb
Redisbak_dir=/data/bak/redis/6403
Bak_time=`date +%Y%m%d%H%M`
mkdir -p $Redisbak_dir
/bin/cp -rf $Redisdb_file $Redisbak_dir/redis.rdb.$Bak_time
find $Redisbak_dir -name "redis.db.201*" -mtime +30 -exec rm -rf {} \;
+ /bin/cp -rf /data/redis/6403/redis.rdb /data/bak/redis/6403/redis.rdb.201610262250
+ find /data/bak/redis/6403 -name 'redis.db.201*' -mtime +30 -exec rm -rf '{}' ';'
-----------------------------------------------------------------------------------------------------------------------------------
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep "messagebox-bottom" {} \;
<div class="messagebox-bottom">
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
<div class="messagebox-bottom"><a href="javascript: window.history.back();">{$lnc[263]}</a> | <a href="index.php">{$lnc[88]}</a> {admin_plus}</div>
[root@iZ25dcp92ckZ jackxiang.com]# find . -name "*.php" -exec grep -lr -A3 "您目前的用户组是" {} \;
./lang/zh-cn/common.php
======================这儿不得不说xargs和-exec的区别=================================
1)-exec里的{} 相当于一个变量,于是grep时是每次针对单个文件的,所以没有文件名显示。
2)而xagrs是管道,则grep认为是一堆文件进行grep,于是默认就有文件名。
-exec就像这样指定了文件名,当然没有文件名存在了,在使用时根据实际情况进行使用:
=======================================================================================
下面这两种情况都是没法执行得到的,如下:
[root@localhost test]# find . -ctime -1 -exec ls -l {} \ ;
find: missing argument to `-exec'
[root@localhost test]# find . -ctime -1 -exec ls -l {} \
>
所以,必须得要注意,而用xargs来做这个就不用那么多事了:
find . -mtime +30 | xargs rm -f
每天运行一次,清理半月外的文件,予以删除:
==================================
[root@localhost ~]# find /tmp -type f
/tmp/.X0-lock
/tmp/test.pcap
[root@localhost ~]# find /tmp -type f|xargs echo
/tmp/.X0-lock /tmp/test.pcap
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
[root@localhost ~]# find /tmp -type f -exec ls -l {} ;
find: missing argument to `-exec'
[root@localhost ~]# find /tmp -type f -exec ls -l {} \;
-r--r--r-- 1 root root 11 Aug 21 2014 /tmp/.X0-lock
-rw-r--r-- 1 root root 24 Mar 10 10:42 /tmp/test.pcap
阅读全文
C语言如何比较两个【字符】或者【字符串】是否相等?strcmp
Unix/LinuxC技术 jackxiang 2015-3-12 16:02
Q:
C语言如何比较两个【字符】或者【字符串】是否相等?
A:
比较字符可以直接使用==比较操作符,如:
char c1='a',c2='b';
if(c1==c2) printf("%c is same as %c.",c1,c2);
else printf("%c is different to %c",c1,c2);
若是字符串,则需要使用字符串函数了,strcmp
char s1[]="abc",s2[]="xyz";
if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);
也可以忽略大小写来比较,使用函数stricmp 中间的i意思是ignore case sensitive
还可以指定长度比较,strncmp,如:
char s1[]="abc",s2[]="abcdefg";
if(strncmp(s1,s2,3)==0) printf("first 3 characters are same");
若不是从开头位置开始比较,如:
char s1[]="abc",s2[]="xyzabc"
if(strncmp(s1,&s2[3],3)==0) 就是比较s1和s2的第3个字符开始的内容
Egg:
#include <string.h>
char s1[10],s2[10];
...
if(strcmp(s1,s2)==0)
printf("两字符串相等\n");
string.h 头文件中就有比较函数,可以用来比较是否相等
来自:http://zhidao.baidu.com/link?url=9gRfWtoqGKzO_Y-aSb5H56QDSkKTblfzFYBoWrggRtxNaXSF3YI1MSo_gnsYvsoVdL_bN4AqEULfDLKMLvZtoq
C语言如何比较两个【字符】或者【字符串】是否相等?
A:
比较字符可以直接使用==比较操作符,如:
char c1='a',c2='b';
if(c1==c2) printf("%c is same as %c.",c1,c2);
else printf("%c is different to %c",c1,c2);
若是字符串,则需要使用字符串函数了,strcmp
char s1[]="abc",s2[]="xyz";
if(strcmp(s1,s2)==0) printf("%s is same as %s.",s1,s2);
也可以忽略大小写来比较,使用函数stricmp 中间的i意思是ignore case sensitive
还可以指定长度比较,strncmp,如:
char s1[]="abc",s2[]="abcdefg";
if(strncmp(s1,s2,3)==0) printf("first 3 characters are same");
若不是从开头位置开始比较,如:
char s1[]="abc",s2[]="xyzabc"
if(strncmp(s1,&s2[3],3)==0) 就是比较s1和s2的第3个字符开始的内容
Egg:
#include <string.h>
char s1[10],s2[10];
...
if(strcmp(s1,s2)==0)
printf("两字符串相等\n");
string.h 头文件中就有比较函数,可以用来比较是否相等
来自:http://zhidao.baidu.com/link?url=9gRfWtoqGKzO_Y-aSb5H56QDSkKTblfzFYBoWrggRtxNaXSF3YI1MSo_gnsYvsoVdL_bN4AqEULfDLKMLvZtoq
[实践OK]Linux 命令行下嗅探 HTTP 流量的工具:httpry
Unix/LinuxC技术 jackxiang 2015-3-10 17:50
背景:对http 80端口的监控是必须的,无论是开发时接口间调用,还是在线上弱水三千只取一瓢,对接口的侦测,我国的网侦部门对我们的行为控制,从来没有停止过,这儿请的不是tcpdump,而是有一个抓取http流量的类似tcpdump的数据包嗅探工具,httpry捕获HTTP数据包,并且将HTTP协议层的数据内容以可读形式列举出来。当前linux两个系统比较常用一个是centos一个是debian,这里都有,请看下面讲述即可。
Fedora、centos、RHEL系统需要安装EPEL源
$ sudo yum install httpry
也可以源码编译
$ sudo yum install gcc make git libpcap-devel
$ git clone https://github.com/jbittel/httpry.git
$ cd httpry
$ make
$ sudo make install
下载软件包:
yum install httpry
http://mirrors.neusoft.edu.cn/epel/6/x86_64/httpry-0.1.8-1.el6.x86_64.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 503 Service Temporarily Unavailable"
尝试其他镜像。
httpry-0.1.8-1.el6.x86_64.rpm | 35 kB 00:00
运行 rpm_check_debug
执行事务测试
已安装:
httpry.x86_64 0:0.1.8-1.el6
完毕!
阅读全文
Fedora、centos、RHEL系统需要安装EPEL源
$ sudo yum install httpry
也可以源码编译
$ sudo yum install gcc make git libpcap-devel
$ git clone https://github.com/jbittel/httpry.git
$ cd httpry
$ make
$ sudo make install
下载软件包:
yum install httpry
http://mirrors.neusoft.edu.cn/epel/6/x86_64/httpry-0.1.8-1.el6.x86_64.rpm: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 503 Service Temporarily Unavailable"
尝试其他镜像。
httpry-0.1.8-1.el6.x86_64.rpm | 35 kB 00:00
运行 rpm_check_debug
执行事务测试
已安装:
httpry.x86_64 0:0.1.8-1.el6
完毕!
阅读全文
[实践OK]通过命令行能不能打印易读的Json数据怎么办?接合windows使用curl命令输出json并格式化的方法。及升级CentOS下的python到3.3版本的步骤,升级后yum except KeyboardInterrupt, e: 错误。
Unix/LinuxC技术 jackxiang 2015-3-9 17:31
背景:我很喜欢在命令行调试API,返回数据都是JSON格式的。打印出来的内容太痛苦了,如:{"status":200,"data":[{"id":1000,"name":"John"}{"id":1004,"name":"Tom"}]},有木有工具打印个易读的样式,这样的
实践一:
答:可以使用python的json.tool!
cat json|python -mjson.tool
cat json|python -mjson.tool
python: module json.tool not found
json是python3内置模块,在包libpython3.3-stdlib中提供。
centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:
http://lovebeyond.iteye.com/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~ AddTime:2015-03-09
echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
Vim中格式化json数据:
命令模式下
#!python -m json.tool
可以映射快捷键,如Ctrl+F6,编辑vimrc:
“ Format JSON data using python module json.tool
map <C-F6> :#!python -m json.tool<CR>
vim调用python格式化json数据:
实践二,根据1接合windows使用curl命令输出json并格式化的方法:
windows中使用curl命令需要下载curl工具
下载地址:http://curl.haxx.se/download.html
请选择不带SSL的版本,否则还需要安装SSL的支持包
我下载的版本 http://www.paehl.com/open_source/?CURL_7.28.1
下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用
我使用linux下成功的相同命令去发现报错如下:
网上查发现是引号的原因,
例如linux下成功命令格式如下:
来自:http://blog.csdn.net/lipei1220/article/details/8536520
http://blog.longwin.com.tw/2012/12/cli-python-json-formatter-2012/
http://blog.csdn.net/yuechuzhao/article/details/24460781
http://openwares.net/linux/vim_call_python_format_json.html
————————————————————linux(CentOS)下升级python3.3———————————————————————————
CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。
1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
2。解压安装包:tar -zxvf Python-3.3.0.tgz
3。进入解压后目录:cd Python-3.3.0
4。创建安装目录:mkdir /usr/local/python3.3
5。编译安装:./configure --prefix=/usr/local/python3.3
6。执行:make && make install
7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python
8。查询python版本,执行:python
显示如下:
Python 3.3.0 (default, Jan 16 2013, 17:52:44)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
已安装成功了。恭喜你。
实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:
/usr/bin/python2.4
mv /usr/bin/python2.4 /usr/bin/python2.4_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4
/usr/local/bin/python2.7
mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7
实践来源:http://lovebeyond.iteye.com/blog/1770476
最后,json显示结构化Ok了:
[root@test Python-3.3.0]# echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
再结合Curl这个命令行显示一把,实践如下:
cat json.php
shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"
{ "status":200, "data": [ { "id":1000, "name":"John" }, { "id":1004, "name":"Tom" } ] } [root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" vi json.php
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 106 0 106 0 0 51381 0 --:--:-- --:--:-- --:--:-- 0
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:
问题:
——————————————————————————————————
[root@name user]# yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
原因:
这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。
解决办法:
很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)
升级yum的作法就不详述了;
修改yum的解释器为旧版本python2.4:
vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2.4"即可,我自己是修改:
/usr/bin/python2.4_bak //前面挪动到这儿了,实践是OK的~
摘自:http://blog.sina.com.cn/s/blog_67d6a2650100jiaw.html
实践一:
答:可以使用python的json.tool!
cat json|python -mjson.tool
cat json|python -mjson.tool
python: module json.tool not found
json是python3内置模块,在包libpython3.3-stdlib中提供。
centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:
http://lovebeyond.iteye.com/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~ AddTime:2015-03-09
echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
Vim中格式化json数据:
命令模式下
#!python -m json.tool
可以映射快捷键,如Ctrl+F6,编辑vimrc:
“ Format JSON data using python module json.tool
map <C-F6> :#!python -m json.tool<CR>
vim调用python格式化json数据:
实践二,根据1接合windows使用curl命令输出json并格式化的方法:
windows中使用curl命令需要下载curl工具
下载地址:http://curl.haxx.se/download.html
请选择不带SSL的版本,否则还需要安装SSL的支持包
我下载的版本 http://www.paehl.com/open_source/?CURL_7.28.1
下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用
我使用linux下成功的相同命令去发现报错如下:
网上查发现是引号的原因,
例如linux下成功命令格式如下:
来自:http://blog.csdn.net/lipei1220/article/details/8536520
http://blog.longwin.com.tw/2012/12/cli-python-json-formatter-2012/
http://blog.csdn.net/yuechuzhao/article/details/24460781
http://openwares.net/linux/vim_call_python_format_json.html
————————————————————linux(CentOS)下升级python3.3———————————————————————————
CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。
1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz
2。解压安装包:tar -zxvf Python-3.3.0.tgz
3。进入解压后目录:cd Python-3.3.0
4。创建安装目录:mkdir /usr/local/python3.3
5。编译安装:./configure --prefix=/usr/local/python3.3
6。执行:make && make install
7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python
8。查询python版本,执行:python
显示如下:
Python 3.3.0 (default, Jan 16 2013, 17:52:44)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
已安装成功了。恭喜你。
实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:
/usr/bin/python2.4
mv /usr/bin/python2.4 /usr/bin/python2.4_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4
/usr/local/bin/python2.7
mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7
实践来源:http://lovebeyond.iteye.com/blog/1770476
最后,json显示结构化Ok了:
[root@test Python-3.3.0]# echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
再结合Curl这个命令行显示一把,实践如下:
cat json.php
shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"
{ "status":200, "data": [ { "id":1000, "name":"John" }, { "id":1004, "name":"Tom" } ] } [root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" vi json.php
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" | python -mjson.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 106 0 106 0 0 51381 0 --:--:-- --:--:-- --:--:-- 0
{
"data": [
{
"id": 1000,
"name": "John"
},
{
"id": 1004,
"name": "Tom"
}
],
"status": 200
}
最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:
问题:
——————————————————————————————————
[root@name user]# yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
原因:
这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。
解决办法:
很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)
升级yum的作法就不详述了;
修改yum的解释器为旧版本python2.4:
vi /usr/bin/yum
将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2.4"即可,我自己是修改:
/usr/bin/python2.4_bak //前面挪动到这儿了,实践是OK的~
摘自:http://blog.sina.com.cn/s/blog_67d6a2650100jiaw.html
[实践OK]C语言函数sscanf()的用法
Unix/LinuxC技术 jackxiang 2015-3-9 17:05
背景:做日志分析,linux C 的开发环境,在对每行日志进行处理的时候,手下一个小伙用的是逐字节拆分成字段(也就是指针)。刚开始没注意,后来每天10几G的日志上来后,发现除了速度特别慢以外,还经常出问题,遇到错误格式的日志就直接崩溃。。。从文件读取数据是一件很麻烦的事,所幸有sscanf()函数,对网络输入数据也就是从一个字符串中读进与指定格式相符的数据并进行分组也是可行的。
在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。
sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.
原型: int sscanf (const char *str,const char * format,........);
说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。
成功则返回参数数目,失败则返回0。
注意:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
这里就举几个经常用到的例子来说明他的用法,便于大家深刻理解他的用法.
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+
同进,我想把http请求里的get的串取出来,怎么办?
编译运行调试:
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法七
str = task
来自:http://blog.csdn.net/sjf0115/article/details/8579935
在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。
sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.
原型: int sscanf (const char *str,const char * format,........);
说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。
成功则返回参数数目,失败则返回0。
注意:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
这里就举几个经常用到的例子来说明他的用法,便于大家深刻理解他的用法.
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+
同进,我想把http请求里的get的串取出来,怎么办?
编译运行调试:
[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法七
str = task
来自:http://blog.csdn.net/sjf0115/article/details/8579935
为什么我希望用C而不是C++来实现ZeroMQ
Unix/LinuxC技术 jackxiang 2015-3-9 13:49
开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的。在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语言。自然的,当我从2007年开始做ZeroMQ(ZeroMQ项目主页)时,我选择用C++来实现。主要的原因有以下几点:
1. 包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。
2. C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。
3. 这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。
4. 最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。阅读全文
1. 包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。
2. C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。
3. 这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。
4. 最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。阅读全文
[实践OK]CentOS 6.5和CentOS7.0分别安装了下HHVM,并将此用于wordpress网站上,相当不错。
Php/Js/Shell/Go jackxiang 2015-3-5 22:22
CentOS 7下hhvm Nginx环境搭建:
http://www.linuxeye.com/Linux/2029.html
Supervisor管理hhvm进程:
http://www.linuxeye.com/Linux/Supervisor-hhvm.html
注意一下路径:
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/data/logs/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
=======================================================
Q:多处出现:软件包boost-regex-1.54.0-9.el6.x86_64.rpm没有签名?
Q:大家都用source编译?我是想通过yum 安装了解一下php的hhvm 尽量用yum 安装。
A:比较容易标准化 机器多的话,可以统一标准化 对,标准化很重要
https://github.com/lj2007331/lnmp
淘宝一个人建的,其中functions目录把每个l n/a mp版本安装封装成了一个shell函数(包含了依赖包),有hhvm和php7。如果是在机器上体验一下,可以使用这个项目或者把他的函数抠出来,可以省去从源码编译挨个找依赖包的痛苦。
————————————————兼容过渡办法—————————————————
测试了下6月6日下载编译的PHP7和HHVM最新的3.7.1.
ab -c100 -n1000 http://127.0.0.1/wordpress/
100并发完成1000个请求,PHP7(开启opcache,5个PHP-FPM工作进程)每秒处理117个请求,HHVM则是每秒126个,性能差距很小.值得一提的是,HHVM没有热身时(第一次压测),每秒只能处理56个请求,而PHP7仍能处理117个请求.
这是我6月6日编译的PHP7开发版,你可以下载进行测试:
http://my.oschina.net/eechen/blog/411534
补充:
如果你觉得处于Alpha版本的PHP7还不够稳定,你可以配置Nginx,PHP7-FPM监听9000端口,PHP5-FPM监听9001端口,当PHP7崩掉的时候自动切换到作为备用的PHP5.
upstream php.backend {
server 127.0.0.1:9000;
server 127.0.0.1:9001 backup;
}
PHP-FPM是多进程的架构,PHP7并没有改动PHP-FPM的架构,所以说就算PHP-FPM工作进程因为内置的PHP7引擎发生故障,我估计也就工作进程会崩溃退出,而PHP-FPM的master进程会自动重启一个新的工作进程.
————————————————————————————————————————————————————
已加载插件:fastestmirror, refresh-packagekit, security
/var/run/yum.pid 已被锁定,PID 为 8085 的另一个程序正在运行。
另外一个程序锁定了 yum;等待它退出……
The other application is: PackageKit
Memory : 22 M RSS (328 MB VSZ)
Started: Mon May 4 16:41:46 2015 - 00:09 ago
State : Uninterruptible, pid: 8085
另外一个程序锁定了 yum;等待它退出……
The other application is: PackageKit
Memory : 31 M RSS (339 MB VSZ)
Started: Mon May 4 16:41:46 2015 - 00:11 ago
你怎么2个东西在跑,kill:
重复执行 install.sh
ps -ef | grep hhvm
service hhvm start
find . -name "hhvm"
./etc/rc.d/init.d/hhvm
./var/run/hhvm
./var/log/hhvm
如果说想配置nginx+hhvm,我用nginx+hhvm可以吧?
vhost.sh
最后,
mysql源码安装的是 mysql-server
mysql x86_64是客户端,别搞错。
还是有问题:
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16(libmysqlclient_16)(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16(libmysqlclient_16)(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
You could try using --skip-broken to work around the problem
问题在:
lnmp.org安装了mysql-
有可能不行 php 用的 mysql库 就有问题。
删除这个包就Ok了?mysql-libs-5.5.43-1.el6.remi.x86_64
Q:干嘛不用我的来安装 整套?
A:历史原因啊。
Q:删除两个?
rpm -e mysql-libs-5.5.43-1.el6.remi.x86_64
rpm -e mysql-5.5.43-1.el6.remi.x86_64
A:
rpm -e mysql-5.1.73-3.el6_5.x86_64 删掉
回家后实践,如下且成功:
rpm -qa |grep mysql
mysql-devel-5.5.43-1.el6.remi.x86_64
mysql-libs-5.5.43-1.el6.remi.x86_64
mysql-5.5.43-1.el6.remi.x86_64
实践是这样的:
rpm -e mysql-devel-5.5.43-1.el6.remi.x86_64
rpm -e mysql-5.5.43-1.el6.remi.x86_64
rpm -e mysql-libs-5.5.43-1.el6.remi.x86_64
于是重新安装一次并重启:
./install.sh
________
ps aux|grep hhvm
www 3155 55.0 2.5 676320 150628 ? R 22:56 0:09 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:
location ~ .*\.(php|php5)?$ {
#fastcgi_pass unix:/data/runsock/php-cgi.sock;
fastcgi_pass unix:/data/runsock/hhvmsock/hhvm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include fastcgi_params;
}
service nginx reload
详细配置看后面,安装就按上面安装得了。依赖太多,太麻烦了。
ps aux|grep hhvm
www 3155 3.3 2.8 880828 172836 ? Sl 23:23 0:22 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
strace -f -p 3155 //访问一下看有无输出,实践是有输出的。说明安装成功了。
CentOS7 hhvm交给supervisord管理了:
ps -ef | grep super supervisord 这个进程在吗?
service supervisord restart
最后解决,开机这个/var/run/hhvm 会不见了(CentOS7里估计是一个内存磁盘,重启就没了,导致启动失败。),呵,开机就创建好了:
创好是这样的: ls /var/run/hhvm/
hhvm.hhbc pid sock
配置hhvm
# vi /etc/hhvm/server.ini
vi /etc/hhvm/php.ini
一个www的hhvm去读取一个mysql.sock,
而我的sock是放在一个mysql的组目录下,如何实现无permission Denny的读取?
所以得注意权限,如下所示 :
[root@iZ25z0ugwgtZ runsock]# ll /data/runsock
drwxrwxrwx 2 www www 4096 2月 17 17:30 hhvm
drwxrwxrwx 2 mysql mysql 4096 2月 17 17:28 mysqlsock
drwxrwxrwx 2 www www 4096 2月 17 17:30 phpsock
因为hhvm是www运行,而mysql是mysql运行,这块hhvm去读取mysql的sock时, mysql这个sock上层目录是mysql,导致不能读取,于是得对mysql的这个sock进行777,chmod -R 777 /data/runsock/mysqlsock :
cd /data
chown -R www:www runsock hhvm logs
chmod -R 777 runsock hhvm logs
访问后是502,如下修改:
./jackxiang.conf: fastcgi_pass unix:/var/run/hhvm/sock;修改:
./jackxiang.conf: fastcgi_pass unix:/data/runsock/hhvmsock/hhvm.sock;
于是,就好了?没有,必须重启动nginx,而不是reload,
connect() to unix:/var/run/hhvm/sock failed (2: No such file or directory) while connecting to upstream, client: 106.37.79.53, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/hhvm/sock:", host: "jackxiang.com"
pkill -9 nginx //否则会出现还是找原来的sock:
../sbin/nginx
这样就不用前面的每次开机建立如下目录和赋权限:
centOs7.0也就可以使用hhvm了,性能用在wordpress上,结合前端nginx的cache插件相当不错~
———————————————————安装问题—————————————————————————
yum -y --nogpgcheck install hhvm 出现:
--> 处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要
--> 完成依赖关系计算
错误:Package: hhvm-3.5.0-4.el6.x86_64 (gleez)
Requires: libwebp.so.4()(64bit)
You could try using --skip-broken to work around the problem
出现:
一)源码安装webp库:
先下载libwebp-0.3.0.tar.gz
tar -zxvf libwebp-0.3.0.tar.gz
cd libwebp-0.3.0
./configure && make && make install
cp /usr/local/lib/libwebp.so.4.0.2 /usr/lib64/
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so.4
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so
二)yum search libwebp :
libwebp-devel.i686 : Development files for libwebp, a library for the WebP format
libwebp-devel.x86_64 : Development files for libwebp, a library for the WebP format
libwebp-java.x86_64 : Java bindings for libwebp, a library for the WebP format
libwebp.i686 : Library and tools for the WebP graphics format
libwebp.x86_64 : Library and tools for the WebP graphics format
libwebp-tools.x86_64 : The WebP command line tools
处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要,于是:
root@119.10.6.23:~# ln -s /usr/lib64/libwebp.so /usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls /usr/lib64/libwebp.so.4
/usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls -lart /usr/lib64/libwebp.so.4
lrwxrwxrwx 1 root root 21 4月 28 10:08 /usr/lib64/libwebp.so.4 -> /usr/lib64/libwebp.so
还缺一堆东西:
yum install libyaml.x86_64
yum install libyaml-devel.x86_64
yum install php-pecl-yaml.x86_64
yum install inotify-tools-devel.x86_64
yum install boost-python.x86_64
yum install boost-random.x86_64
yum install mysql-libs.x86_64
软件包 boost-1.54.0-9.el6.x86_64.rpm 没有签名
rpm -e boost-devel-1.41.0-25.el6.centos.x86_64
rpm -e boost-1.41.0-25.el6.centos.x86_64
———————————————建议centos hhvm使用下面的安装脚本———————————————
这样直接就是最新的了hhvm3.4了
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --versionHipHop VM 3.4.0-dev+2014.09.29 (rel)Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dcaExtension API: 20140829脚本来自:http://blog.linuxeye.com/
CentOS 7下hhvm Nginx环境搭建:
http://www.linuxeye.com/Linux/2029.html
———————————————————安装步骤—————————————————————————
一、CentOS 6.5 32位安装 HHVM:
安装:
yum -y install http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum clean all
yum install hhvm
可能遇到的问题:
1.hhvm: error while loading shared libraries: liblcms2.so.2: cannot open shared object file: No such file or directory
yum install http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
2.其他相关文章
http://blog.csdn.net/ownfire/article/details/41366995
http://blog.linuxeye.com/396.html
http://blog.csdn.net/lxlmj/article/details/22283043
二、64位安装HHVM包:
安装hhvm
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \
libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \
bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \
libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --version
HipHop VM 3.4.0-dev+2014.09.29 (rel)
Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905
Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dca
Extension API: 20140829
3. 配置hhvm
删除安装hhvm时创建的nginx用户
userdel -r nginx
修改hhvm目录权限为www
chown -R www.www /var/run/hhvm
chown -R www.www /var/log/hhvm
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:
location ~ .*\.(php|php5)?$ {
fastcgi_pass unix:/var/run/hhvm/sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
service nginx reload
下载支持hhvm方式添加虚拟主机脚本 vhost_hhvm.sh
cd lnmp
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh
chmod +x vhost_hhvm.sh
配置hhvm修改/etc/hhvm/config.hdf,保持如下:
ResourceLimit {
CoreFileSize = 0 # in bytes
MaxSocket = 10000 # must be not 0, otherwise HHVM will not start
SocketDefaultTimeout = 5 # in seconds
MaxRSS = 0
MaxRSSPollingCycle = 0 # in seconds, how often to check max memory
DropCacheCycle = 0 # in seconds, how often to drop disk cache
}
Log {
Level = Info
AlwaysLogUnhandledExceptions = true
RuntimeErrorReportingLevel = 8191
UseLogFile = true
UseSyslog = false
File = /data/logs/hhvm/error.log
Access {
* {
File = /data/logs/hhvm/access.log
Format = %h %l %u % t \"%r\" %>s %b
}
}
}
MySQL {
ReadOnly = false
ConnectTimeout = 1000 # in ms
ReadTimeout = 1000 # in ms
SlowQueryThreshold = 1000 # in ms, log slow queries as errors
KillOnTimeout = false
}
Mail {
SendmailPath = /usr/sbin/sendmail -t -i
ForceExtraParameters =
}
配置hhvm修改/etc/hhvm/server.ini,使内容保存如下:
; php options
pid = /var/run/hhvm/pid
; hhvm specific
;hhvm.server.port = 9001
hhvm.server.file_socket = /var/run/hhvm/sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
修改/etc/hhvm/php.ini,使内容保存如下:
hhvm.mysql.socket = /tmp/mysql.sock ;指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/mysql.sock)
expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样)
memory_limit = 400M
post_max_size = 50M
默认hhvm不提供php中类似disable_functions参数,如何禁用hhvm中shell_exec函数?(可选)
在/etc/hhvm/php.ini中追加如下:
hhvm.jit_enable_rename_function=true
auto_prepend_file= /home/wwwroot/default/disable_functions
新建/home/wwwroot/default/disable_functions,使该文件内容如下:
<?php
function __forbidden_function($name, $obj, $args, $data, &$done) {
throw new Exception('Calling '.$name.' is forbidden.');
}
fb_intercept('shell_exec', '__forbidden_function');
配置service管理hhvm:
cd /etc/init.d/
rm -rf hhvm #官方默认脚本是以www运行,建议用我修改后的
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm
chmod +x hhvm
chkconfig hhvm on
service hhvm restart
管理hhvm服务
systemctl enable hhvm #开机自启动
systemctl start hhvm #启动hhvm
systemctl stop hhvm #停止hhvm
systemctl restart hhvm #重启动hhvm
systemctl status hhvm #查看hhvm状态
添加虚拟主机:
vhost_hhvm.sh #和lnmp添加虚拟主机一样
测试wordpress完美运行,且速度非常快;discuz后台正常,前台页面显示有点问题
参考:https://github.com/facebook/hhvm/wiki/HHVM-Pre-built-packages-for-Centos-6.5
安装时,这个rpm包是有很多的依赖:
因为依赖关系问题而跳过的软件包:
OpenEXR-libs-1.6.1-8.1.el6.x86_64 来自 base
boost-1.54.0-9.el6.x86_64 来自 gleez
boost-atomic-1.54.0-9.el6.x86_64 来自 gleez
boost-chrono-1.54.0-9.el6.x86_64 来自 gleez
boost-context-1.54.0-9.el6.x86_64 来自 gleez
boost-date-time-1.54.0-9.el6.x86_64 来自 gleez
boost-devel-1.54.0-9.el6.x86_64 来自 gleez
boost-filesystem-1.54.0-9.el6.x86_64 来自 gleez
boost-graph-1.54.0-9.el6.x86_64 来自 gleez
boost-iostreams-1.54.0-9.el6.x86_64 来自 gleez
boost-locale-1.54.0-9.el6.x86_64 来自 gleez
boost-log-1.54.0-9.el6.x86_64 来自 gleez
boost-math-1.54.0-9.el6.x86_64 来自 gleez
boost-program-options-1.54.0-9.el6.x86_64 来自 gleez
boost-python-1.54.0-9.el6.x86_64 来自 gleez
boost-random-1.54.0-9.el6.x86_64 来自 gleez
boost-regex-1.54.0-9.el6.x86_64 来自 gleez
boost-serialization-1.54.0-9.el6.x86_64 来自 gleez
boost-signals-1.54.0-9.el6.x86_64 来自 gleez
boost-system-1.54.0-9.el6.x86_64 来自 gleez
boost-test-1.54.0-9.el6.x86_64 来自 gleez
boost-thread-1.54.0-9.el6.x86_64 来自 gleez
boost-timer-1.54.0-9.el6.x86_64 来自 gleez
boost-wave-1.54.0-9.el6.x86_64 来自 gleez
hhvm-3.5.0-4.el6.x86_64 来自 gleez
ilmbase-1.0.1-6.1.el6.x86_64 来自 base
inotify-tools-3.14-1.el6.x86_64 来自 epel
lcms2-2.3-2.el6.x86_64 来自 epel
libvpx-1.3.0-5.el6_5.x86_64 来自 base
libyaml-0.1.3-4.el6_6.x86_64 来自 updates
yum install boost-1.54.0-9.el6.x86_64
源码安装:http://tomlog.com/tech/2012/12/21/build-hhvm.html
安装脚本:http://amh.sh/bbs/post-4874-1-1.htm
http://www.linuxeye.com/Linux/2029.html
Supervisor管理hhvm进程:
http://www.linuxeye.com/Linux/Supervisor-hhvm.html
注意一下路径:
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/data/logs/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
=======================================================
Q:多处出现:软件包boost-regex-1.54.0-9.el6.x86_64.rpm没有签名?
Q:大家都用source编译?我是想通过yum 安装了解一下php的hhvm 尽量用yum 安装。
A:比较容易标准化 机器多的话,可以统一标准化 对,标准化很重要
https://github.com/lj2007331/lnmp
淘宝一个人建的,其中functions目录把每个l n/a mp版本安装封装成了一个shell函数(包含了依赖包),有hhvm和php7。如果是在机器上体验一下,可以使用这个项目或者把他的函数抠出来,可以省去从源码编译挨个找依赖包的痛苦。
————————————————兼容过渡办法—————————————————
测试了下6月6日下载编译的PHP7和HHVM最新的3.7.1.
ab -c100 -n1000 http://127.0.0.1/wordpress/
100并发完成1000个请求,PHP7(开启opcache,5个PHP-FPM工作进程)每秒处理117个请求,HHVM则是每秒126个,性能差距很小.值得一提的是,HHVM没有热身时(第一次压测),每秒只能处理56个请求,而PHP7仍能处理117个请求.
这是我6月6日编译的PHP7开发版,你可以下载进行测试:
http://my.oschina.net/eechen/blog/411534
补充:
如果你觉得处于Alpha版本的PHP7还不够稳定,你可以配置Nginx,PHP7-FPM监听9000端口,PHP5-FPM监听9001端口,当PHP7崩掉的时候自动切换到作为备用的PHP5.
upstream php.backend {
server 127.0.0.1:9000;
server 127.0.0.1:9001 backup;
}
PHP-FPM是多进程的架构,PHP7并没有改动PHP-FPM的架构,所以说就算PHP-FPM工作进程因为内置的PHP7引擎发生故障,我估计也就工作进程会崩溃退出,而PHP-FPM的master进程会自动重启一个新的工作进程.
————————————————————————————————————————————————————
已加载插件:fastestmirror, refresh-packagekit, security
/var/run/yum.pid 已被锁定,PID 为 8085 的另一个程序正在运行。
另外一个程序锁定了 yum;等待它退出……
The other application is: PackageKit
Memory : 22 M RSS (328 MB VSZ)
Started: Mon May 4 16:41:46 2015 - 00:09 ago
State : Uninterruptible, pid: 8085
另外一个程序锁定了 yum;等待它退出……
The other application is: PackageKit
Memory : 31 M RSS (339 MB VSZ)
Started: Mon May 4 16:41:46 2015 - 00:11 ago
你怎么2个东西在跑,kill:
重复执行 install.sh
ps -ef | grep hhvm
service hhvm start
find . -name "hhvm"
./etc/rc.d/init.d/hhvm
./var/run/hhvm
./var/log/hhvm
如果说想配置nginx+hhvm,我用nginx+hhvm可以吧?
vhost.sh
最后,
mysql源码安装的是 mysql-server
mysql x86_64是客户端,别搞错。
还是有问题:
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient_r.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient_r.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16(libmysqlclient_16)(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16(libmysqlclient_16)(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
Requires: libmysqlclient.so.16()(64bit)
Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
libmysqlclient.so.16()(64bit)
已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
Not found
You could try using --skip-broken to work around the problem
问题在:
lnmp.org安装了mysql-
有可能不行 php 用的 mysql库 就有问题。
删除这个包就Ok了?mysql-libs-5.5.43-1.el6.remi.x86_64
Q:干嘛不用我的来安装 整套?
A:历史原因啊。
Q:删除两个?
rpm -e mysql-libs-5.5.43-1.el6.remi.x86_64
rpm -e mysql-5.5.43-1.el6.remi.x86_64
A:
rpm -e mysql-5.1.73-3.el6_5.x86_64 删掉
回家后实践,如下且成功:
rpm -qa |grep mysql
mysql-devel-5.5.43-1.el6.remi.x86_64
mysql-libs-5.5.43-1.el6.remi.x86_64
mysql-5.5.43-1.el6.remi.x86_64
实践是这样的:
rpm -e mysql-devel-5.5.43-1.el6.remi.x86_64
rpm -e mysql-5.5.43-1.el6.remi.x86_64
rpm -e mysql-libs-5.5.43-1.el6.remi.x86_64
于是重新安装一次并重启:
./install.sh
________
ps aux|grep hhvm
www 3155 55.0 2.5 676320 150628 ? R 22:56 0:09 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:
location ~ .*\.(php|php5)?$ {
#fastcgi_pass unix:/data/runsock/php-cgi.sock;
fastcgi_pass unix:/data/runsock/hhvmsock/hhvm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
include fastcgi_params;
}
service nginx reload
详细配置看后面,安装就按上面安装得了。依赖太多,太麻烦了。
ps aux|grep hhvm
www 3155 3.3 2.8 880828 172836 ? Sl 23:23 0:22 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
strace -f -p 3155 //访问一下看有无输出,实践是有输出的。说明安装成功了。
CentOS7 hhvm交给supervisord管理了:
ps -ef | grep super supervisord 这个进程在吗?
service supervisord restart
最后解决,开机这个/var/run/hhvm 会不见了(CentOS7里估计是一个内存磁盘,重启就没了,导致启动失败。),呵,开机就创建好了:
创好是这样的: ls /var/run/hhvm/
hhvm.hhbc pid sock
配置hhvm
# vi /etc/hhvm/server.ini
vi /etc/hhvm/php.ini
一个www的hhvm去读取一个mysql.sock,
而我的sock是放在一个mysql的组目录下,如何实现无permission Denny的读取?
所以得注意权限,如下所示 :
[root@iZ25z0ugwgtZ runsock]# ll /data/runsock
drwxrwxrwx 2 www www 4096 2月 17 17:30 hhvm
drwxrwxrwx 2 mysql mysql 4096 2月 17 17:28 mysqlsock
drwxrwxrwx 2 www www 4096 2月 17 17:30 phpsock
因为hhvm是www运行,而mysql是mysql运行,这块hhvm去读取mysql的sock时, mysql这个sock上层目录是mysql,导致不能读取,于是得对mysql的这个sock进行777,chmod -R 777 /data/runsock/mysqlsock :
cd /data
chown -R www:www runsock hhvm logs
chmod -R 777 runsock hhvm logs
访问后是502,如下修改:
./jackxiang.conf: fastcgi_pass unix:/var/run/hhvm/sock;修改:
./jackxiang.conf: fastcgi_pass unix:/data/runsock/hhvmsock/hhvm.sock;
于是,就好了?没有,必须重启动nginx,而不是reload,
connect() to unix:/var/run/hhvm/sock failed (2: No such file or directory) while connecting to upstream, client: 106.37.79.53, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/hhvm/sock:", host: "jackxiang.com"
pkill -9 nginx //否则会出现还是找原来的sock:
../sbin/nginx
这样就不用前面的每次开机建立如下目录和赋权限:
centOs7.0也就可以使用hhvm了,性能用在wordpress上,结合前端nginx的cache插件相当不错~
———————————————————安装问题—————————————————————————
yum -y --nogpgcheck install hhvm 出现:
--> 处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要
--> 完成依赖关系计算
错误:Package: hhvm-3.5.0-4.el6.x86_64 (gleez)
Requires: libwebp.so.4()(64bit)
You could try using --skip-broken to work around the problem
出现:
一)源码安装webp库:
先下载libwebp-0.3.0.tar.gz
tar -zxvf libwebp-0.3.0.tar.gz
cd libwebp-0.3.0
./configure && make && make install
cp /usr/local/lib/libwebp.so.4.0.2 /usr/lib64/
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so.4
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so
二)yum search libwebp :
libwebp-devel.i686 : Development files for libwebp, a library for the WebP format
libwebp-devel.x86_64 : Development files for libwebp, a library for the WebP format
libwebp-java.x86_64 : Java bindings for libwebp, a library for the WebP format
libwebp.i686 : Library and tools for the WebP graphics format
libwebp.x86_64 : Library and tools for the WebP graphics format
libwebp-tools.x86_64 : The WebP command line tools
处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要,于是:
root@119.10.6.23:~# ln -s /usr/lib64/libwebp.so /usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls /usr/lib64/libwebp.so.4
/usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls -lart /usr/lib64/libwebp.so.4
lrwxrwxrwx 1 root root 21 4月 28 10:08 /usr/lib64/libwebp.so.4 -> /usr/lib64/libwebp.so
还缺一堆东西:
yum install libyaml.x86_64
yum install libyaml-devel.x86_64
yum install php-pecl-yaml.x86_64
yum install inotify-tools-devel.x86_64
yum install boost-python.x86_64
yum install boost-random.x86_64
yum install mysql-libs.x86_64
软件包 boost-1.54.0-9.el6.x86_64.rpm 没有签名
rpm -e boost-devel-1.41.0-25.el6.centos.x86_64
rpm -e boost-1.41.0-25.el6.centos.x86_64
———————————————建议centos hhvm使用下面的安装脚本———————————————
这样直接就是最新的了hhvm3.4了
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --versionHipHop VM 3.4.0-dev+2014.09.29 (rel)Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dcaExtension API: 20140829脚本来自:http://blog.linuxeye.com/
CentOS 7下hhvm Nginx环境搭建:
http://www.linuxeye.com/Linux/2029.html
———————————————————安装步骤—————————————————————————
一、CentOS 6.5 32位安装 HHVM:
安装:
yum -y install http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum clean all
yum install hhvm
可能遇到的问题:
1.hhvm: error while loading shared libraries: liblcms2.so.2: cannot open shared object file: No such file or directory
yum install http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
2.其他相关文章
http://blog.csdn.net/ownfire/article/details/41366995
http://blog.linuxeye.com/396.html
http://blog.csdn.net/lxlmj/article/details/22283043
二、64位安装HHVM包:
安装hhvm
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \
libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \
bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \
libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --version
HipHop VM 3.4.0-dev+2014.09.29 (rel)
Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905
Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dca
Extension API: 20140829
3. 配置hhvm
删除安装hhvm时创建的nginx用户
userdel -r nginx
修改hhvm目录权限为www
chown -R www.www /var/run/hhvm
chown -R www.www /var/log/hhvm
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:
location ~ .*\.(php|php5)?$ {
fastcgi_pass unix:/var/run/hhvm/sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
service nginx reload
下载支持hhvm方式添加虚拟主机脚本 vhost_hhvm.sh
cd lnmp
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh
chmod +x vhost_hhvm.sh
配置hhvm修改/etc/hhvm/config.hdf,保持如下:
ResourceLimit {
CoreFileSize = 0 # in bytes
MaxSocket = 10000 # must be not 0, otherwise HHVM will not start
SocketDefaultTimeout = 5 # in seconds
MaxRSS = 0
MaxRSSPollingCycle = 0 # in seconds, how often to check max memory
DropCacheCycle = 0 # in seconds, how often to drop disk cache
}
Log {
Level = Info
AlwaysLogUnhandledExceptions = true
RuntimeErrorReportingLevel = 8191
UseLogFile = true
UseSyslog = false
File = /data/logs/hhvm/error.log
Access {
* {
File = /data/logs/hhvm/access.log
Format = %h %l %u % t \"%r\" %>s %b
}
}
}
MySQL {
ReadOnly = false
ConnectTimeout = 1000 # in ms
ReadTimeout = 1000 # in ms
SlowQueryThreshold = 1000 # in ms, log slow queries as errors
KillOnTimeout = false
}
Mail {
SendmailPath = /usr/sbin/sendmail -t -i
ForceExtraParameters =
}
配置hhvm修改/etc/hhvm/server.ini,使内容保存如下:
; php options
pid = /var/run/hhvm/pid
; hhvm specific
;hhvm.server.port = 9001
hhvm.server.file_socket = /var/run/hhvm/sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
修改/etc/hhvm/php.ini,使内容保存如下:
hhvm.mysql.socket = /tmp/mysql.sock ;指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/mysql.sock)
expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样)
memory_limit = 400M
post_max_size = 50M
默认hhvm不提供php中类似disable_functions参数,如何禁用hhvm中shell_exec函数?(可选)
在/etc/hhvm/php.ini中追加如下:
hhvm.jit_enable_rename_function=true
auto_prepend_file= /home/wwwroot/default/disable_functions
新建/home/wwwroot/default/disable_functions,使该文件内容如下:
<?php
function __forbidden_function($name, $obj, $args, $data, &$done) {
throw new Exception('Calling '.$name.' is forbidden.');
}
fb_intercept('shell_exec', '__forbidden_function');
配置service管理hhvm:
cd /etc/init.d/
rm -rf hhvm #官方默认脚本是以www运行,建议用我修改后的
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm
chmod +x hhvm
chkconfig hhvm on
service hhvm restart
管理hhvm服务
systemctl enable hhvm #开机自启动
systemctl start hhvm #启动hhvm
systemctl stop hhvm #停止hhvm
systemctl restart hhvm #重启动hhvm
systemctl status hhvm #查看hhvm状态
添加虚拟主机:
vhost_hhvm.sh #和lnmp添加虚拟主机一样
测试wordpress完美运行,且速度非常快;discuz后台正常,前台页面显示有点问题
参考:https://github.com/facebook/hhvm/wiki/HHVM-Pre-built-packages-for-Centos-6.5
安装时,这个rpm包是有很多的依赖:
因为依赖关系问题而跳过的软件包:
OpenEXR-libs-1.6.1-8.1.el6.x86_64 来自 base
boost-1.54.0-9.el6.x86_64 来自 gleez
boost-atomic-1.54.0-9.el6.x86_64 来自 gleez
boost-chrono-1.54.0-9.el6.x86_64 来自 gleez
boost-context-1.54.0-9.el6.x86_64 来自 gleez
boost-date-time-1.54.0-9.el6.x86_64 来自 gleez
boost-devel-1.54.0-9.el6.x86_64 来自 gleez
boost-filesystem-1.54.0-9.el6.x86_64 来自 gleez
boost-graph-1.54.0-9.el6.x86_64 来自 gleez
boost-iostreams-1.54.0-9.el6.x86_64 来自 gleez
boost-locale-1.54.0-9.el6.x86_64 来自 gleez
boost-log-1.54.0-9.el6.x86_64 来自 gleez
boost-math-1.54.0-9.el6.x86_64 来自 gleez
boost-program-options-1.54.0-9.el6.x86_64 来自 gleez
boost-python-1.54.0-9.el6.x86_64 来自 gleez
boost-random-1.54.0-9.el6.x86_64 来自 gleez
boost-regex-1.54.0-9.el6.x86_64 来自 gleez
boost-serialization-1.54.0-9.el6.x86_64 来自 gleez
boost-signals-1.54.0-9.el6.x86_64 来自 gleez
boost-system-1.54.0-9.el6.x86_64 来自 gleez
boost-test-1.54.0-9.el6.x86_64 来自 gleez
boost-thread-1.54.0-9.el6.x86_64 来自 gleez
boost-timer-1.54.0-9.el6.x86_64 来自 gleez
boost-wave-1.54.0-9.el6.x86_64 来自 gleez
hhvm-3.5.0-4.el6.x86_64 来自 gleez
ilmbase-1.0.1-6.1.el6.x86_64 来自 base
inotify-tools-3.14-1.el6.x86_64 来自 epel
lcms2-2.3-2.el6.x86_64 来自 epel
libvpx-1.3.0-5.el6_5.x86_64 来自 base
libyaml-0.1.3-4.el6_6.x86_64 来自 updates
yum install boost-1.54.0-9.el6.x86_64
源码安装:http://tomlog.com/tech/2012/12/21/build-hhvm.html
安装脚本:http://amh.sh/bbs/post-4874-1-1.htm
背景:对于文件块验证,或字符串的传输是否在网络中修改过,这儿有各种方法,MD5、SHA1、CRC32这三个用于检测文件是否被修改过,哪个可靠性最高?我看特别是分片上传这块,有的是md5,有的是sha1,有的是crc的验证,如优酷(是crc的)、百度云、126的邮箱大附件上传等都有这么一个环节~于是,在网上找相关文章了解一下其不同及性能上的差别。
MD5 和SHA1的基本原理都是一样的,都是将一个文件按照一定的算法计算后得到一个固定位数的数据,这个数据就是这个文件的(MD5,SHA1)值。而且这个值是唯一的,也就是说只有这个文件经过计算后能够得到这个值,里面哪怕有一个标点的改动所计算的值的差别都会很大。只需要在本地再进行一次MD5,SHA1的计算和原值比较即可知道源文件是否完整。CRC校验通常是将CRC的校验码放在数据文件的后面一同发送给接受方,接收方再次通过计算来判定数据的完整性。
目前如果用于加密领域,SHA的安全性能最高。如果你的可靠性是指文件的完整性,那么个人觉得MD5和SHA1要比CRC32好一些。
————————————————————————————————————————————————————————————————————————————
一、MD5与SHA算法
Hash函数又称杂凑函数,用于摘要算法,它是将不定长的明文信息经过复杂的运算得到一个定长的数值,这就是“签名”。摘要算法与一般的对称或非对称加密算法不同,它并不用于防止信息被窃取,而是用于证明原文的完整性和准确性,也就是说,数字签名主要是用于防止信息被篡改。
由于Hash函数产生定长的数字签名,其结果是个有限的集合,而待签名的明文信息可以是计算机网络上传输的任意信息,也就是说,明文信息是一个无限集合,两个集合之间其实无法构成一一对应的关系,总会有多个明文信息产生相同的数字签名的情况发生,这就是所谓的“碰撞”。不过Hash函数的可靠性在概率上仍可以算法的健壮性来保证,数字签名类似指纹,只要选择足够全的算法,产生碰撞的概率就会足够小,可令现代最先进的计算设备也找不出“碰撞”,这样算法就不会被破解了。
MD5(RFC1321)诞生于1991年,全称是“Message-Digest Algorithm信息摘要算法)5”,由MIT的计算机安全实验室和RSA安全公司共同提出,之前已经有MD2、MD3和MD4几种算法。MD5克服了MD4的缺陷,生成128bit的摘要信息串,出现之后迅速成为主流算法,并在1992年被收录到RFC中。
MD5算法是1991年发布的一项数字签名加密算法,它当时解决了MD4算法的安全性缺陷,成为应用非常广泛的一种算法。作为Hash函数的一个应用实例。
SHA诞生于1993年,全称是安全散列算法(Secure Hash Algorithm),由美国国家安全局(NSA)设计,之后被美国标准与技术研究院(NIST)收录到美国的联邦信息处理标准(FIPS)中,成为美国国家标准,SHA(后来被称作SHA-0)于1995被SHA-1(RFC3174)替代。SHA-1生成长度为160bit的摘要信息串,虽然之后又出现了SHA-224、SHA-256、SHA-384和SHA-512等被统称为“SHA-2”的系列算法,但仍以SHA-1为主流。
SHA-1的应用范围或许比MD5更加广泛,其安全性较MD5要高出很多。SHA-1是美国国家标准技术研究院(NIST)与美国国家安全局(NSA)共同设计的,一些重要的场合都选择SHA-1来做数字签名。美国政府更是早在1994年就开始采用了SHA-1算法。
MD5和SHA-1是当前应用最为广泛的两种散列算法。常见的Unix系统口令以及多数论坛/社区系统的口令都是经MD5处理后保存其摘要信息串,在互联网上,很多文件在开放下载的同时都提供一个MD5的信息摘要,使下载方(通过MD5摘要计算)能够确认所下载的文件与原文件一致,以此来防止文件被篡改。
MD5和SHA-1还常被用来与公钥技术结合来创建数字签名。当前几乎所有主要的信息安全协议中都使用了SHA-1或MD5,包括SSL(HTTPS就是SSL的一种应用)、TLS、PGP、SSH、S/MIME和IPSec,因此可以说SHA-1和MD5是当前信息安全的重要基础之一。
不过,从技术上讲,MD5和SHA-1的碰撞可在短时间内被求解出并不意味着两种算法完全失效。例如,对于公文的数字签名来说,寻找到碰撞与寻找到有特定含义的碰撞之间仍有很大的差距,而后者才会使伪造数字公文成为现实。但无论如何,王小云教授所掌握的方法已经为短时间内寻找到MD5或SHA-1的碰撞成为可能,这足以使经过MD5或SHA-1处理的数字签名再也难以成为法律认可的依据。
MD5和SHA-1就曾经被认为是足够安全的Hash算法。虽然早在1994年就有研究报告指出,如果用运算能力最强的机器,平均用24天就可能找到一个MD5的碰撞,但这个方法的效率和成本在现实中并不具备实际的意义。王小云在接受本报记者独家采访时透露,她独创的“模差分”算法可以用一般性能的计算机在两个小时内就找到MD5的碰撞,已经为实际应用提供了可能。
来自:http://blog.csdn.net/liyangbing315/article/details/5682107
二、微软出品:MD5和SHA1值验证命令行工具
基本使用方法:
fciv.exe myfilm.iso -wp -md5 -xml mydb.xml
该命令可以计算myfilm.iso的md5值,并且保存到mydb.xml当中,同时会保存该文件的名称,-wp的作用是去掉文件的路径信息仅仅保存文件名
fciv.exe -list -md5 -xml mydb.xml
打印mydb.xml当中的md5值以及相应的文件名称,它的显示格式也比较特别,首先打印md5值,随后是文件名称
fciv.exe d:\mymusic\ -tpye *.mp3 -wp -md5 -xml mymusic.xml
计算d盘mymusic文件夹下面,所有以MP3结尾的文件的md5值并且保存到mymusic.xml当中
由于这是一个命令行工具,因此可以批处理的方式,大量自动化计算各种md5值。
工具下载地址和基本的使用方法介绍见下面的链接
http://support.microsoft.com/kb/841290
DownLoad Url:http://download.microsoft.com/download/c/f/4/cf454ae0-a4bb-4123-8333-a1b6737712f7/Windows-KB841290-x86-ENU.exe
摘自:http://blog.chinaunix.net/uid-20385936-id-3841729.html
三、PHP md5 vs sha1 性能测试
先上代码:
Win7 PHP 5.3.5 cli 下连续三次的输出
D:\test>php md5-vs-sha1.php
0.36025786399841
0.47072792053223
D:\test>php md5-vs-sha1.php
0.36374092102051
0.47682809829712
D:\test>php md5-vs-sha1.php
0.37186717987061
0.55312395095825
Ubuntu Server 11.04 PHP 5.3.5 cli 下的连续三次的输出
$ php md5-vs-sha1.php
0.4476261138916
0.45379900932312
$ php md5-vs-sha1.php
0.43760395050049
0.45441389083862
$ php md5-vs-sha1.php
0.44000005722046
0.53387594223022
由此可见,md5 会比 sha1 稍微快一点点,两者都不会造成性能问题。
From:http://my.oschina.net/heiing/blog/122914
MD5 和SHA1的基本原理都是一样的,都是将一个文件按照一定的算法计算后得到一个固定位数的数据,这个数据就是这个文件的(MD5,SHA1)值。而且这个值是唯一的,也就是说只有这个文件经过计算后能够得到这个值,里面哪怕有一个标点的改动所计算的值的差别都会很大。只需要在本地再进行一次MD5,SHA1的计算和原值比较即可知道源文件是否完整。CRC校验通常是将CRC的校验码放在数据文件的后面一同发送给接受方,接收方再次通过计算来判定数据的完整性。
目前如果用于加密领域,SHA的安全性能最高。如果你的可靠性是指文件的完整性,那么个人觉得MD5和SHA1要比CRC32好一些。
————————————————————————————————————————————————————————————————————————————
一、MD5与SHA算法
Hash函数又称杂凑函数,用于摘要算法,它是将不定长的明文信息经过复杂的运算得到一个定长的数值,这就是“签名”。摘要算法与一般的对称或非对称加密算法不同,它并不用于防止信息被窃取,而是用于证明原文的完整性和准确性,也就是说,数字签名主要是用于防止信息被篡改。
由于Hash函数产生定长的数字签名,其结果是个有限的集合,而待签名的明文信息可以是计算机网络上传输的任意信息,也就是说,明文信息是一个无限集合,两个集合之间其实无法构成一一对应的关系,总会有多个明文信息产生相同的数字签名的情况发生,这就是所谓的“碰撞”。不过Hash函数的可靠性在概率上仍可以算法的健壮性来保证,数字签名类似指纹,只要选择足够全的算法,产生碰撞的概率就会足够小,可令现代最先进的计算设备也找不出“碰撞”,这样算法就不会被破解了。
MD5(RFC1321)诞生于1991年,全称是“Message-Digest Algorithm信息摘要算法)5”,由MIT的计算机安全实验室和RSA安全公司共同提出,之前已经有MD2、MD3和MD4几种算法。MD5克服了MD4的缺陷,生成128bit的摘要信息串,出现之后迅速成为主流算法,并在1992年被收录到RFC中。
MD5算法是1991年发布的一项数字签名加密算法,它当时解决了MD4算法的安全性缺陷,成为应用非常广泛的一种算法。作为Hash函数的一个应用实例。
SHA诞生于1993年,全称是安全散列算法(Secure Hash Algorithm),由美国国家安全局(NSA)设计,之后被美国标准与技术研究院(NIST)收录到美国的联邦信息处理标准(FIPS)中,成为美国国家标准,SHA(后来被称作SHA-0)于1995被SHA-1(RFC3174)替代。SHA-1生成长度为160bit的摘要信息串,虽然之后又出现了SHA-224、SHA-256、SHA-384和SHA-512等被统称为“SHA-2”的系列算法,但仍以SHA-1为主流。
SHA-1的应用范围或许比MD5更加广泛,其安全性较MD5要高出很多。SHA-1是美国国家标准技术研究院(NIST)与美国国家安全局(NSA)共同设计的,一些重要的场合都选择SHA-1来做数字签名。美国政府更是早在1994年就开始采用了SHA-1算法。
MD5和SHA-1是当前应用最为广泛的两种散列算法。常见的Unix系统口令以及多数论坛/社区系统的口令都是经MD5处理后保存其摘要信息串,在互联网上,很多文件在开放下载的同时都提供一个MD5的信息摘要,使下载方(通过MD5摘要计算)能够确认所下载的文件与原文件一致,以此来防止文件被篡改。
MD5和SHA-1还常被用来与公钥技术结合来创建数字签名。当前几乎所有主要的信息安全协议中都使用了SHA-1或MD5,包括SSL(HTTPS就是SSL的一种应用)、TLS、PGP、SSH、S/MIME和IPSec,因此可以说SHA-1和MD5是当前信息安全的重要基础之一。
不过,从技术上讲,MD5和SHA-1的碰撞可在短时间内被求解出并不意味着两种算法完全失效。例如,对于公文的数字签名来说,寻找到碰撞与寻找到有特定含义的碰撞之间仍有很大的差距,而后者才会使伪造数字公文成为现实。但无论如何,王小云教授所掌握的方法已经为短时间内寻找到MD5或SHA-1的碰撞成为可能,这足以使经过MD5或SHA-1处理的数字签名再也难以成为法律认可的依据。
MD5和SHA-1就曾经被认为是足够安全的Hash算法。虽然早在1994年就有研究报告指出,如果用运算能力最强的机器,平均用24天就可能找到一个MD5的碰撞,但这个方法的效率和成本在现实中并不具备实际的意义。王小云在接受本报记者独家采访时透露,她独创的“模差分”算法可以用一般性能的计算机在两个小时内就找到MD5的碰撞,已经为实际应用提供了可能。
来自:http://blog.csdn.net/liyangbing315/article/details/5682107
二、微软出品:MD5和SHA1值验证命令行工具
基本使用方法:
fciv.exe myfilm.iso -wp -md5 -xml mydb.xml
该命令可以计算myfilm.iso的md5值,并且保存到mydb.xml当中,同时会保存该文件的名称,-wp的作用是去掉文件的路径信息仅仅保存文件名
fciv.exe -list -md5 -xml mydb.xml
打印mydb.xml当中的md5值以及相应的文件名称,它的显示格式也比较特别,首先打印md5值,随后是文件名称
fciv.exe d:\mymusic\ -tpye *.mp3 -wp -md5 -xml mymusic.xml
计算d盘mymusic文件夹下面,所有以MP3结尾的文件的md5值并且保存到mymusic.xml当中
由于这是一个命令行工具,因此可以批处理的方式,大量自动化计算各种md5值。
工具下载地址和基本的使用方法介绍见下面的链接
http://support.microsoft.com/kb/841290
DownLoad Url:http://download.microsoft.com/download/c/f/4/cf454ae0-a4bb-4123-8333-a1b6737712f7/Windows-KB841290-x86-ENU.exe
摘自:http://blog.chinaunix.net/uid-20385936-id-3841729.html
三、PHP md5 vs sha1 性能测试
先上代码:
Win7 PHP 5.3.5 cli 下连续三次的输出
D:\test>php md5-vs-sha1.php
0.36025786399841
0.47072792053223
D:\test>php md5-vs-sha1.php
0.36374092102051
0.47682809829712
D:\test>php md5-vs-sha1.php
0.37186717987061
0.55312395095825
Ubuntu Server 11.04 PHP 5.3.5 cli 下的连续三次的输出
$ php md5-vs-sha1.php
0.4476261138916
0.45379900932312
$ php md5-vs-sha1.php
0.43760395050049
0.45441389083862
$ php md5-vs-sha1.php
0.44000005722046
0.53387594223022
由此可见,md5 会比 sha1 稍微快一点点,两者都不会造成性能问题。
From:http://my.oschina.net/heiing/blog/122914
背景:502 Bad Gateway nginx问题,再次排查~~~keepalive_timeout 1800; 是不是太大了,浏览器访问没有关闭会一直连接状态,这块是否有必要不keepalive呢?http1.1中默认的keep-alive为connection(使用持久化连接),在http1.0中则默认为close,在大并发量的情况下可能需要将客户端的连接close掉,以保障服务器的正常运转。(因为每一台服务器它所能建立的最大连接数是有上限的,lnux下ulimit n xxx),nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。keepalive_timeout 0; 来自:http://www.cnblogs.com/meteoric_cry/archive/2011/06/07/2074150.html
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:
获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的 keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800
实践得出如下参数:
新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min, 1 user, load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2
因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a 里的 open files (-n) 65535 实现的,
所以使用下面的命令: ulimit -n 65535 并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接: 修改/etc/security/limits.conf 添加如下一行: * - nofile 65535 修改/etc/pam.d/login添加如下一行 session required /lib/security/pam_limits.so 最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。
ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html
自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接
HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭
对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高
不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态
是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么
显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 jackxiang.com:8012 *:* LISTEN
tcp 0 0 jackxiang.com:9004 *:* LISTEN
tcp 0 0 jackxiang.com:9005 *:* LISTEN
tcp 0 0 jackxiang.com:8013 *:* LISTEN
tcp 0 0 *:5901 *:* LISTEN
tcp 0 0 jackxiang.com:8015 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 jackxiang.com:x11 *:* LISTEN
tcp 0 0 jackxiang.com:cddbp-alt *:* LISTEN
tcp 0 0 jackxiang.com:8017 *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 jackxiang.com:socks *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:34139 *:* LISTEN
tcp 0 0 jackxiang.com:irdmi *:* LISTEN
tcp 0 0 jackxiang.com:mcreport *:* LISTEN
tcp 0 0 jackxiang.com:8006 *:* LISTEN
tcp 0 0 jackxiang.com:cslistener *:* LISTEN
tcp 0 0 jackxiang.com:8009 *:* LISTEN
tcp 0 0 jackxiang.com:etlservicemgr *:* LISTEN
tcp 0 0 jackxiang.com:8010 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:webcache *:* LISTEN
tcp 0 0 *:6001 *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:60763 *:* LISTEN
我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止
因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置
因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响
以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————
导致服务器load过高
send_timeout
syntax: send_timeout the time
default: send_timeout 60
context: http, server, location
Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.
应该是tcp连接没有释放造成的,我最近也碰到这个问题
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
具体如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
Tcp图解:
获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:
文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3
近日,互联网有消息透露称微软Skype宣布正在测试一个基于Web端的即时通讯平台,也就是说Web版的Skype很可能将很快和大家见面。
按照Skype的说法,有了这个基于Web端的Skype即时通讯平台,接下来用户们将可以直接在浏览器中使用Skype的音视频服务,将会支持IE、Chrome、Firefox、Safari等浏览器。
Skype宣布正测试基于Web端的即时通讯平台_天极yesky软件频道
据悉,Skype for Web采用WebRTC技术,是一套基于浏览器的音频和视频标准,该标准将不需要用户安装本地软件。
因为目前处于Beta阶段,故仅有小部分用户可以体验到,并且还存在许多Bug,正式版将会在接下来几个月发布。
按照Skype的说法,有了这个基于Web端的Skype即时通讯平台,接下来用户们将可以直接在浏览器中使用Skype的音视频服务,将会支持IE、Chrome、Firefox、Safari等浏览器。
Skype宣布正测试基于Web端的即时通讯平台_天极yesky软件频道
据悉,Skype for Web采用WebRTC技术,是一套基于浏览器的音频和视频标准,该标准将不需要用户安装本地软件。
因为目前处于Beta阶段,故仅有小部分用户可以体验到,并且还存在许多Bug,正式版将会在接下来几个月发布。
背景:chrome速度快,版本更新后,我们认为速度更快,现在都到44.0.2369.0了,链接在,http://down.tech.sina.com.cn/page/40975.html
Google浏览器Chrome稳定版近日发布例行小幅更新,新版本号为v40.0.2214.94,本次更新为V40的第三次维护,修补安全漏洞并消除bug,改进了更新消息提示窗,在提示出错信息后给予全新计时机制。
Chrome v40.0.2214.94浏览器稳定版更新_天极yesky软件频道
Chrome v40.0.2214.94浏览器稳定版更新
Google Chrome 40.0 更新内容如下:
在Windows和Linux平台上新的Chrome应用更新对话框。
此更新包括62个安全修补程序。包括:ICU、V8引擎、字体中的内存损坏问题,Use-after-free在IndexedDB、WebAudio、DOM、FFmpeg、Speech、Views中的问题,Same-origin-bypass在V8引擎中的问题,ICU、字体未初始化值的问题,UI、Skia、PDFium、字体越界读取问题,AppCache的缓存错误问题等。
64位Chrome能更好地利用当今的硬件,并且对速度、安全性、稳定性进行了改善,主要特性如下:
速度:64位Chrome能利用最新的处理器和编译器优化、更现代的指令集、更快的调用协议,从而实现了速度大提升,尤其是在图形和多媒体内容方面,性能提升25%。
安全性:Chrome能够利用最新的OS功能,例如Windows 8的High Entropy ASLR,64位Chrome在安全性上也实现了大幅提升。
稳定性:Google还在32位Chrome的基础上增强了64位Chrome的稳定性,尤其是,渲染器处理中的崩溃率大大降低,是32位Chrome的一半。
官方下载:
34位版本 Chrome v40.0.2214.94
如果出现升级失败,看下Google Chrome浏览器提示管理员已停用更新的解决方法:
Google Chrome浏览器提示管理员已停用更新的解决方法
最近发现Google Chrome不能自动更新,打开设置的关于Google Chrome看到如下图的提示,
要解决该问题,需要修改注册表的值,打开运行窗口(快捷键Win+R)输入regedit并回车,
在注册表窗口中依次导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
找到该项下面的UpdateDefault,将其值修改为1。
Google浏览器Chrome稳定版近日发布例行小幅更新,新版本号为v40.0.2214.94,本次更新为V40的第三次维护,修补安全漏洞并消除bug,改进了更新消息提示窗,在提示出错信息后给予全新计时机制。
Chrome v40.0.2214.94浏览器稳定版更新_天极yesky软件频道
Chrome v40.0.2214.94浏览器稳定版更新
Google Chrome 40.0 更新内容如下:
在Windows和Linux平台上新的Chrome应用更新对话框。
此更新包括62个安全修补程序。包括:ICU、V8引擎、字体中的内存损坏问题,Use-after-free在IndexedDB、WebAudio、DOM、FFmpeg、Speech、Views中的问题,Same-origin-bypass在V8引擎中的问题,ICU、字体未初始化值的问题,UI、Skia、PDFium、字体越界读取问题,AppCache的缓存错误问题等。
64位Chrome能更好地利用当今的硬件,并且对速度、安全性、稳定性进行了改善,主要特性如下:
速度:64位Chrome能利用最新的处理器和编译器优化、更现代的指令集、更快的调用协议,从而实现了速度大提升,尤其是在图形和多媒体内容方面,性能提升25%。
安全性:Chrome能够利用最新的OS功能,例如Windows 8的High Entropy ASLR,64位Chrome在安全性上也实现了大幅提升。
稳定性:Google还在32位Chrome的基础上增强了64位Chrome的稳定性,尤其是,渲染器处理中的崩溃率大大降低,是32位Chrome的一半。
官方下载:
34位版本 Chrome v40.0.2214.94
如果出现升级失败,看下Google Chrome浏览器提示管理员已停用更新的解决方法:
Google Chrome浏览器提示管理员已停用更新的解决方法
最近发现Google Chrome不能自动更新,打开设置的关于Google Chrome看到如下图的提示,
要解决该问题,需要修改注册表的值,打开运行窗口(快捷键Win+R)输入regedit并回车,
在注册表窗口中依次导航到
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Update
找到该项下面的UpdateDefault,将其值修改为1。
背景:能用web引擎支持不用web浏览器,更精减,能用开源不用闭源,这儿就有一个开源的web 引擎,并支持WEBRtc ,链接:https://crosswalk-project.org/documentation/webrtc.html ,第二:微软从IE转向Spartan浏览器开发 http://tools.yesky.com/331/50546831.shtml ,微软新浏览器“Spartan”界面截图再曝光,解决兼容性问题:http://soft.yesky.com/52/50685552.shtml ,表明微软正在发力网络用户及界面展现端。
阅读全文
阅读全文
warning:deprecated conversion from string constant to 'char *' 解决方案
Unix/LinuxC技术 jackxiang 2015-2-16 17:00
背景:用新版本的编译器编译时,原来没有报任何错和警告的代码,现在居然报出警告了,
之前是:
无错误,现在是新的gcc v4.4的编译器编译时候出现警告了,如下:
警告如下:
multipepollserver.cpp:530: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:536: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:537: warning: deprecated conversion from string constant to ‘char*’
原来是定义pid变量时,新的gcc版本需要加上const,也就是:
为何要加,下面文章有描写道:
阅读全文
之前是:
无错误,现在是新的gcc v4.4的编译器编译时候出现警告了,如下:
警告如下:
multipepollserver.cpp:530: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:536: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:537: warning: deprecated conversion from string constant to ‘char*’
原来是定义pid变量时,新的gcc版本需要加上const,也就是:
为何要加,下面文章有描写道:
阅读全文
[实践OK]libmemcached使用(c 客户端连接 memcached),封装 libmemcached 构建 memcached 客户端。
Cache与Store jackxiang 2015-2-15 17:05
背景:如果要用c写成一个服务部署4台机器,均得和memcached交互,还得用这个库,如PHP的扩展啥的没怎么和c的lib打交到,这下实践一下挺好的,过程比较曲折但是也发现了这memcached用新的gcc还是对配置上有一些影响的,就单说配置这块的门槛就变高了,更别说c下的调试啥的,实践起来仅仅通过网上的一篇文章未必能搞定。
libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具,包括: memcat、memflush、memrm、memstat、memslap。
在Ubuntu上安装memcached和libmemcached http://www.linuxidc.com/Linux/2010-04/25543.htm
libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm
memcached简单的使用教程(转载): http://blog.csdn.net/huangqiwa/article/details/21174425
使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355
(1)封装 libmemcached 构建 memcached 客户端:http://blog.csdn.net/yanghw0510/article/details/7292236
(2)libmemcached使用(c 客户端连接 memcached) :
(3)libmemcached 下载地址。https://launchpad.net/libmemcached/
1、下载安装libmemcached
$ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz
$ tar xvzf libmemcached-0.44tar.gz
$ cd libmemcached-0.44
$ ./configure
$ make
$ sudo make install
libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。
我在这儿下的:https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
注:
如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本.
处理如下:
yum install gcc44 gcc44-c++ libstdc++44-devel
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
重新编译安装libmemcached-1.0.9
关键信息:error: tr1/cinttypes: No such file or directory
报错原因:libmemcached需要 gcc 4.2 以上版本才可编译,而centos 5.4 的gcc版本只有4.1 ,详见:https://bugs.launchpad.net/libmemcached/+bug/1076181
解决方法:安装gcc44的扩展包,详见:http://gearman.info/build/centos5-8.html
export就是在于此,把这个gcc和g++的版本号给提上去,以方便这个memcached的编译:
/usr/bin/gcc44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
gcc -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
/usr/bin/g++44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
g++ -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
——————————————————————————————————————————————————————————
这个问题在安gearman时也遇到过,升级gcc,参考连接: http://jackxiang.com/post/7693/ ,软链接如下所示:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc
export CXX=/usr/bin/g++44
./configure && make && make install
./configure && make && make install
/usr/bin/install -c -m 644 support/libmemcached.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
明天再整下,估计是so没有给ldd进来...
2、libmemcached简单测试使用
编译:g++ -o testmemcached testmemcached.cpp -lmemcached
运行:./testmemcached
结果:Save data:value sucessful!
Get value:value sucessful!
Delete key:key sucessful!
实践编译一下:
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
看来还得重新export一次新的编译器,因为昨天的关了终端,今天的又没了:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc //这行有问题~
export CXX=/usr/bin/g++44
g++ -o testmemcached testmemcached.cpp -lmemcached
为何还是不行?
echo $CC
/usr/bin/gcc //没变,这儿有问题,再重新设置一次,查到上面这个or有问题:export CC=/usr/bin/gcc44。
# echo $CXX
/usr/bin/g++44 //变了
重新设置,好了:
export CC=/usr/bin/gcc44
/usr/bin/gcc44
继续折腾,/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/cinttypes:35,
from /usr/local/include/libmemcached-1.0/memcached.h:46,
from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x.
加上:-lpthread -std=c++0x ,解决如下:
g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x
/usr/bin/ld: cannot find -lmemcached
collect2: ld returned 1 exit status
也就是说编译器并不能从ldconfig 里得知,其lib在哪儿(及时把Lib路径加入到/etc/ld.so.conf.d/libmemcache.conf),得指定:
在网上找了一下,发现是这样的:http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数,是和宏相关,那就加了,
指定一个新的参数:-std=c++0x :
/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
collect2: ld returned 1 exit status
/usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
怎样彻底解决"undefined reference to `pthread_create'"问题 ,说是加个: -lrt ,这一看就是那个memcached的库包含了这个文件:#include<pthread.h>
来源参考:
http://bbs.chinaunix.net/thread-1586752-1-1.html
于是Ok啦,最终O了,如下:
[root@test testmemcachedcpp]# /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
[root@test testmemcachedcpp]#
运行一下试试:
[root@test testmemcachedcpp]# ./testmemcached
./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory
[root@test /]# find . -name "libmemcached.so.11"
./usr/local/lib/libmemcached.so.11
打开配置文件 vi /etc/ld.so.conf
加上一行:/usr/local/lib
执行/sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# ./testmemcached
[root@test testmemcachedcpp]#
没报错了~,用gdb看一下 加个-g参数:
/usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
发现localhost没有开11211,于是找了一台机器把ip和端口写上,重新编译一次后运行Ok,如下:
[root@test testmemcachedcpp]# ./testmemcached
Save data:value sucessful!
Get value:value sucessful!
少了一个删除成功的,简单调试一下:
(gdb) n
Get value:value sucessful!
50 rc=memcached_delete(memc,key.c_str(),key_length,expiration);
(gdb) p key.c_str()
$5 = 0x184372e8 "key"
(gdb) p key_length
$6 = 3
(gdb) n
51 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_INVALID_ARGUMENTS
也就是调这个函数的参数不对,返回不是MEMCACHED_SUCCESS,所以没有打印出:cout<<"Delete key:"<<key<<" sucessful!"<<endl;
####################新的代码里grep了一下该方法###########################
./tests/mem_udp.cc: memcached_delete(memc, test_literal_param("foo"), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_, key.c_str(), key.length(), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_,
./tests/libmemcached-1.0/replication.cc: memcached_return_t del_rc= memcached_delete(memc_replicated,
./tests/libmemcached-1.0/mem_functions.cc: rc= memcached_delete(memc, "foo", 3, 1);
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, "foo", 3, 0)));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, "foo", 3, 0));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, "foo", 3, 0));
####################################################################
于是修改为下面这样:
//rc=memcached_delete(memc,key.c_str(),key_length,expiration);
rc=memcached_delete(memc,key.c_str(),key_length,0);
./testmemcached
Save data:value2 sucessful!
Get value:value2 sucessful!
Delete key:key sucessful!
刚才失败时有值,现在运行后没值了,给成功删除了:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key
VALUE key 0 5
value
END
get key
END
后面怎么结合c的socket 及epoll进行进程/线程调试就不再细说了,我也在摸索中,应该也有相关的调试办法,但这儿说明这个memcached搞个新的gcc版本库才能编译确实带了相当多编译及配置上的的麻烦~
最后,用C函数里的add函数实现类php的memcache的扩展的原子操作函数,如下:
原子操作方法,假如有add后就不能再add,必须删除后才能add,这个可以用作锁:
./libmemcached-1.0.18/libmemcached-1.0/memcached.hpp:
和php的add函数一样第一次运行时没有问题此时值设置成功,再运行add时一次就add不进去,add设置进去后,用set是能重新设置进去的,只是用add原子操作是不行的,用它来做锁很好使:
1)代码片段:
2)运行情况:
[root@test testmemcachedcpp]# gdb testmemcached
b 41
r
Add data:value unsucessful,Perhaps add key before set !
(gdb) p rc
$2 = MEMCACHED_NOTSTORED
但是能够set进去:
42 rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
(gdb) n
43 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_SUCCESS
EOF
对add后的键对应的值,再用set方法是可以设置的,如下:
string key = "key2";
string value = "jackxiang";
rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
后再修改这个值:
value = "xiangdong";
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
用gdb的断点跟踪一下并用telnet在设置后查看,如下:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key2
END
get key2
VALUE key2 0 9
jackxiang
END
get key2
VALUE key2 0 9
xiangdong
END
听说,在下载客户端libmemcached-1.0.18/tests 下有测试列子,也可参考。比如cpp_example.cc
ls ~+/cpp_example.cc
/tmp/testmemcachedcpp/libmemcached-1.0.18/tests/cpp_example.cc
摘自:http://www.cppblog.com/kefeng/archive/2010/10/11/129422.html
http://blog.chinaunix.net/uid-52437-id-2108905.html
后发现这个哥们写的文章很详细,http://blog.chinaunix.net/uid-20548989-id-1667248.html
加入add后,rc=MEMCACHED_NOTSTORED情况,代码贴下面:
libmemcached是C客户端到memcached服 务器的接口库。具有低内存占用率、线程安全、并提供对memcached功能的全面支持。它还采用多种命令行工具,包括: memcat、memflush、memrm、memstat、memslap。
在Ubuntu上安装memcached和libmemcached http://www.linuxidc.com/Linux/2010-04/25543.htm
libmemcached C/C++ API使用实例 http://www.linuxidc.com/Linux/2012-01/52516.htm
memcached简单的使用教程(转载): http://blog.csdn.net/huangqiwa/article/details/21174425
使用连接池访问memcached(libmemcached)的完整例子:http://blog.csdn.net/hzhxxx/article/details/41961355
(1)封装 libmemcached 构建 memcached 客户端:http://blog.csdn.net/yanghw0510/article/details/7292236
(2)libmemcached使用(c 客户端连接 memcached) :
(3)libmemcached 下载地址。https://launchpad.net/libmemcached/
1、下载安装libmemcached
$ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz
$ tar xvzf libmemcached-0.44tar.gz
$ cd libmemcached-0.44
$ ./configure
$ make
$ sudo make install
libmemcached 默认安装在/usr/local/,头文件安装在/usr/local/include/libmemcachde/,动态库默认安装在/usr/local/lib/下。
我在这儿下的:https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz
注:
如果报”./libmemcached-1.0/memcached.h:46:27: error: tr1/cinttypes: No such file or directory”错误,则需要升级gcc版本.
处理如下:
yum install gcc44 gcc44-c++ libstdc++44-devel
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
重新编译安装libmemcached-1.0.9
关键信息:error: tr1/cinttypes: No such file or directory
报错原因:libmemcached需要 gcc 4.2 以上版本才可编译,而centos 5.4 的gcc版本只有4.1 ,详见:https://bugs.launchpad.net/libmemcached/+bug/1076181
解决方法:安装gcc44的扩展包,详见:http://gearman.info/build/centos5-8.html
export就是在于此,把这个gcc和g++的版本号给提上去,以方便这个memcached的编译:
/usr/bin/gcc44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
gcc -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
/usr/bin/g++44 -v
gcc version 4.4.7 20120313 (Red Hat 4.4.7-1) (GCC)
g++ -v
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
——————————————————————————————————————————————————————————
这个问题在安gearman时也遇到过,升级gcc,参考连接: http://jackxiang.com/post/7693/ ,软链接如下所示:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc
export CXX=/usr/bin/g++44
./configure && make && make install
./configure && make && make install
/usr/bin/install -c -m 644 support/libmemcached.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
make[1]: Leaving directory `/tmp/testmemcachedcpp/libmemcached-1.0.18'
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
明天再整下,估计是so没有给ldd进来...
2、libmemcached简单测试使用
编译:g++ -o testmemcached testmemcached.cpp -lmemcached
运行:./testmemcached
结果:Save data:value sucessful!
Get value:value sucessful!
Delete key:key sucessful!
实践编译一下:
g++ -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/local/include/libmemcached-1.0/memcached.h:46:23: error: cinttypes: No such file or directory
看来还得重新export一次新的编译器,因为昨天的关了终端,今天的又没了:
export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc //这行有问题~
export CXX=/usr/bin/g++44
g++ -o testmemcached testmemcached.cpp -lmemcached
为何还是不行?
echo $CC
/usr/bin/gcc //没变,这儿有问题,再重新设置一次,查到上面这个or有问题:export CC=/usr/bin/gcc44。
# echo $CXX
/usr/bin/g++44 //变了
重新设置,好了:
export CC=/usr/bin/gcc44
/usr/bin/gcc44
继续折腾,/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached
In file included from /usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/cinttypes:35,
from /usr/local/include/libmemcached-1.0/memcached.h:46,
from /usr/local/include/libmemcached/memcached.h:39,
from testmemcached.cpp:6:
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.7/../../../../include/c++/4.4.7/c++0x_warning.h:31:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x.
加上:-lpthread -std=c++0x ,解决如下:
g++ -o testmemcached testmemcached.cpp -lmemcached -lpthread -std=c++0x
/usr/bin/ld: cannot find -lmemcached
collect2: ld returned 1 exit status
也就是说编译器并不能从ldconfig 里得知,其lib在哪儿(及时把Lib路径加入到/etc/ld.so.conf.d/libmemcache.conf),得指定:
在网上找了一下,发现是这样的:http://blog.163.com/guixl_001/blog/static/4176410420121021111117987/ 里说得加一个新的参数,是和宏相关,那就加了,
指定一个新的参数:-std=c++0x :
/usr/bin/gcc44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
collect2: ld returned 1 exit status
/usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -std=c++0x
/usr/local/lib/libmemcached.so: undefined reference to `pthread_once'
怎样彻底解决"undefined reference to `pthread_create'"问题 ,说是加个: -lrt ,这一看就是那个memcached的库包含了这个文件:#include<pthread.h>
来源参考:
http://bbs.chinaunix.net/thread-1586752-1-1.html
于是Ok啦,最终O了,如下:
[root@test testmemcachedcpp]# /usr/bin/g++44 -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
[root@test testmemcachedcpp]#
运行一下试试:
[root@test testmemcachedcpp]# ./testmemcached
./testmemcached: error while loading shared libraries: libmemcached.so.11: cannot open shared object file: No such file or directory
[root@test /]# find . -name "libmemcached.so.11"
./usr/local/lib/libmemcached.so.11
打开配置文件 vi /etc/ld.so.conf
加上一行:/usr/local/lib
执行/sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# /sbin/ldconfig /etc/ld.so.conf
[root@test testmemcachedcpp]# ./testmemcached
[root@test testmemcachedcpp]#
没报错了~,用gdb看一下 加个-g参数:
/usr/bin/g++44 -g -o testmemcached testmemcached.cpp -lmemcached -lrt -std=c++0x
发现localhost没有开11211,于是找了一台机器把ip和端口写上,重新编译一次后运行Ok,如下:
[root@test testmemcachedcpp]# ./testmemcached
Save data:value sucessful!
Get value:value sucessful!
少了一个删除成功的,简单调试一下:
(gdb) n
Get value:value sucessful!
50 rc=memcached_delete(memc,key.c_str(),key_length,expiration);
(gdb) p key.c_str()
$5 = 0x184372e8 "key"
(gdb) p key_length
$6 = 3
(gdb) n
51 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_INVALID_ARGUMENTS
也就是调这个函数的参数不对,返回不是MEMCACHED_SUCCESS,所以没有打印出:cout<<"Delete key:"<<key<<" sucessful!"<<endl;
####################新的代码里grep了一下该方法###########################
./tests/mem_udp.cc: memcached_delete(memc, test_literal_param("foo"), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_, key.c_str(), key.length(), 0));
./libmemcached-1.0/memcached.hpp: return memcached_success(memcached_delete(memc_,
./tests/libmemcached-1.0/replication.cc: memcached_return_t del_rc= memcached_delete(memc_replicated,
./tests/libmemcached-1.0/mem_functions.cc: rc= memcached_delete(memc, "foo", 3, 1);
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_BUFFERED, (rc= memcached_delete(memc, "foo", 3, 0)));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_SUCCESS, memcached_delete(memc, "foo", 3, 0));
./tests/libmemcached-1.0/mem_functions.cc: test_compare(MEMCACHED_NOTFOUND, memcached_delete(memc, "foo", 3, 0));
####################################################################
于是修改为下面这样:
//rc=memcached_delete(memc,key.c_str(),key_length,expiration);
rc=memcached_delete(memc,key.c_str(),key_length,0);
./testmemcached
Save data:value2 sucessful!
Get value:value2 sucessful!
Delete key:key sucessful!
刚才失败时有值,现在运行后没值了,给成功删除了:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key
VALUE key 0 5
value
END
get key
END
后面怎么结合c的socket 及epoll进行进程/线程调试就不再细说了,我也在摸索中,应该也有相关的调试办法,但这儿说明这个memcached搞个新的gcc版本库才能编译确实带了相当多编译及配置上的的麻烦~
最后,用C函数里的add函数实现类php的memcache的扩展的原子操作函数,如下:
原子操作方法,假如有add后就不能再add,必须删除后才能add,这个可以用作锁:
./libmemcached-1.0.18/libmemcached-1.0/memcached.hpp:
和php的add函数一样第一次运行时没有问题此时值设置成功,再运行add时一次就add不进去,add设置进去后,用set是能重新设置进去的,只是用add原子操作是不行的,用它来做锁很好使:
1)代码片段:
2)运行情况:
[root@test testmemcachedcpp]# gdb testmemcached
b 41
r
Add data:value unsucessful,Perhaps add key before set !
(gdb) p rc
$2 = MEMCACHED_NOTSTORED
但是能够set进去:
42 rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
(gdb) n
43 if(rc==MEMCACHED_SUCCESS)
(gdb) p rc
$3 = MEMCACHED_SUCCESS
EOF
对add后的键对应的值,再用set方法是可以设置的,如下:
string key = "key2";
string value = "jackxiang";
rc=memcached_add(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
后再修改这个值:
value = "xiangdong";
rc=memcached_set(memc,key.c_str(),key.length(),value.c_str(),value.length(),expiration,flags);
用gdb的断点跟踪一下并用telnet在设置后查看,如下:
[root@localhost ~]# telnet 192.168.108.7 11211
Escape character is '^]'.
get key2
END
get key2
VALUE key2 0 9
jackxiang
END
get key2
VALUE key2 0 9
xiangdong
END
听说,在下载客户端libmemcached-1.0.18/tests 下有测试列子,也可参考。比如cpp_example.cc
ls ~+/cpp_example.cc
/tmp/testmemcachedcpp/libmemcached-1.0.18/tests/cpp_example.cc
摘自:http://www.cppblog.com/kefeng/archive/2010/10/11/129422.html
http://blog.chinaunix.net/uid-52437-id-2108905.html
后发现这个哥们写的文章很详细,http://blog.chinaunix.net/uid-20548989-id-1667248.html
加入add后,rc=MEMCACHED_NOTSTORED情况,代码贴下面: