http://www.centos.bz/2012/12/openresty-nginx-block-cc-attack-deploy/
Linux系统防CC攻击自动拉黑IP增强版Shell脚本:http://zhangge.net/4649.html
阅读全文
Linux系统防CC攻击自动拉黑IP增强版Shell脚本:http://zhangge.net/4649.html
阅读全文
[tab设置]更改Zend Studio/Eclipse的制表Tab缩进为4个空格缩进,荐用空格取代tab,一般取4个空格,这样代码就美观多了。
Php/Js/Shell/Go jackxiang 2013-5-28 10:29
背景:缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
今天重装了一下Zend Studio,在编码时发现回车缩进是tab制表符,颇为不爽,记得很久很久以前哥写代码是不缩进的,后来经老师提醒,改用tab缩进,一直这样编码了很长时间。后来看到一篇介绍代码格式的文章才知道各类文本编辑器对于tab制表符的长度规定不一样,这就导致同样缩进的代码在不同系统或者编辑器上缩进长短不一,影响代码风格的一致性。所以推荐用空格取代tab,一般取4个空格,这样代码就美观多了。
实践Ok如下:
在编辑器里,窗口->首选项->PHP->code style->formatter->Edit->Indentation->General settings Tab size: 4.
参考来自:http://wangye.org/blog/archives/541/
==========================================================================================
editplus中tab转换为空格:
缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
之所以这样,是因为tab在不同的编辑器代表的空格是不一样的,为了排版不出现混乱,规范中建议直接使用空格。
但是直接用空格的话,我们在写代码的时候经常会需要缩进,不用TAB的话工作量是巨大的。
其实,我们完全可以用EditPlus解决这个问题。
写代码的时候放心去用TAB,写完代码后,用鼠标选择全部代码,右击->format(格式)->tabs to spaces(制表符转为空格),这样就可以把所有的tab改为spaces了。
实践Ok如下:
右键,格式,制表符转为空格。
来自:http://hi.baidu.com/amenmen/item/e7c9588eca8f48d65f0ec120
=========================================================================================
Notepad++
设置->首选项->语言->右下角,以空格取代打勾。
来自:http://bbs.phpchina.com/thread-220762-1-1.html
=========================================================================================
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab
对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!
加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。
在.vimrc文件中输入如下文本:
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set nu
set autoindent
set cindent
其中:Tabstop:表示一个 tab 显示出来是多少个空格的长度,默认 8。
Softtabstop:表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
Shiftwidth:表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 当设置成 expandtab 时,缩进用空格来表示noexpandtab 则是用制表符表示一个缩进。
Nu:表示显示行号。
Autoindent:表示自动缩进。
Cindent:是特别针对C语言自动缩进。
来自:http://blog.163.com/panda_sha/blog/static/478281962011616124316/
==========================================================================================
在eclipse中设置tab的长度:
在eclipse中设置tab size的地方有多个
1:window——preference——General——Editor——Text Editor设置页面:Display Tab Width
2:window——preference——Java——Code Style——Formatter设置页面,Edit,在弹出的Editor profile窗口中,Indentation卡片,设置Indentation Size和Tab Size。
3:如果安装了Myeclipse,那么在window——preference——Myeclipse——Editor——Common Editor Preference中Apperance卡片,设置Tab Size。
来自:http://taoistwar.iteye.com/blog/369956
今天重装了一下Zend Studio,在编码时发现回车缩进是tab制表符,颇为不爽,记得很久很久以前哥写代码是不缩进的,后来经老师提醒,改用tab缩进,一直这样编码了很长时间。后来看到一篇介绍代码格式的文章才知道各类文本编辑器对于tab制表符的长度规定不一样,这就导致同样缩进的代码在不同系统或者编辑器上缩进长短不一,影响代码风格的一致性。所以推荐用空格取代tab,一般取4个空格,这样代码就美观多了。
实践Ok如下:
在编辑器里,窗口->首选项->PHP->code style->formatter->Edit->Indentation->General settings Tab size: 4.
参考来自:http://wangye.org/blog/archives/541/
==========================================================================================
editplus中tab转换为空格:
缩进使用4个空格,而不是 tab。这是PHP编程规范手册中的一句话。
之所以这样,是因为tab在不同的编辑器代表的空格是不一样的,为了排版不出现混乱,规范中建议直接使用空格。
但是直接用空格的话,我们在写代码的时候经常会需要缩进,不用TAB的话工作量是巨大的。
其实,我们完全可以用EditPlus解决这个问题。
写代码的时候放心去用TAB,写完代码后,用鼠标选择全部代码,右击->format(格式)->tabs to spaces(制表符转为空格),这样就可以把所有的tab改为spaces了。
实践Ok如下:
右键,格式,制表符转为空格。
来自:http://hi.baidu.com/amenmen/item/e7c9588eca8f48d65f0ec120
=========================================================================================
Notepad++
设置->首选项->语言->右下角,以空格取代打勾。
来自:http://bbs.phpchina.com/thread-220762-1-1.html
=========================================================================================
在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:
set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)
set expandtab
对于已保存的文件,可以使用下面的方法进行空格和TAB的替换:
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!
加!是用于处理非空白字符之后的TAB,即所有的TAB,若不加!,则只处理行首的TAB。
在.vimrc文件中输入如下文本:
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab
set nu
set autoindent
set cindent
其中:Tabstop:表示一个 tab 显示出来是多少个空格的长度,默认 8。
Softtabstop:表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
Shiftwidth:表示每一级缩进的长度,一般设置成跟 softtabstop 一样。 当设置成 expandtab 时,缩进用空格来表示noexpandtab 则是用制表符表示一个缩进。
Nu:表示显示行号。
Autoindent:表示自动缩进。
Cindent:是特别针对C语言自动缩进。
来自:http://blog.163.com/panda_sha/blog/static/478281962011616124316/
==========================================================================================
在eclipse中设置tab的长度:
在eclipse中设置tab size的地方有多个
1:window——preference——General——Editor——Text Editor设置页面:Display Tab Width
2:window——preference——Java——Code Style——Formatter设置页面,Edit,在弹出的Editor profile窗口中,Indentation卡片,设置Indentation Size和Tab Size。
3:如果安装了Myeclipse,那么在window——preference——Myeclipse——Editor——Common Editor Preference中Apperance卡片,设置Tab Size。
来自:http://taoistwar.iteye.com/blog/369956
http://www.csdn.net/article/2013-05-22/2815382-The-One-Person-Product
PHP的pthreads扩展:真正的PHP多线程(绝非fork或者用http再开进程)。
Php/Js/Shell/Go jackxiang 2013-5-23 09:50
背景:很多PHPer想PHP也像Java / c++ 一样能支持多线程,于是就有了,在新的版本里加了这样一个扩展,之所以它能行,因为Linux本身就支持,用C扩展一下就可以了,这样用到底成熟不,还是值得时间和对这种应用的需求程度进行检验。
扩展地址:
http://pecl.php.net/package/pthreads
阅读全文
扩展地址:
http://pecl.php.net/package/pthreads
阅读全文
当别人绞尽脑汁避开点名的时候,你在努力的听讲。当别人想法设法作弊的时候,你在努力地复习。当别人走后门找工作的时候,你在努力的投简历。当别人挖空心思赚外快的时候,你在努力的争业绩。最终,他们会变成虚伪的有钱人。而你,将会成为一个正直勤劳的穷光蛋。
C 语言内存错误检测工具 memwatch
Unix/LinuxC技术 jackxiang 2013-5-22 14:51
MEMWATCH 由 Johan Lindh 编写,是一个开放源代码 C 语言内存错误检测工具。只要在代码中添加一个头文件并在 gcc 语句中定义了 MEMWATCH 之后,您就可以跟踪程序中的内存泄漏和错误了。MEMWATCH 支持 ANSI C,它提供结果日志记录,能检测双重释放(double-free)、错误释放(erroneous free)、没有释放的内存(unfreed memory)、溢出和下溢等等。
使用方法:http://hi.baidu.com/nullzone/item/ff7e60fdeae5c0cc521c262d
更多实践:http://hi.baidu.com/gz_gzhao/item/017262f23a5c7008c7dc4563
像Node这样的脚本型也有内存的泄漏问题:
http://www.oschina.net/translate/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season
使用方法:http://hi.baidu.com/nullzone/item/ff7e60fdeae5c0cc521c262d
更多实践:http://hi.baidu.com/gz_gzhao/item/017262f23a5c7008c7dc4563
像Node这样的脚本型也有内存的泄漏问题:
http://www.oschina.net/translate/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season
利用PHP操作Linux消息队列完成进程间通信这qnum最大长度修改。
Php/Js/Shell/Go jackxiang 2013-5-22 10:37
膘叔(19129***) 上午 09:51:54
求科谱:msg_stat_queue中,那个qnum最大只有40,也就是我同时只能最大处理40个队列,能不能再大一点?
维尼熊(380139***) 上午 09:53:19
可以
膘叔(19129***) 上午 09:53:37
怎么调整?
维尼熊(380139***) 上午 09:53:52
/proc/sys/fs/mqueue/msg_max
[root@test ~]# cat /proc/sys/fs/mqueue/msg_max
10
阅读全文
求科谱:msg_stat_queue中,那个qnum最大只有40,也就是我同时只能最大处理40个队列,能不能再大一点?
维尼熊(380139***) 上午 09:53:19
可以
膘叔(19129***) 上午 09:53:37
怎么调整?
维尼熊(380139***) 上午 09:53:52
/proc/sys/fs/mqueue/msg_max
[root@test ~]# cat /proc/sys/fs/mqueue/msg_max
10
阅读全文
本田2.0L发动机+双电机混动系统(本田雅阁混动版)
一台真正的高效非插电混合动力车型要有高燃效的引擎、至少两台非同位电机、高效的传动系统以及先进的能量管理逻辑。当然丰田的混合动力系统完全满足这些条件,不过这次获得沃德十佳发动机并不是丰田,而是在燃油经济性和动力性能之间取得了完美平衡的动力系统——来自本田的i-MMD混合动力系统。
本田混动系统
电动机最大输出功率 135kW
电动位于车尾的智能动力单元由1.3kWh的锂电池、电池ECU、100V/1500W电源变频器、DC-DC转换器构成。而本田通过优化电池模块也实现了小型轻量化的设计。而独特的双电机偶合设计,搭配上大公里的电动机以及百公里超低的油耗使本田这套i-MMD混合动力系统成为此次评选中唯一一款非插电混合动力系统。
本田自然不用多说了,“技术宅”出身的它经常做出一些“不鸣则已,一鸣惊人”的经典技术设计,而这次搭载于雅阁混动上的i-MMD系统已经得到了世界范围内许多专业媒体的盛誉。机最大输出扭矩 315Nm
电池组容量 1.3kWh
发动机最大功率 107kW/6200rpm
发动机最大扭矩 175Nm/4000rpm
本田i-MMD的全名为SPORT HYBRID intelligent Multi-Mode Drive,是双电机混合动力系统,跟大家熟悉的丰田混合动力系统一样,车尾放电池,发动机和PCU则放在发动机舱内。不过i-MMD却拥有两个电机,一个负责发电,而另一个则负责驱动车轮。在电机驱动模式下,由蓄电池给形式马达提供电力,从而驱动车轮,此时发动机并不工作;而在混合驱动模式下,发动力驱动发电马达,发出电力供行驶用马达驱动车轮,此时发动机和电动机同时工作;而在发动机驱动模式下,发动机会直接通过离合器驱动车轮,此时仅有发动机工作。
雅阁hybrid搭载了本田2.0L地球梦阿特金森循环自然进气发动机,最大功率105kW,最大扭矩为165Nm。虽然参数不大,不过发动机主要用于给发电用马达充电,而行驶用的交流同步电机可爆发出最大124kW的功率以及最大307Nm的扭矩。
2013年的中国汽车工业,在家用轿车上全面溃败,低端车QQ和F0的辉煌不在,被赛欧、瑞纳压制。中级车干不过福克斯,中高级车前20名看不到国产车的影子,销量后10名全部是国产车位于车尾的智能动力单元由1.3kWh的锂电池、电池ECU、100V/1500W电源变频器、DC-DC转换器构成。而本田通过优化电池模块也实现了小型轻量化的设计。而独特的双电机偶合设计,搭配上大公里的电动机以及百公里超低的油耗使本田这套i-MMD混合动力系统成为此次评选中唯一一款非插电混合动力系统。
本田自然不用多说了,“技术宅”出身的它经常做出一些“不鸣则已,一鸣惊人”的经典技术设计,而这次搭载于雅阁混动上的i-MMD系统已经得到了世界范围内许多专业媒体的盛誉。。
高级车?不好意思,没有国产车的销量数据。为什么,电脑、手机,做了20年,就能屌丝逆袭,汽车就不行呢?
最近学车,对车了解了一下,其中2013年的中国汽车工业,在家用轿车上全面溃败,低端车QQ和F0的辉煌不在,被赛欧、瑞纳压制。中级车干不过福克斯,中高级车前20名看不到国产车的影子,销量后10名全部是国产车。高级车?不好意思,没有国产车的销量数据。为什么,电脑、手机,做了20年,就能屌丝逆袭,汽车就不行呢?我觉得还没有像手要中的MTK,电脑中的Intel/windows,最后的手机标准化,同质化,专业化由谁来做呢?呵呵
阅读全文
一台真正的高效非插电混合动力车型要有高燃效的引擎、至少两台非同位电机、高效的传动系统以及先进的能量管理逻辑。当然丰田的混合动力系统完全满足这些条件,不过这次获得沃德十佳发动机并不是丰田,而是在燃油经济性和动力性能之间取得了完美平衡的动力系统——来自本田的i-MMD混合动力系统。
本田混动系统
电动机最大输出功率 135kW
电动位于车尾的智能动力单元由1.3kWh的锂电池、电池ECU、100V/1500W电源变频器、DC-DC转换器构成。而本田通过优化电池模块也实现了小型轻量化的设计。而独特的双电机偶合设计,搭配上大公里的电动机以及百公里超低的油耗使本田这套i-MMD混合动力系统成为此次评选中唯一一款非插电混合动力系统。
本田自然不用多说了,“技术宅”出身的它经常做出一些“不鸣则已,一鸣惊人”的经典技术设计,而这次搭载于雅阁混动上的i-MMD系统已经得到了世界范围内许多专业媒体的盛誉。机最大输出扭矩 315Nm
电池组容量 1.3kWh
发动机最大功率 107kW/6200rpm
发动机最大扭矩 175Nm/4000rpm
本田i-MMD的全名为SPORT HYBRID intelligent Multi-Mode Drive,是双电机混合动力系统,跟大家熟悉的丰田混合动力系统一样,车尾放电池,发动机和PCU则放在发动机舱内。不过i-MMD却拥有两个电机,一个负责发电,而另一个则负责驱动车轮。在电机驱动模式下,由蓄电池给形式马达提供电力,从而驱动车轮,此时发动机并不工作;而在混合驱动模式下,发动力驱动发电马达,发出电力供行驶用马达驱动车轮,此时发动机和电动机同时工作;而在发动机驱动模式下,发动机会直接通过离合器驱动车轮,此时仅有发动机工作。
雅阁hybrid搭载了本田2.0L地球梦阿特金森循环自然进气发动机,最大功率105kW,最大扭矩为165Nm。虽然参数不大,不过发动机主要用于给发电用马达充电,而行驶用的交流同步电机可爆发出最大124kW的功率以及最大307Nm的扭矩。
2013年的中国汽车工业,在家用轿车上全面溃败,低端车QQ和F0的辉煌不在,被赛欧、瑞纳压制。中级车干不过福克斯,中高级车前20名看不到国产车的影子,销量后10名全部是国产车位于车尾的智能动力单元由1.3kWh的锂电池、电池ECU、100V/1500W电源变频器、DC-DC转换器构成。而本田通过优化电池模块也实现了小型轻量化的设计。而独特的双电机偶合设计,搭配上大公里的电动机以及百公里超低的油耗使本田这套i-MMD混合动力系统成为此次评选中唯一一款非插电混合动力系统。
本田自然不用多说了,“技术宅”出身的它经常做出一些“不鸣则已,一鸣惊人”的经典技术设计,而这次搭载于雅阁混动上的i-MMD系统已经得到了世界范围内许多专业媒体的盛誉。。
高级车?不好意思,没有国产车的销量数据。为什么,电脑、手机,做了20年,就能屌丝逆袭,汽车就不行呢?
最近学车,对车了解了一下,其中2013年的中国汽车工业,在家用轿车上全面溃败,低端车QQ和F0的辉煌不在,被赛欧、瑞纳压制。中级车干不过福克斯,中高级车前20名看不到国产车的影子,销量后10名全部是国产车。高级车?不好意思,没有国产车的销量数据。为什么,电脑、手机,做了20年,就能屌丝逆袭,汽车就不行呢?我觉得还没有像手要中的MTK,电脑中的Intel/windows,最后的手机标准化,同质化,专业化由谁来做呢?呵呵
阅读全文
像点对点专线的视频服务器没有端口?就是192.168.1.1 和192.168.1.2通讯这种传视频和音频的设备用一根网线直接连起来。
用的什么协议传输视频这块儿是电信找人代工的硬件设备,音频视频传输都有哪些协议?
实时的多数是 rtmp,点对点的局域网 把端口都开放就是了。
TCP&&UDP:1935。
Real Time Messaging Protocol(实时消息传送协议协议)概述 实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。它有三种变种: 1)工作在TCP之上的明文协议,使用端口1935; 2)RTMPT封装在HTTP请求之中,可穿越防火墙; 3)RTMPS类似RTMPT,但使用的是HTTPS连接; 介绍: RTMP协议是被Flash用于对象,视频,音频的传输.该协议建立在TCP协议或者轮询HTTP协议之上. RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据. 一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.
RTMP通讯协议及端口范围
TCP、UDP端口:1935
1.哪些软件可支持下载基于rtmp协议的在线视频呢?
2.顺便问一下,rtmp与http两种协议到底有何不同?
1.唯影视频下载器支持下载使用HTTP、RTMP、RTMPT、RTMPTE等协议的在线视频。
硕鼠最新内测版已经可以支持rtmp协议了,不过首先开放的rtmp解析的站点就cntv和搜狐两家。
还有一个CCTV/CNTV视频下载器(xmlbar),它支持下载CNTV网站中采用rtmp协议以流媒体方式播放的视频。
而比较流行的维棠、迅雷则都不支持rtmp协议。
2.关于rtmp :
这里所说的 rtmp 全称是 real time messaging protocol(实时消息传送协议)。
两种协议HTTP和RTMP,有点点不同:
用HTTP方式:先通过IIS 将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是播放服务器的视频。因此在本地缓存里可以找到这个FLV。其优点就是服务器下载完这个FLV,服务器就没有消耗了,节省服务器消耗。其缺点就是FLV会缓存在客户端,对FLV的保密性不好。
用RTMP方式:通过NetConnection连接到FMS/Red5服务器,并实时播放服务器的FLV文件,这种方式可以任意选择视频播放点(SEEK()),并不象HTTP方式需要缓存完整个FLV文件到本地才可以任意选择播放点,其优点就是在本地缓存里是找不到这个FLV文件的。其优点就是FLV不会缓存在客户端,FLV的保密性好,其缺点就是消耗服务器资源,连接始终是实时的。
一句话,HTTP方式是本地播放,RTMP方式是服务器实时播放,因需而定。
Flash RTMP流媒体协议:http://www.cnblogs.com/yjmyzz/archive/2010/03/16/1687192.html
Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。
具体使用RTMP的AS代码大概如下:
var videoInstance:Video = your_video_instance;
var nc:NetConnection = new NetConnection();
var connected:Boolean = nc.connect("rtmp://localhost/myapp");
var ns:NetStream = new NetStream(nc);
videoInstance.attachVideo(ns);
ns.play("flvName");
......
RTMP协议详解:http://hi.baidu.com/yore2003/item/a5a198e6029673d3eb34c928
用的什么协议传输视频这块儿是电信找人代工的硬件设备,音频视频传输都有哪些协议?
实时的多数是 rtmp,点对点的局域网 把端口都开放就是了。
TCP&&UDP:1935。
Real Time Messaging Protocol(实时消息传送协议协议)概述 实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。它有三种变种: 1)工作在TCP之上的明文协议,使用端口1935; 2)RTMPT封装在HTTP请求之中,可穿越防火墙; 3)RTMPS类似RTMPT,但使用的是HTTPS连接; 介绍: RTMP协议是被Flash用于对象,视频,音频的传输.该协议建立在TCP协议或者轮询HTTP协议之上. RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据. 一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.
RTMP通讯协议及端口范围
TCP、UDP端口:1935
1.哪些软件可支持下载基于rtmp协议的在线视频呢?
2.顺便问一下,rtmp与http两种协议到底有何不同?
1.唯影视频下载器支持下载使用HTTP、RTMP、RTMPT、RTMPTE等协议的在线视频。
硕鼠最新内测版已经可以支持rtmp协议了,不过首先开放的rtmp解析的站点就cntv和搜狐两家。
还有一个CCTV/CNTV视频下载器(xmlbar),它支持下载CNTV网站中采用rtmp协议以流媒体方式播放的视频。
而比较流行的维棠、迅雷则都不支持rtmp协议。
2.关于rtmp :
这里所说的 rtmp 全称是 real time messaging protocol(实时消息传送协议)。
两种协议HTTP和RTMP,有点点不同:
用HTTP方式:先通过IIS 将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是播放服务器的视频。因此在本地缓存里可以找到这个FLV。其优点就是服务器下载完这个FLV,服务器就没有消耗了,节省服务器消耗。其缺点就是FLV会缓存在客户端,对FLV的保密性不好。
用RTMP方式:通过NetConnection连接到FMS/Red5服务器,并实时播放服务器的FLV文件,这种方式可以任意选择视频播放点(SEEK()),并不象HTTP方式需要缓存完整个FLV文件到本地才可以任意选择播放点,其优点就是在本地缓存里是找不到这个FLV文件的。其优点就是FLV不会缓存在客户端,FLV的保密性好,其缺点就是消耗服务器资源,连接始终是实时的。
一句话,HTTP方式是本地播放,RTMP方式是服务器实时播放,因需而定。
Flash RTMP流媒体协议:http://www.cnblogs.com/yjmyzz/archive/2010/03/16/1687192.html
Real Time Messaging Protocol(实时消息传送协议协议)是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。
具体使用RTMP的AS代码大概如下:
var videoInstance:Video = your_video_instance;
var nc:NetConnection = new NetConnection();
var connected:Boolean = nc.connect("rtmp://localhost/myapp");
var ns:NetStream = new NetStream(nc);
videoInstance.attachVideo(ns);
ns.play("flvName");
......
RTMP协议详解:http://hi.baidu.com/yore2003/item/a5a198e6029673d3eb34c928
怎么用BIOS查看CPU温度
Unix/LinuxC技术 jackxiang 2013-5-21 13:33
进入BIOS设置页面之后,可以找到一个叫“Hardware Monitor”或“PC Health”的选项(如笔者的机器是“Power > Hardware Monitor”。
在BIOS看CPU温度、转速和电压
点PC Health Status
CPU Temperature是CPU的温度
CPU Fan是CPU风扇转速
System Fan是机箱风扇转速
1、开机时按DEL进入BIOS设置(显示器上有提示进入办法,但多数是按DEL);
2、选择CPU或硬件信息栏(不同型号BIOS显示的不一样,可以一个个都选一遍)。
3、当能看到“CPU temprature”即为CPU当然温度,有些还能看到CPU风扇、系统风扇等的转速。
在BIOS看CPU温度、转速和电压
点PC Health Status
CPU Temperature是CPU的温度
CPU Fan是CPU风扇转速
System Fan是机箱风扇转速
1、开机时按DEL进入BIOS设置(显示器上有提示进入办法,但多数是按DEL);
2、选择CPU或硬件信息栏(不同型号BIOS显示的不一样,可以一个个都选一遍)。
3、当能看到“CPU temprature”即为CPU当然温度,有些还能看到CPU风扇、系统风扇等的转速。
经常在运行php程序的时候,想知道某个程序到底运行了多久。这样可以查找一些程序运行的效率问题。
一)最近写了一个程序运行的时间计算类,供大家参考:
调用:
二)不用配置Host得到该测试机的访问速度:
如:我想测试一下那个Host为:C:\Windows\System32\drivers\etc\hosts
72.46.130.186 jackxiang.com 的访问速度,用PHP可以用如下代码:
参考来自:http://luzhongxi.blog.163.com/blog/static/200944287201210268201082/
一)最近写了一个程序运行的时间计算类,供大家参考:
调用:
二)不用配置Host得到该测试机的访问速度:
如:我想测试一下那个Host为:C:\Windows\System32\drivers\etc\hosts
72.46.130.186 jackxiang.com 的访问速度,用PHP可以用如下代码:
参考来自:http://luzhongxi.blog.163.com/blog/static/200944287201210268201082/
[显示细节]改变linux终端目录的显示颜色
Unix/LinuxC技术 jackxiang 2013-5-17 16:32
背景:
如何更改linux终端显示颜色?深蓝色的目录背景是黑色,很不爽。
有兄弟有现成的调色请稍给兄弟,如:
PS1='[\[\e[32;40m\]\u@\h \w \t]$ '
类似的,目录Ok的,有现成的兄弟,给个出来。
我在群里问很多朋友,都说我这个目录的颜色有点奇怪,他们的蓝色在黑色下面能看得很清楚,也有兄弟建议说修改SecureCRT里的会话选项-外观-窗口和文本外观-当前颜色方案-选:traditional 点编辑:属性,前景/背景对背景颜色作调整。(但我还是喜欢黑色:超级黑,高级黑无限黑,终极黑,极品黑,宇宙黑),【后来我发现有可能是全局选项,本文后面有这个设置,我设置了下感觉不是很符合要求,目录不知道怎么设置,建议以实践为准。】,找了篇文章,感觉和我的想法差不多,先转了再说,试试还成功了。
我的实践成功步骤如下:
1)vi /etc/DIR_COLORS
DIR 01;34 # directory
定位位置:
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link
FIFO 40;33 # pipe
修改为:
DIR 01;36 # directory
2)使改动生效方法:
eval `dircolors /etc/DIR_COLORS` //命令中的`符号为键盘~符号下面的那个
3)登录生效:如果再登录一次,发现它还是蓝色,不是浅蓝,于是得在登录时实现自动运行,如下。
vi ~/.bashrc
立即生效:source ~/.bashrc
附录:
Linux登录终端时显示本机IP地址在前面,一样修改~/.bashrc,在虛尾添加:
linux终端中,目录的显示颜色是蓝色,看起来很是不方便。阅读全文
如何更改linux终端显示颜色?深蓝色的目录背景是黑色,很不爽。
有兄弟有现成的调色请稍给兄弟,如:
PS1='[\[\e[32;40m\]\u@\h \w \t]$ '
类似的,目录Ok的,有现成的兄弟,给个出来。
我在群里问很多朋友,都说我这个目录的颜色有点奇怪,他们的蓝色在黑色下面能看得很清楚,也有兄弟建议说修改SecureCRT里的会话选项-外观-窗口和文本外观-当前颜色方案-选:traditional 点编辑:属性,前景/背景对背景颜色作调整。(但我还是喜欢黑色:超级黑,高级黑无限黑,终极黑,极品黑,宇宙黑),【后来我发现有可能是全局选项,本文后面有这个设置,我设置了下感觉不是很符合要求,目录不知道怎么设置,建议以实践为准。】,找了篇文章,感觉和我的想法差不多,先转了再说,试试还成功了。
我的实践成功步骤如下:
1)vi /etc/DIR_COLORS
DIR 01;34 # directory
定位位置:
FILE 00 # normal file
DIR 01;34 # directory
LINK 01;36 # symbolic link
FIFO 40;33 # pipe
修改为:
DIR 01;36 # directory
2)使改动生效方法:
eval `dircolors /etc/DIR_COLORS` //命令中的`符号为键盘~符号下面的那个
3)登录生效:如果再登录一次,发现它还是蓝色,不是浅蓝,于是得在登录时实现自动运行,如下。
vi ~/.bashrc
立即生效:source ~/.bashrc
附录:
Linux登录终端时显示本机IP地址在前面,一样修改~/.bashrc,在虛尾添加:
linux终端中,目录的显示颜色是蓝色,看起来很是不方便。阅读全文
七夜兄弟的fastcgi blog增强版:
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=200687
了解:
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这个哥们的邮箱:sunjianfei@xiaomi.com
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
————————————————————————————————
找这个哥们他从邮箱里回了一个做好的,我没看明白当时为嘛选这些,问了下七夜:Add Time:2014-08-20
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这玩意都是啥,像1) mysql都能直接直持吧?
像二mysql好像也有插件是吧?
像上传为嘛要用drupal来增强呢?
+————————+
有啥考量没?
七夜
14/8/20 星期三 上午 11:07:01
用nginx的上传就行 //是一个Nginx专用的上传模块,https://jackxiang.com/post/6221/ 有介绍。
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:01
七夜兄弟说的是那个nginx一个上传插件吧?nginx_upload_module
七夜
14/8/20 星期三 上午 11:09:00
恩是的。nginx模块
上午 11:09:23
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:23
我都想用c写一个专门的上传了,啊哈哈。
七夜
14/8/20 星期三 上午 11:09:43
不用。都有现成的
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:10:17
写了一半写不下去了,c功力不够,对那个上传大文件是先放内存还是直接写文件这块涉及到缓存处理上好像有点纠结。
七夜
写磁盘。内存缓存部分
七夜
14/8/20 星期三 上午 11:13:11
写磁盘。内存缓存部分
————————
那是从内存一下写入磁盘,还是要有一个进程来看哪个文件内存放得多就先写呢?
啥也不会
14/8/20 星期三 上午 11:15:07
mmap啊 别的交给系统好了
SQLite的FTS3扩展
FTS3允许用户创建一个全文索引的特殊表,
CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT); /* FTS3 table */
CREATE TABLE enrondata2(content TEXT); /* Ordinary table */
使用FTS3效率特别快
SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux'; /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
http://www.cnblogs.com/abob/archive/2010/12/01/1893425.html
2)使用rmmseg进行中文分词:
C语言开源高性能中文分词组件,C语言mmseg中文分词器 《狮子的魂》:https://code.google.com/p/friso/
3) drupal文件上传:http://blog.sina.com.cn/s/blog_a94fd80d01017tkx.html
FastCGI Blog 2.0版本正在开发中,新的版本,将是代码级别的优化,还有一些功能的增强
1. 使用了内存池,提高申请小内存的效率.一个请求一个内存池.这样杜绝了内存泄漏。
2. 自己编写了hashmap、list等实现,减少对第三方lib的依赖
3. 使用配置文件,修改相关配置更加方便
4. 使用功能更为强大的html编辑器,增加后台文件上传功能
5. 代码高亮显示
6. 文章的全文搜索功能.(有时间的话,实现该功能)
http://bbs.chinaunix.net/thread-1790317-3-1.html
C FastCGI Blog 零痛苦一键安装包
自从上次发布了我用写C写的 FastCGI Blog,很多人都说安装不太方便,所以我做了个一键安装包,大家可以零痛苦体验
解开压缩包,执行
./install.sh "/root/local"
/root/local
是安装目录
Nginx转发 spawn-fcgi看护
欢迎测试,欢迎加入
在
七夜开发
的博客基础上进行升级:
1)升级为g++编译,方便整合c++库
2)升级使用sqlite3的fts3扩展,进行全文检索
3)使用rmmseg进行中文分词
目前正在更新:
1) 整理
代码
结构,提供方便的二次开发接口和说明文档
2)添加
文件
上传,实现drupal文件上传的
用户
体验
3)后台
模板
管理
代码还在完善中,请静侯
————————————————————————————————
所有的软件包下载List:
http://code.google.com/p/php-tokyocabinet/downloads/list
C实现的FastCGI Blog:
http://www.fengblog.org/archives/200/
http://blog.sina.com.cn/s/blog_7041f8eb0100nkxe.html
下载完整版的地址:
http://www.pudn.com/downloads426/sourcecode/windows/network/detail1804143.html
七夜博客系统 FastCGI Blog 2.0,自从C-blog1.0发布以来,很多人给了很中肯的意见。这段有时间了,赶紧的把一些大家都需要的功能给开发出来。现在推出c-blog2.0版本.在这个版本里,还没实现全文搜索.在2.1版里会实现全文搜索功能。
这次升级的功能列表:
1. 引入了 配置文件
2. 增加cookie 解析,和文件上传功能
3. html编辑器,换了 更为强大的KindEditor编辑器
4. 支持代码高亮
5. 使用了内存池.统一分配 统一释放,程序更安全
6. 更清晰的 程序目录分类.
(1) db 为 数据库目录
(2) log 为 日志目录
(3) src 为 c-blog源文件目录
(4) htdocs 为 www访问目录.nginx 指到这个目录就行
7. 使用 configure make make install 方式 安装.更为简单
一直想有个自己的blog,就是犯懒不肯code,最近对自己下了狠劲。利用一两个月业余时间完成了这个blog,我还是很有成就感的。哈哈哈。这个blog程序,这几天刚完成。有bug在所难免,欢迎大家提出来,我会不断的维护的。下面我罗列一下这个blog的功能
这个blog采用html template技术, 模板修改起来就跟php的模板一样简单
后台功能
1. 分类管理、添加、删除、编辑(只支持一级分类)
2. 文章管理、添加、删除、编辑
3. 生成静态首页、清除全部静态页缓存
4. 友情链接管理、添加、删除、编辑
5. 评论列表、删除
6. 简单的用户登录和退出
========================================================================================
这个blog 依赖这些 lib
1. FastCGI http://www.fastcgi.com/dist/
2. tokyocabinet http://fallabs.com/tokyocabinet/
DownLoad:http://fallabs.com/kyotocabinet/pkg/
http://fallabs.com/tokyocabinet/pastpkg/tokyocabinet-1.3.27.tar.gz
3. SQLite3 http://www.sqlite.org/download.html
4. jemalloc http://www.canonware.com/download/jemalloc/
下载上述软件,并编译安装.
blog的编译命令是(相关lib路径,根据自己的改,)
gcc -o blog blog.c util.c tpllib.c rbtree.c assign.c ./module/bl
(gdb) set env module=user
(gdb) run
Starting program: /usr/local/htdocs/cblog
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ff0b70 (LWP 5952)]
Location:/
输出:
./src/blog.c: puts("Location:/\r\n\r\n")
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
http://blogtest.com/article-read-opensource-15-c-fastcgi-blog-2.0.html
这个是用cgi生成的网页么?怎么访问这个cgi啊?
七夜 下午 02:47:19
article-read-opensource-15-c-fastcgi-blog-2.0.html
article 是访问article 模块
read 是访问article 模块 中的函数
opensource 是分类名
15 是 id
后面 的 都是 seo
url seo
回忆未来-向东-Jàck 下午 02:48:19
你这个有没有url的seo,这个得自己编写?
这个url的seo是不是写在nginx里的?当时。
等会
/panel-user-login.html
后台登录链接的Url及帐号名密码如下:
http://blogtest.com/panel-user-login.html
http://blogtest2.com/panel-user-login.html
用户名:七夜
密码:vilinux
tail -f /data1/logs/access.log
tail -f /data1/logs/nginx_error.log
回忆未来-向东-Jàck 下午 03:09:22
192.168.137.1 - - [03/Jul/2013:15:09:11 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
七夜 下午 03:09:40
看看error
errlor.log
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
七夜 下午 03:11:10
chmod 777
没权限
回忆未来-向东-Jàck 下午 03:11:40
chmod -R 777 /tmp/fcgi-blog.sock
是吧?
可以了,修改了下nginx的配置,如下可以,访问,不知密码是多少:
http://blogtest.com/panel-user-login.html
Ok的Nginx配置如下:
说明通过tail看nginx的日志多么重要:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
The page you are looking for is temporarily unavailable.
Please try again later.
查看Nginx错误日志:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
==> /data1/logs/nginx_error.log <==
2013/07/03 18:17:50 [crit] 3728#0: *98 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
==> /data1/logs/access.log <==
192.168.137.1 - - [03/Jul/2013:18:17:50 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
ulimit -c unlimited
./cblog //产生core文件,core.5273
gdb cblog core.5273
----------------------------------
Core was generated by `./cblog'.
Program terminated with signal 11, Segmentation fault.
#0 0x00cab5e7 in tcmapput () from /usr/local/lib/libtokyocabinet.so.7
--------------------------------------------------------------------------------------------------
七夜 下午 05:21:33
不行,你不能这么gdb的
你 log 输出一下
就能知道了
====================================================================================
一)启动fastcgi:
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 2251
chmod -R 777 /tmp/fcgi-blog.sock
二)进去后出现:
./templets/panel/category_update.html Error loading template file!
三)调试方法:
root@192.168.137.128:/usr/local/conf# strace -p 2251
Process 2251 attached - interrupt to quit
accept(0, {sa_family=AF_FILE, NULL}, [2]) = 5
select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999996})
read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4\1\7\0\f\0QUERY_"..., 8192) = 1072
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77a0000
open("./templets/panel/category_insert.html", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xb77a0000, 4096)
=====================================================================================
没法读到模板的问题如下解决办法:
-------------------------------------------------------
七夜兄弟:
open("./templets/blog/article_list.html", O_RDONLY) = -1 ENOENT (No such file or directory)
./module/panel/article.c: if (tpl_load(tpl,"./templets/blog/article_list.html") != TPL_OK)
打开文件编译后,这个模板文件是相对于fastcgi这个程序是从哪儿开始算机的啊?
编译文件打开的模板文件你写的是相对路径,这个相对路径是相对的根目录是?
七夜 上午 11:13:12
/usr/local/htdocs/
你得在这个目录,你试试我的方法.
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 3639
这个sqllite备份怎么备份,
这玩意一个文件容易一出问题,整个文件里数据就挂了吧?
稳定性怎么样、如果真用sqlite的话。有没有办法提高其数据的安全这方面的经验。
七夜 上午 11:27:12
stop fastcgi. after copy sqlite3 db file to other path
安全,已经不在发布目录
所以不用担心会被浏览器下载什么的
七夜 上午 11:29:24
可能会有些小bug。大问题没有。我运行了一年
回忆未来-向东-Jàck 上午 11:30:13
像nginx下的php一样起多个。可以么?
七夜 上午 11:30:23
目前还不可以
回忆未来-向东-Jàck 上午 11:31:07
我看好像有个fastcgi命令可以起一个端口起来,有个参数是多少个进程的啊。
==========================================================
关于多个进程现在只有一个,可以再学习下。
下面关于后台的功能特别是那个缓存:
回忆未来-向东-Jàck 上午 11:32:26
这添加文章太快了,这种快感不错,比我在外面的博客快了进10倍,
这用户体验好啊。
清楚全部缓存
这个是什么意思,缓存在哪儿的?
七夜 上午 11:33:00
我会生成静态页的
列表页 首页 文章页
都会生成的静态页的
回忆未来-向东-Jàck 上午 11:33:20
生成首页
不就是么?
是自动生成的么,其他的静态页面。
首页要自己生成是吧?
七夜 上午 11:33:46
列表页 文章页 是自动生成的
访问生成的
回忆未来-向东-Jàck 上午 11:34:53
哈哈,好的,我有空再看下代码,学习一下,灰常感谢。
回忆未来-向东-Jàck 上午 11:36:34
tokyocabinet jemalloc 用在这儿是干嘛的?
好像是内存分配的是吧?这个jemalloc。它有什么好处?
这个tokyocabinet 是个什么玩意?是缓存吗。
七夜 上午 11:38:43
jemalloc 优化的 内存管理器
tokyocabinet 有现成的 map list封装
回忆未来-向东-Jàck 上午 11:39:30
这样就不容易内存泄漏和数据结构上也带来了处理方便是吧?我也学学。
七夜 上午 11:41:45
不是,jemalloc 主要是代替 libc的malloc 和free
内存泄漏 还是自己去管理
回忆未来-向东-Jàck 上午 11:42:09
仅仅是设想下像这种单个的fastcg进程i能支持并发多少 有没有过测试或估计哩?
七夜 上午 11:42:16
你可以压测一下
问下scottjiang兄弟这块的实践经验:
fastcgi只起一个进程,大概能支持并发多少啊?scottjiang兄弟。
location ~ \.html$ {
root /usr/local/htdocs;
fastcgi_pass unix:/tmp/fcgi-blog.sock;
fastcgi_index cblog;
include fastcgi_params;
}
有没有经验值啊?我想了解下这块。再就是怎么把这一个进程变多个啊。
江庆海 上午 11:50:24
可以在apache中配置最大进程数。根据你的业务请求量,一般配几十吧。
你google一下配置说明,应该有可以启动进程数,每个进程数处理最大并发个数、超时等配置。
nginx 不太熟啊,应该也是有的。
================================================
多个进程的参考方法如下:
1. nginx安装(略过)
2. FastCGI安装
因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有另外一种方法安装nginx-fcgi来让nginx支持cgi,我们这里讲解一种使用spawn-fastcgi的方法。
#include <iostream>
#include <fcgi_stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0){
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译程序:g++ testcgi.c -o lzgFastCGI -lfcgi
测试程序是否能正常运行:./myFastCGI,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/
3. nginx配置、测试
1) 拷贝lzgFastCGI程序到nginx下的cgibin目录(自己可以创建,根据需要更改)
2) 启动spawn-fastcgi管理进程
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
查看一下9002端口是否已成功:netstat -na | grep 9002
3) 更改nginx.conf配置文件
添加配置
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
include fastcgi_params;
}
根据上面的文章进行实践是OK的:
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
实践OK的,Ok步骤如下:
root@192.168.137.128:/usr/local/htdocs# /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
spawn-fcgi: child spawned successfully: PID: 4367
root@192.168.137.128:/usr/local/htdocs# netstat -atlunp|grep 9002
tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 4367/./cblog
Nginx配置:
location ~ \.cgi$ { //这儿略有区别,是html都指向这个cgi了。
适当参考即可,和实际的情况均有出入:http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/
http://www.ha97.com/173.html
使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 7551
ps aux|grep php
apache 7551 16.7 1.6 43396 6016 ? Ssl 15:14 0:01 /usr/local/webserver/php/bin/php-cgi
====================================================================================
Sqlite表查询相关实践:
root@192.168.137.128:/usr/local/db# sqlite3 blog.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1)查看表名
sqlite> .table
article category comment friendlink
2)查表内容:
sqlite> select * from category;
1|php|php|1
2|mysql|mysql|2
3|nosql|nosql|3
4|linux|linux|4
5|javascript|javascript|5
6||life|6
7||opensource|7
8|web2.0|web2.0|8
3)表结构:
sqlite> .schema category
CREATE TABLE [category] (
[sid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[sortname] VARCHAR(30) NOT NULL,
[sortdir] VARCHAR(30) NOT NULL,
[pos] INTEGER DEFAULT '0' NOT NULL
);
CREATE INDEX [IDX_CATEGORY_POS] ON [category](
[pos] ASC
);
4)退出sqliite
sqlite> .exit
————————————————Add:2013-12-10启动了1000个fastcgi进程————————————————
http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
步骤如下:
(1)代码情况:heloFastCGI.c
(2)make情况:makefile.sh
(3)建立目录步骤:step.txt
mkdir -p /usr/local/webserver/nginx/myFastCGI
cp helloFastCGI /usr/local/webserver/nginx/myFastCGI
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f
/usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动:
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f /usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动后:
root@192.168.137.128:/data0/htdocs/myfastcgi# ps aux|grep helloFastCGI |wc
1001 11012 115083
root@192.168.137.128:/data0/htdocs/myfastcgi# netstat -atlunp|grep 9100
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 5524/helloFastCGI
注意这是一行命令哦。注意可能要sudo.
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了。显然这里的直接并发量是1000.
其他参数可以help看看:(看起来-C对不要php的我来说没啥用.本文是初次使用记录性教程,这里就不纠结这些参数了)
关闭spawn-fcgi打开的fastcgi程序:
$ netstat -anp | grep 9000 #查看占用9000端口的程序ID
$ kill -9 PID #或killall 进程名
后面这些进程启动后,怎么和nginx对接上呢,需要进行配置文件研究修改即可,文章里有说明。
...........关于配置的说明:..............
1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)
________________对cblog进行设置在原来基础上加上: -F 1000 ________________
root@192.168.137.128:/usr/local/htdocs# ps aux|grep cblog|wc
491 5402 35846
==============================================================
对其扩展为多个FastCGI的进程后分别以Unix socket和9002进行较为深入的研究并证明其调度及和程序里cookie在多进程里出现登录失败的问题研究
=======================================================================================
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
以下结论:其写的blog不支持多个进程的登录,上面起了进程均后只有3个进程,而其中走的是unix socket不是端口有两个:2392、2394。
其它一个是端口:9002,它个没有疑义。对于2392、2394两个进程是可能被fastcgi轮流来接请求的,于是出现cookie登录失败,实践知而只起一个这样的进程ID号,不会存在这样的情况,估计其cookie没有写得兼容多个fastcgi罢。
同时发现只起动/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3,出现其进程有时只有2个,说明程序相当不稳定,所以只能说是起研究之用:
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2638
spawn-fcgi: child spawned successfully: PID: 2639
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2655
spawn-fcgi: child spawned successfully: PID: 2656
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2671
spawn-fcgi: child spawned successfully: PID: 2673
spawn-fcgi: child spawned successfully: PID: 2674
只启动上面这一个本地unix socket后出现,如果连接:http://blogtest2.com/panel-user-login.html 也就是9002出现:
The page you are looking for is temporarily unavailable.
Please try again later.
说明这两者:Unix socket和9002是独立的。
(第二:再次证明之反证。)反之,如只起用9002多个pid后,是什么情况?实践一下:
起3个依旧不稳定: /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog -F 3
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 8
spawn-fcgi: child spawned successfully: PID: 2736
spawn-fcgi: child spawned successfully: PID: 2737
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2752
spawn-fcgi: child spawned successfully: PID: 2753
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2763
spawn-fcgi: child spawned successfully: PID: 2765
spawn-fcgi: child spawned successfully: PID: 2766
此时访问 Unix socket出现得到确实是独立的再次证晨:
http://blogtest.com/panel-user-login.html The page you are looking for is temporarily unavailable.Please try again later.
root@192.168.137.128:/usr/local/webserver/nginx# strace -p 2763 -p 2765
http://blogtest2.com/panel-user-login.html
Process 2763 attached - interrupt to quit
Process 2765 attached - interrupt to quit
[pid 2765] accept(0, <unfinished ...>
[pid 2763] accept(0, {sa_family=AF_INET, sin_port=htons(56906), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\277\1\0\17\32SCRIPT"..., 8192) = 1000
[pid 2763] time(NULL) = 1386912681
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999995})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
登录action:
[pid 2765] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56908), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2765] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2765] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4f\2\0\17\32SCRIPT"..., 8192) = 1240
[pid 2765] time(NULL) = 1386912715
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7758000
[pid 2765] gettimeofday({1386912715, 783922}, NULL) = 0
[pid 2765] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2765] fcntl64(6, F_GETFD) = 0
[pid 2765] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2765] getuid32() = 0
[pid 2765] getppid() = 1
[pid 2765] gettimeofday({1386912715, 801719}, NULL) = 0
[pid 2765] gettimeofday({1386912715, 802502}, NULL) = 0
[pid 2765] read(6, "\304\264\345M\0?\352V\4\320\323\257u$\16\325", 16) = 16
[pid 2765] gettid() = 2765
[pid 2765] time(NULL) = 1386912715
[pid 2765] open("/etc/localtime", O_RDONLY) = 7
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7757000
[pid 2765] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2765] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2765] read(7, "\nCST-8\n", 4096) = 7
[pid 2765] close(7) = 0
[pid 2765] munmap(0xb7757000, 4096) = 0
[pid 2765] munmap(0xb7758000, 4096) = 0
[pid 2765] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=05ef"..., 224) = 224
[pid 2765] shutdown(5, 1 /* send */) = 0
[pid 2765] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999994})
[pid 2765] read(5, "", 1024) = 0
[pid 2765] close(5) = 0
[pid 2765] accept(0,
跳转到管理页面又变回2763:
[pid 2763] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56909), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\374\4\0\17\36SCRIPT"..., 8192) = 1064
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999150})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
说明这个第一个Unix的socket也好,9002端口也好,都存在我们常说的一个问题就是都会通过fastcgi协议分派到不同的进程中去处理,是有统一调度的!!!
第二:两者是独立的,一个是访问句柄,一个是访问端口进行通讯,独立而不干扰。但是这块七夜写的Cookie的登录判断这块可能写得不够严谨,有时间得看下这块的代码实现才行,同时借鉴PHP的cookie实现机制才能实现真正的cookie在多进程下不会出现失效的问题。EOF
——————第一:混合的情况:Unix Socket和9002同时————
作登录请求
root@192.168.137.128:~# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2386
spawn-fcgi: child spawned successfully: PID: 2392
spawn-fcgi: child spawned successfully: PID: 2394
spawn-fcgi: child spawned successfully: PID: 2395
root@192.168.137.128:~# ps aux|grep cblog
root 2386 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2392 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2394 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
从:http://blogtest2.com/panel-user-login.html
到登录:登陆成功!的action都是:2386进程在干(见:)。
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
Process 2386 attached - interrupt to quit
Process 2392 attached - interrupt to quit
Process 2394 attached - interrupt to quit
[pid 2394] accept(0, <unfinished ...>
[pid 2392] accept(0, <unfinished ...>
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56887), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\221\7\0\17\32SCRIPT"..., 8192) = 960
[pid 2386] time(NULL) = 1386911788
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999727})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56889), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\0048\0\0\17\32SCRIPT"..., 8192) = 1192
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] gettimeofday({1386911862, 145842}, NULL) = 0
[pid 2386] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2386] fcntl64(6, F_GETFD) = 0
[pid 2386] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2386] getuid32() = 0
[pid 2386] getppid() = 1
[pid 2386] gettimeofday({1386911862, 155096}, NULL) = 0
[pid 2386] gettimeofday({1386911862, 155738}, NULL) = 0
[pid 2386] read(6, "\3218\03774\374\342\3\f\330\377M{\214y\24", 16) = 16
[pid 2386] gettid() = 2386
[pid 2386] time(NULL) = 1386911862
[pid 2386] open("/etc/localtime", O_RDONLY) = 7
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d2000
[pid 2386] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2386] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2386] read(7, "\nCST-8\n", 4096) = 7
[pid 2386] close(7) = 0
[pid 2386] munmap(0xb77d2000, 4096) = 0
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=44ad"..., 224) = 224
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 982622})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0,
登录后进入管理:还是2386
方式:fastcgi_pass 127.0.0.1:9002;
http://blogtest.com/panel-user-login.html
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\211\7\0\f\0QUERY_"..., 8192) = 952
[pid 2392] time(NULL) = 1386912018
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
提交action:
[pid 2394] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999991})
[pid 2394] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4/\1\0\f\0QUERY_"..., 8192) = 1184
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77dc000
[pid 2394] gettimeofday({1386912056, 976899}, NULL) = 0
[pid 2394] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2394] fcntl64(6, F_GETFD) = 0
[pid 2394] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2394] getuid32() = 0
[pid 2394] getppid() = 1
[pid 2394] gettimeofday({1386912056, 978495}, NULL) = 0
[pid 2394] gettimeofday({1386912056, 978630}, NULL) = 0
[pid 2394] read(6, "\366\377\210C\247\350\367\231\221a7\271sE}\251", 16) = 16
[pid 2394] gettid() = 2394
[pid 2394] time(NULL) = 1386912056
[pid 2394] open("/etc/localtime", O_RDONLY) = 7
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77db000
[pid 2394] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2394] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2394] read(7, "\nCST-8\n", 4096) = 7
[pid 2394] close(7) = 0
[pid 2394] munmap(0xb77db000, 4096) = 0
[pid 2394] munmap(0xb77dc000, 4096) = 0
[pid 2394] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=c605"..., 224) = 224
[pid 2394] shutdown(5, 1 /* send */) = 0
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999992})
[pid 2394] read(5, "", 1024) = 0
[pid 2394] close(5) = 0
[pid 2394] accept(0,
http://blogtest.com/cpanel.htm [未登录]
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999989})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\357\1\0\f\0QUERY_"..., 8192) = 1048
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999993})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
方式:fastcgi_pass unix:/tmp/fcgi-blog.sock;
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=200687
了解:
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这个哥们的邮箱:sunjianfei@xiaomi.com
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
http://bbs.phpchina.com/forum.php?mod=viewthread&tid=249829
————————————————————————————————
找这个哥们他从邮箱里回了一个做好的,我没看明白当时为嘛选这些,问了下七夜:Add Time:2014-08-20
1)升级使用sqlite3的fts3扩展,进行全文检索
2)使用rmmseg进行中文分词
3) drupal文件上传
这玩意都是啥,像1) mysql都能直接直持吧?
像二mysql好像也有插件是吧?
像上传为嘛要用drupal来增强呢?
+————————+
有啥考量没?
七夜
14/8/20 星期三 上午 11:07:01
用nginx的上传就行 //是一个Nginx专用的上传模块,https://jackxiang.com/post/6221/ 有介绍。
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:01
七夜兄弟说的是那个nginx一个上传插件吧?nginx_upload_module
七夜
14/8/20 星期三 上午 11:09:00
恩是的。nginx模块
上午 11:09:23
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:09:23
我都想用c写一个专门的上传了,啊哈哈。
七夜
14/8/20 星期三 上午 11:09:43
不用。都有现成的
回忆未来-向东-Jàck 14/8/20 星期三 上午 11:10:17
写了一半写不下去了,c功力不够,对那个上传大文件是先放内存还是直接写文件这块涉及到缓存处理上好像有点纠结。
七夜
写磁盘。内存缓存部分
七夜
14/8/20 星期三 上午 11:13:11
写磁盘。内存缓存部分
————————
那是从内存一下写入磁盘,还是要有一个进程来看哪个文件内存放得多就先写呢?
啥也不会
14/8/20 星期三 上午 11:15:07
mmap啊 别的交给系统好了
SQLite的FTS3扩展
FTS3允许用户创建一个全文索引的特殊表,
CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT); /* FTS3 table */
CREATE TABLE enrondata2(content TEXT); /* Ordinary table */
使用FTS3效率特别快
SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux'; /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */
http://www.cnblogs.com/abob/archive/2010/12/01/1893425.html
2)使用rmmseg进行中文分词:
C语言开源高性能中文分词组件,C语言mmseg中文分词器 《狮子的魂》:https://code.google.com/p/friso/
3) drupal文件上传:http://blog.sina.com.cn/s/blog_a94fd80d01017tkx.html
FastCGI Blog 2.0版本正在开发中,新的版本,将是代码级别的优化,还有一些功能的增强
1. 使用了内存池,提高申请小内存的效率.一个请求一个内存池.这样杜绝了内存泄漏。
2. 自己编写了hashmap、list等实现,减少对第三方lib的依赖
3. 使用配置文件,修改相关配置更加方便
4. 使用功能更为强大的html编辑器,增加后台文件上传功能
5. 代码高亮显示
6. 文章的全文搜索功能.(有时间的话,实现该功能)
http://bbs.chinaunix.net/thread-1790317-3-1.html
C FastCGI Blog 零痛苦一键安装包
自从上次发布了我用写C写的 FastCGI Blog,很多人都说安装不太方便,所以我做了个一键安装包,大家可以零痛苦体验
解开压缩包,执行
./install.sh "/root/local"
/root/local
是安装目录
Nginx转发 spawn-fcgi看护
欢迎测试,欢迎加入
在
七夜开发
的博客基础上进行升级:
1)升级为g++编译,方便整合c++库
2)升级使用sqlite3的fts3扩展,进行全文检索
3)使用rmmseg进行中文分词
目前正在更新:
1) 整理
代码
结构,提供方便的二次开发接口和说明文档
2)添加
文件
上传,实现drupal文件上传的
用户
体验
3)后台
模板
管理
代码还在完善中,请静侯
————————————————————————————————
所有的软件包下载List:
http://code.google.com/p/php-tokyocabinet/downloads/list
C实现的FastCGI Blog:
http://www.fengblog.org/archives/200/
http://blog.sina.com.cn/s/blog_7041f8eb0100nkxe.html
下载完整版的地址:
http://www.pudn.com/downloads426/sourcecode/windows/network/detail1804143.html
七夜博客系统 FastCGI Blog 2.0,自从C-blog1.0发布以来,很多人给了很中肯的意见。这段有时间了,赶紧的把一些大家都需要的功能给开发出来。现在推出c-blog2.0版本.在这个版本里,还没实现全文搜索.在2.1版里会实现全文搜索功能。
这次升级的功能列表:
1. 引入了 配置文件
2. 增加cookie 解析,和文件上传功能
3. html编辑器,换了 更为强大的KindEditor编辑器
4. 支持代码高亮
5. 使用了内存池.统一分配 统一释放,程序更安全
6. 更清晰的 程序目录分类.
(1) db 为 数据库目录
(2) log 为 日志目录
(3) src 为 c-blog源文件目录
(4) htdocs 为 www访问目录.nginx 指到这个目录就行
7. 使用 configure make make install 方式 安装.更为简单
一直想有个自己的blog,就是犯懒不肯code,最近对自己下了狠劲。利用一两个月业余时间完成了这个blog,我还是很有成就感的。哈哈哈。这个blog程序,这几天刚完成。有bug在所难免,欢迎大家提出来,我会不断的维护的。下面我罗列一下这个blog的功能
这个blog采用html template技术, 模板修改起来就跟php的模板一样简单
后台功能
1. 分类管理、添加、删除、编辑(只支持一级分类)
2. 文章管理、添加、删除、编辑
3. 生成静态首页、清除全部静态页缓存
4. 友情链接管理、添加、删除、编辑
5. 评论列表、删除
6. 简单的用户登录和退出
========================================================================================
这个blog 依赖这些 lib
1. FastCGI http://www.fastcgi.com/dist/
2. tokyocabinet http://fallabs.com/tokyocabinet/
DownLoad:http://fallabs.com/kyotocabinet/pkg/
http://fallabs.com/tokyocabinet/pastpkg/tokyocabinet-1.3.27.tar.gz
3. SQLite3 http://www.sqlite.org/download.html
4. jemalloc http://www.canonware.com/download/jemalloc/
下载上述软件,并编译安装.
blog的编译命令是(相关lib路径,根据自己的改,)
gcc -o blog blog.c util.c tpllib.c rbtree.c assign.c ./module/bl
(gdb) set env module=user
(gdb) run
Starting program: /usr/local/htdocs/cblog
[Thread debugging using libthread_db enabled]
[New Thread 0xb7ff0b70 (LWP 5952)]
Location:/
输出:
./src/blog.c: puts("Location:/\r\n\r\n")
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
http://blogtest.com/article-read-opensource-15-c-fastcgi-blog-2.0.html
这个是用cgi生成的网页么?怎么访问这个cgi啊?
七夜 下午 02:47:19
article-read-opensource-15-c-fastcgi-blog-2.0.html
article 是访问article 模块
read 是访问article 模块 中的函数
opensource 是分类名
15 是 id
后面 的 都是 seo
url seo
回忆未来-向东-Jàck 下午 02:48:19
你这个有没有url的seo,这个得自己编写?
这个url的seo是不是写在nginx里的?当时。
等会
/panel-user-login.html
后台登录链接的Url及帐号名密码如下:
http://blogtest.com/panel-user-login.html
http://blogtest2.com/panel-user-login.html
用户名:七夜
密码:vilinux
tail -f /data1/logs/access.log
tail -f /data1/logs/nginx_error.log
回忆未来-向东-Jàck 下午 03:09:22
192.168.137.1 - - [03/Jul/2013:15:09:11 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
七夜 下午 03:09:40
看看error
errlor.log
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
回忆未来-向东-Jàck 下午 03:10:24
2013/07/03 15:10:14 [crit] 2799#0: *3 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
七夜 下午 03:11:10
chmod 777
没权限
回忆未来-向东-Jàck 下午 03:11:40
chmod -R 777 /tmp/fcgi-blog.sock
是吧?
可以了,修改了下nginx的配置,如下可以,访问,不知密码是多少:
http://blogtest.com/panel-user-login.html
Ok的Nginx配置如下:
说明通过tail看nginx的日志多么重要:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
The page you are looking for is temporarily unavailable.
Please try again later.
查看Nginx错误日志:
tail -f /data1/logs/nginx_error.log /data1/logs/access.log
==> /data1/logs/nginx_error.log <==
2013/07/03 18:17:50 [crit] 3728#0: *98 connect() to unix:/tmp/fcgi-blog.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.137.1, server: blogtest.com, request: "GET /panel-user-login.html HTTP/1.1", upstream: "fastcgi://unix:/tmp/fcgi-blog.sock:", host: "blogtest.com"
==> /data1/logs/access.log <==
192.168.137.1 - - [03/Jul/2013:18:17:50 +0800] "GET /panel-user-login.html HTTP/1.1" 502 383 "-" "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20100101 Firefox/22.0"
ulimit -c unlimited
./cblog //产生core文件,core.5273
gdb cblog core.5273
----------------------------------
Core was generated by `./cblog'.
Program terminated with signal 11, Segmentation fault.
#0 0x00cab5e7 in tcmapput () from /usr/local/lib/libtokyocabinet.so.7
--------------------------------------------------------------------------------------------------
七夜 下午 05:21:33
不行,你不能这么gdb的
你 log 输出一下
就能知道了
====================================================================================
一)启动fastcgi:
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f /usr/local/htdocs/cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 2251
chmod -R 777 /tmp/fcgi-blog.sock
二)进去后出现:
./templets/panel/category_update.html Error loading template file!
三)调试方法:
root@192.168.137.128:/usr/local/conf# strace -p 2251
Process 2251 attached - interrupt to quit
accept(0, {sa_family=AF_FILE, NULL}, [2]) = 5
select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999996})
read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4\1\7\0\f\0QUERY_"..., 8192) = 1072
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77a0000
open("./templets/panel/category_insert.html", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0xb77a0000, 4096)
=====================================================================================
没法读到模板的问题如下解决办法:
-------------------------------------------------------
七夜兄弟:
open("./templets/blog/article_list.html", O_RDONLY) = -1 ENOENT (No such file or directory)
./module/panel/article.c: if (tpl_load(tpl,"./templets/blog/article_list.html") != TPL_OK)
打开文件编译后,这个模板文件是相对于fastcgi这个程序是从哪儿开始算机的啊?
编译文件打开的模板文件你写的是相对路径,这个相对路径是相对的根目录是?
七夜 上午 11:13:12
/usr/local/htdocs/
你得在这个目录,你试试我的方法.
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock
spawn-fcgi: child spawned successfully: PID: 3639
这个sqllite备份怎么备份,
这玩意一个文件容易一出问题,整个文件里数据就挂了吧?
稳定性怎么样、如果真用sqlite的话。有没有办法提高其数据的安全这方面的经验。
七夜 上午 11:27:12
stop fastcgi. after copy sqlite3 db file to other path
安全,已经不在发布目录
所以不用担心会被浏览器下载什么的
七夜 上午 11:29:24
可能会有些小bug。大问题没有。我运行了一年
回忆未来-向东-Jàck 上午 11:30:13
像nginx下的php一样起多个。可以么?
七夜 上午 11:30:23
目前还不可以
回忆未来-向东-Jàck 上午 11:31:07
我看好像有个fastcgi命令可以起一个端口起来,有个参数是多少个进程的啊。
==========================================================
关于多个进程现在只有一个,可以再学习下。
下面关于后台的功能特别是那个缓存:
回忆未来-向东-Jàck 上午 11:32:26
这添加文章太快了,这种快感不错,比我在外面的博客快了进10倍,
这用户体验好啊。
清楚全部缓存
这个是什么意思,缓存在哪儿的?
七夜 上午 11:33:00
我会生成静态页的
列表页 首页 文章页
都会生成的静态页的
回忆未来-向东-Jàck 上午 11:33:20
生成首页
不就是么?
是自动生成的么,其他的静态页面。
首页要自己生成是吧?
七夜 上午 11:33:46
列表页 文章页 是自动生成的
访问生成的
回忆未来-向东-Jàck 上午 11:34:53
哈哈,好的,我有空再看下代码,学习一下,灰常感谢。
回忆未来-向东-Jàck 上午 11:36:34
tokyocabinet jemalloc 用在这儿是干嘛的?
好像是内存分配的是吧?这个jemalloc。它有什么好处?
这个tokyocabinet 是个什么玩意?是缓存吗。
七夜 上午 11:38:43
jemalloc 优化的 内存管理器
tokyocabinet 有现成的 map list封装
回忆未来-向东-Jàck 上午 11:39:30
这样就不容易内存泄漏和数据结构上也带来了处理方便是吧?我也学学。
七夜 上午 11:41:45
不是,jemalloc 主要是代替 libc的malloc 和free
内存泄漏 还是自己去管理
回忆未来-向东-Jàck 上午 11:42:09
仅仅是设想下像这种单个的fastcg进程i能支持并发多少 有没有过测试或估计哩?
七夜 上午 11:42:16
你可以压测一下
问下scottjiang兄弟这块的实践经验:
fastcgi只起一个进程,大概能支持并发多少啊?scottjiang兄弟。
location ~ \.html$ {
root /usr/local/htdocs;
fastcgi_pass unix:/tmp/fcgi-blog.sock;
fastcgi_index cblog;
include fastcgi_params;
}
有没有经验值啊?我想了解下这块。再就是怎么把这一个进程变多个啊。
江庆海 上午 11:50:24
可以在apache中配置最大进程数。根据你的业务请求量,一般配几十吧。
你google一下配置说明,应该有可以启动进程数,每个进程数处理最大并发个数、超时等配置。
nginx 不太熟啊,应该也是有的。
================================================
多个进程的参考方法如下:
1. nginx安装(略过)
2. FastCGI安装
因为nginx不能直接执行外部的cgi程序,我们可使用lighttpd中的spawn-fastcgi来让nginx可支持外部cgi运行。也有另外一种方法安装nginx-fcgi来让nginx支持cgi,我们这里讲解一种使用spawn-fastcgi的方法。
#include <iostream>
#include <fcgi_stdio.h>
#include <stdlib.h>
int main()
{
int count = 0;
while(FCGI_Accept() >= 0){
printf("Content-type: text/html\r\n"
"\r\n"
""
"FastCGI Hello!"
"Request number %d running on host%s "
"Process ID: %d\n", ++count, getenv("SERVER_NAME"), getpid());
}
return 0;
}
编译程序:g++ testcgi.c -o lzgFastCGI -lfcgi
测试程序是否能正常运行:./myFastCGI,如果能正常运行则说明程序没有问题,如果出现缺少库libfcgi.so.0,则自己需要手动把/usr/local/lib/libfcgi.so.0库建立一个链接到/usr/lib/目录下:ln -s /usr/local/libfcgi.so.0 /usr/lib/
3. nginx配置、测试
1) 拷贝lzgFastCGI程序到nginx下的cgibin目录(自己可以创建,根据需要更改)
2) 启动spawn-fastcgi管理进程
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
查看一下9002端口是否已成功:netstat -na | grep 9002
3) 更改nginx.conf配置文件
添加配置
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
include fastcgi_params;
}
根据上面的文章进行实践是OK的:
/usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f /usr/local/nginx/cgibin/lzgFastCGI
cd /usr/local/htdocs/
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
实践OK的,Ok步骤如下:
root@192.168.137.128:/usr/local/htdocs# /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
spawn-fcgi: child spawned successfully: PID: 4367
root@192.168.137.128:/usr/local/htdocs# netstat -atlunp|grep 9002
tcp 0 0 127.0.0.1:9002 0.0.0.0:* LISTEN 4367/./cblog
Nginx配置:
location ~ \.cgi$ { //这儿略有区别,是html都指向这个cgi了。
适当参考即可,和实际的情况均有出入:http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/
http://www.ha97.com/173.html
使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
spawn-fcgi: child spawned successfully: PID: 7551
ps aux|grep php
apache 7551 16.7 1.6 43396 6016 ? Ssl 15:14 0:01 /usr/local/webserver/php/bin/php-cgi
====================================================================================
Sqlite表查询相关实践:
root@192.168.137.128:/usr/local/db# sqlite3 blog.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
1)查看表名
sqlite> .table
article category comment friendlink
2)查表内容:
sqlite> select * from category;
1|php|php|1
2|mysql|mysql|2
3|nosql|nosql|3
4|linux|linux|4
5|javascript|javascript|5
6||life|6
7||opensource|7
8|web2.0|web2.0|8
3)表结构:
sqlite> .schema category
CREATE TABLE [category] (
[sid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[sortname] VARCHAR(30) NOT NULL,
[sortdir] VARCHAR(30) NOT NULL,
[pos] INTEGER DEFAULT '0' NOT NULL
);
CREATE INDEX [IDX_CATEGORY_POS] ON [category](
[pos] ASC
);
4)退出sqliite
sqlite> .exit
————————————————Add:2013-12-10启动了1000个fastcgi进程————————————————
http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html
步骤如下:
(1)代码情况:heloFastCGI.c
(2)make情况:makefile.sh
(3)建立目录步骤:step.txt
mkdir -p /usr/local/webserver/nginx/myFastCGI
cp helloFastCGI /usr/local/webserver/nginx/myFastCGI
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f
/usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动:
/usr/local/webserver/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9100 -C 25 -f /usr/local/webserver/nginx/myFastCGI/helloFastCGI -F 1000
启动后:
root@192.168.137.128:/data0/htdocs/myfastcgi# ps aux|grep helloFastCGI |wc
1001 11012 115083
root@192.168.137.128:/data0/htdocs/myfastcgi# netstat -atlunp|grep 9100
tcp 0 0 127.0.0.1:9100 0.0.0.0:* LISTEN 5524/helloFastCGI
注意这是一行命令哦。注意可能要sudo.
-p是指定fastcgi控制器绑定的TCP端口listen的.
如果你想调试单个fastcgi程序,可以把-f换成-n.
-F指定spawn-fcgi将fork多少个child进程。之后nginx对于此cgi的请求就可以并发了。显然这里的直接并发量是1000.
其他参数可以help看看:(看起来-C对不要php的我来说没啥用.本文是初次使用记录性教程,这里就不纠结这些参数了)
关闭spawn-fcgi打开的fastcgi程序:
$ netstat -anp | grep 9000 #查看占用9000端口的程序ID
$ kill -9 PID #或killall 进程名
后面这些进程启动后,怎么和nginx对接上呢,需要进行配置文件研究修改即可,文章里有说明。
...........关于配置的说明:..............
1. .ginx收到cgi请求后,会看有多少个该cgi程序的进程(spawn-fcgi -F指定的参数),然后根据并发量来调用(调度)cgi程序。
2. 原版spawn-fcgi(可参考下面七参考资料里daemon版spawn-fcgi)在fork了cgi程序后,自己就退出了。这时fork了的cgi程序的父进程ID都是1了,即init系统进程。这样,如果想并发就需要你的fastcgi去支持并发,可google:fastcgi并发
3. 关于php,nginx是用fastcgi来解析php的。这个负责解析的fastcgi程序并不多,好像就1个,因此这cgi不能大并发,但是没关系nginx支持cgi缓存~所以php网页的并发请求跟fastcgi关系不大。其实可以把fastcgi对于php的作用当作一个编译器,编译完后,php都有了缓存,再请求就不需要再次跑fastcgi来解析php脚本了,php就是个该死的脚本啊~~
我自己也不知道讲清楚没。其实我自己也不知道自己清楚没。:-)
________________对cblog进行设置在原来基础上加上: -F 1000 ________________
root@192.168.137.128:/usr/local/htdocs# ps aux|grep cblog|wc
491 5402 35846
==============================================================
对其扩展为多个FastCGI的进程后分别以Unix socket和9002进行较为深入的研究并证明其调度及和程序里cookie在多进程里出现登录失败的问题研究
=======================================================================================
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog
以下结论:其写的blog不支持多个进程的登录,上面起了进程均后只有3个进程,而其中走的是unix socket不是端口有两个:2392、2394。
其它一个是端口:9002,它个没有疑义。对于2392、2394两个进程是可能被fastcgi轮流来接请求的,于是出现cookie登录失败,实践知而只起一个这样的进程ID号,不会存在这样的情况,估计其cookie没有写得兼容多个fastcgi罢。
同时发现只起动/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -f ./cblog -s /tmp/fcgi-blog.sock -F 3,出现其进程有时只有2个,说明程序相当不稳定,所以只能说是起研究之用:
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2638
spawn-fcgi: child spawned successfully: PID: 2639
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2655
spawn-fcgi: child spawned successfully: PID: 2656
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2671
spawn-fcgi: child spawned successfully: PID: 2673
spawn-fcgi: child spawned successfully: PID: 2674
只启动上面这一个本地unix socket后出现,如果连接:http://blogtest2.com/panel-user-login.html 也就是9002出现:
The page you are looking for is temporarily unavailable.
Please try again later.
说明这两者:Unix socket和9002是独立的。
(第二:再次证明之反证。)反之,如只起用9002多个pid后,是什么情况?实践一下:
起3个依旧不稳定: /usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 9002 -C 25 -f ./cblog -F 3
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 8
spawn-fcgi: child spawned successfully: PID: 2736
spawn-fcgi: child spawned successfully: PID: 2737
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child signaled: 11
spawn-fcgi: child spawned successfully: PID: 2752
spawn-fcgi: child spawned successfully: PID: 2753
root@192.168.137.128:/usr/local/webserver/nginx# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2763
spawn-fcgi: child spawned successfully: PID: 2765
spawn-fcgi: child spawned successfully: PID: 2766
此时访问 Unix socket出现得到确实是独立的再次证晨:
http://blogtest.com/panel-user-login.html The page you are looking for is temporarily unavailable.Please try again later.
root@192.168.137.128:/usr/local/webserver/nginx# strace -p 2763 -p 2765
http://blogtest2.com/panel-user-login.html
Process 2763 attached - interrupt to quit
Process 2765 attached - interrupt to quit
[pid 2765] accept(0, <unfinished ...>
[pid 2763] accept(0, {sa_family=AF_INET, sin_port=htons(56906), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\277\1\0\17\32SCRIPT"..., 8192) = 1000
[pid 2763] time(NULL) = 1386912681
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999995})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
登录action:
[pid 2765] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56908), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2765] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2765] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4f\2\0\17\32SCRIPT"..., 8192) = 1240
[pid 2765] time(NULL) = 1386912715
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7758000
[pid 2765] gettimeofday({1386912715, 783922}, NULL) = 0
[pid 2765] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2765] fcntl64(6, F_GETFD) = 0
[pid 2765] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2765] getuid32() = 0
[pid 2765] getppid() = 1
[pid 2765] gettimeofday({1386912715, 801719}, NULL) = 0
[pid 2765] gettimeofday({1386912715, 802502}, NULL) = 0
[pid 2765] read(6, "\304\264\345M\0?\352V\4\320\323\257u$\16\325", 16) = 16
[pid 2765] gettid() = 2765
[pid 2765] time(NULL) = 1386912715
[pid 2765] open("/etc/localtime", O_RDONLY) = 7
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2765] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7757000
[pid 2765] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2765] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2765] read(7, "\nCST-8\n", 4096) = 7
[pid 2765] close(7) = 0
[pid 2765] munmap(0xb7757000, 4096) = 0
[pid 2765] munmap(0xb7758000, 4096) = 0
[pid 2765] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=05ef"..., 224) = 224
[pid 2765] shutdown(5, 1 /* send */) = 0
[pid 2765] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999994})
[pid 2765] read(5, "", 1024) = 0
[pid 2765] close(5) = 0
[pid 2765] accept(0,
跳转到管理页面又变回2763:
[pid 2763] <... accept resumed> {sa_family=AF_INET, sin_port=htons(56909), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2763] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2763] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\374\4\0\17\36SCRIPT"..., 8192) = 1064
[pid 2763] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb778e000
[pid 2763] munmap(0xb778e000, 4096) = 0
[pid 2763] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2763] shutdown(5, 1 /* send */) = 0
[pid 2763] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999150})
[pid 2763] read(5, "", 1024) = 0
[pid 2763] close(5) = 0
[pid 2763] accept(0,
说明这个第一个Unix的socket也好,9002端口也好,都存在我们常说的一个问题就是都会通过fastcgi协议分派到不同的进程中去处理,是有统一调度的!!!
第二:两者是独立的,一个是访问句柄,一个是访问端口进行通讯,独立而不干扰。但是这块七夜写的Cookie的登录判断这块可能写得不够严谨,有时间得看下这块的代码实现才行,同时借鉴PHP的cookie实现机制才能实现真正的cookie在多进程下不会出现失效的问题。EOF
——————第一:混合的情况:Unix Socket和9002同时————
作登录请求
root@192.168.137.128:~# sh /root/runfastcgi.sh
spawn-fcgi: child spawned successfully: PID: 2386
spawn-fcgi: child spawned successfully: PID: 2392
spawn-fcgi: child spawned successfully: PID: 2394
spawn-fcgi: child spawned successfully: PID: 2395
root@192.168.137.128:~# ps aux|grep cblog
root 2386 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2392 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root 2394 0.0 0.2 13868 1112 ? Ssl 13:15 0:00 ./cblog
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
从:http://blogtest2.com/panel-user-login.html
到登录:登陆成功!的action都是:2386进程在干(见:)。
root@192.168.137.128:~# strace -p 2386 -p 2392 -p 2394
Process 2386 attached - interrupt to quit
Process 2392 attached - interrupt to quit
Process 2394 attached - interrupt to quit
[pid 2394] accept(0, <unfinished ...>
[pid 2392] accept(0, <unfinished ...>
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56887), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\221\7\0\17\32SCRIPT"..., 8192) = 960
[pid 2386] time(NULL) = 1386911788
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999727})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0, {sa_family=AF_INET, sin_port=htons(56889), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
[pid 2386] setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
[pid 2386] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\0048\0\0\17\32SCRIPT"..., 8192) = 1192
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000
[pid 2386] gettimeofday({1386911862, 145842}, NULL) = 0
[pid 2386] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2386] fcntl64(6, F_GETFD) = 0
[pid 2386] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2386] getuid32() = 0
[pid 2386] getppid() = 1
[pid 2386] gettimeofday({1386911862, 155096}, NULL) = 0
[pid 2386] gettimeofday({1386911862, 155738}, NULL) = 0
[pid 2386] read(6, "\3218\03774\374\342\3\f\330\377M{\214y\24", 16) = 16
[pid 2386] gettid() = 2386
[pid 2386] time(NULL) = 1386911862
[pid 2386] open("/etc/localtime", O_RDONLY) = 7
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2386] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d2000
[pid 2386] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2386] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2386] read(7, "\nCST-8\n", 4096) = 7
[pid 2386] close(7) = 0
[pid 2386] munmap(0xb77d2000, 4096) = 0
[pid 2386] munmap(0xb77d3000, 4096) = 0
[pid 2386] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=44ad"..., 224) = 224
[pid 2386] shutdown(5, 1 /* send */) = 0
[pid 2386] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 982622})
[pid 2386] read(5, "", 1024) = 0
[pid 2386] close(5) = 0
[pid 2386] accept(0,
登录后进入管理:还是2386
方式:fastcgi_pass 127.0.0.1:9002;
http://blogtest.com/panel-user-login.html
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\211\7\0\f\0QUERY_"..., 8192) = 952
[pid 2392] time(NULL) = 1386912018
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0005\3\0X-Accel-Redirect: /templ"..., 88) = 88
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999999})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
提交action:
[pid 2394] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999991})
[pid 2394] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\4/\1\0\f\0QUERY_"..., 8192) = 1184
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77dc000
[pid 2394] gettimeofday({1386912056, 976899}, NULL) = 0
[pid 2394] open("/dev/urandom", O_RDONLY|O_LARGEFILE) = 6
[pid 2394] fcntl64(6, F_GETFD) = 0
[pid 2394] fcntl64(6, F_SETFD, FD_CLOEXEC) = 0
[pid 2394] getuid32() = 0
[pid 2394] getppid() = 1
[pid 2394] gettimeofday({1386912056, 978495}, NULL) = 0
[pid 2394] gettimeofday({1386912056, 978630}, NULL) = 0
[pid 2394] read(6, "\366\377\210C\247\350\367\231\221a7\271sE}\251", 16) = 16
[pid 2394] gettid() = 2394
[pid 2394] time(NULL) = 1386912056
[pid 2394] open("/etc/localtime", O_RDONLY) = 7
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] fstat64(7, {st_mode=S_IFREG|0644, st_size=405, ...}) = 0
[pid 2394] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77db000
[pid 2394] read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\0"..., 4096) = 405
[pid 2394] _llseek(7, -7, [398], SEEK_CUR) = 0
[pid 2394] read(7, "\nCST-8\n", 4096) = 7
[pid 2394] close(7) = 0
[pid 2394] munmap(0xb77db000, 4096) = 0
[pid 2394] munmap(0xb77dc000, 4096) = 0
[pid 2394] write(5, "\1\6\0\1\0\274\4\0Set-Cookie: session=c605"..., 224) = 224
[pid 2394] shutdown(5, 1 /* send */) = 0
[pid 2394] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999992})
[pid 2394] read(5, "", 1024) = 0
[pid 2394] close(5) = 0
[pid 2394] accept(0,
http://blogtest.com/cpanel.htm [未登录]
[pid 2392] <... accept resumed> {sa_family=AF_FILE, NULL}, [2]) = 5
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999989})
[pid 2392] read(5, "\1\1\0\1\0\10\0\0\0\1\0\0\0\0\0\0\1\4\0\1\3\357\1\0\f\0QUERY_"..., 8192) = 1048
[pid 2392] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7796000
[pid 2392] munmap(0xb7796000, 4096) = 0
[pid 2392] write(5, "\1\6\0\1\0m\3\0Content-type: text/html\r"..., 144) = 144
[pid 2392] shutdown(5, 1 /* send */) = 0
[pid 2392] select(6, [5], NULL, NULL, {2, 0}) = 1 (in [5], left {1, 999993})
[pid 2392] read(5, "", 1024) = 0
[pid 2392] close(5) = 0
[pid 2392] accept(0,
方式:fastcgi_pass unix:/tmp/fcgi-blog.sock;
[安全扫描]记录在案的一些需要禁用的PHP危险函数
Php/Js/Shell/Go jackxiang 2013-5-17 10:04
背景:外包项目代码审查主要是对delete相关,where里的索引,再就是对相关函数的检查,其SQL注入等,一般框架有很好的支持和过滤,这块弱化,但上线得提交一下安全扫描来弥补,对这些函数最好是用linux的grep来实现,简单点的如下:。
更详细的去svn目录的(新版本的svn好像没有了),最好去那个开发的目录grep,否则出一堆乱七八糟的东东出来:
当然也可以自己编写脚本实现,用一个系统来完成也成。
阅读全文
更详细的去svn目录的(新版本的svn好像没有了),最好去那个开发的目录grep,否则出一堆乱七八糟的东东出来:
当然也可以自己编写脚本实现,用一个系统来完成也成。
阅读全文
背景:手机抓apk产生的日志包,及用adb对包进行更新、安装操作及adb里进行tcpdump是非常有用的操作,分两个大步骤去讲。
==========第一大步骤:试图在eclipse里用logcat抓手机里的包=============
Eclipse下配置LogCat步骤及可能出现的问题解决:
一)挂载android的sdk,logcat和那个ddms都在里面:
eclipse下的菜单:windows下有一个;preferences里有一个Android,里有一个:
sdk location:选:D:\Program Files\adt-bundle-windows-x86-20130219\sdk。
(在eclipse里windows ->preference 找不到android这个选项,是啥原图?没装eclipse的android插件,后面会讲。)
(D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat)
二)打开DDMS 会自动调出logcat:
Eclipse 用DDMS 调试Android 程序,抓android手机连接电脑里的包,
单击window->open Pespective 里面应该有,没有就到other里找到ddms,这个前提是要安装eclipse的安卓插件。
logcat在:windows->show view->ohter->logcat(没有就在输入框里输入就能找到,前提是要安装了eclipse的android插件。)
来自:http://zhidao.baidu.com/link?url=IjJjp4Y3An_C25G3BDfQvj66WRsUlAAHvubwmM-DYOhRv8WEIpqWToykpNElwfO_rf8sxvBsrQPXyBYtA2myqa
关于,加入写代码如何调试?
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
这 5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不 同,我们可以控制要显示的某一类错误,一般我们如果使用'断点'方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息 应当只存在于开发过程中,最终版本只可以包含Log.i, Log.w,Log.e这三种日志信息。
http://blog.sina.com.cn/s/blog_53a99cf30100tha3.html
eclipse的DDMS中找不到安卓模拟设备?怎么办:
其一:
1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了。
2. 输入命令:adb kill-server,adb被杀死了。
3. 接着输入命令:adb start-server,重新启动adb。
4. 再用adb devices命令,是不是看到设备了。
主要原因是可能某个程序占用了adb端口,操作一下下面方法:
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
找到那个程序,kill掉。在cmd命令行下输入taskkill /pid 7024 /f
实践如下:
C:\Users\admin>netstat -ano|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4296
TCP 127.0.0.1:5037 127.0.0.1:36183 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36184 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36186 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36188 TIME_WAIT 0
C:\Users\admin>taskkill /pid 4296 /f
成功: 已终止 PID 为 4296 的进程。
C:\Users\admin>netstat -ano|findstr 5037 //还有,是tcp协议上的事情一会就没了。
TCP 127.0.0.1:5037 127.0.0.1:36859 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36860 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36861 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36862 TIME_WAIT 0
TIME_WAIT里这儿有说明,里面的图:
http://blog.csdn.net/mhfh611/article/details/8769617
三)在ddms里的logcat对包过滤:
在左下可以选:save filters,加一个PID,就是进程Id进行过滤,这样就好弄多了,
可以对某个进程进行过滤了。(在Logcat选项卡中就能看到Saved Filters处点击那个绿色的加号+,然后看改成如下截图:(把下图中的包名换成你app的包名即可)
)
==========直接ddms.bat不使用eclipse===============
D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat
adb start-server
——————————————————————————————————————————————————————
在eclipse里windows ->preference 找不到android这个选项,是啥原图:
因为 (http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html)
里的google插件被屏蔽了,在eclipse里的update里的插件地址给国内国家防火墙屏蔽了(https://dl-ssl.google.com/android/eclipse/(如果出错,请将https改成http))打不开了,于是否,
直接用ddms,eclipse其实就是集成这个ddms到里面了,位置如下:D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat 双击即可。
如果,非要从国外下载下来得设置代理:
Eclipse Update时代理设置,androidSDK 和 eclipse 的下载安装和代理设置:更新或安装插件前最好看一下代理,打开 windows/preference 看到这个配置:general network connection.....
这里可以设置你的代理,设置好代理的IP和端口就可以了。eclipse很智能,能检测你正在打开的代理,然后自动帮你配置好,但以防万一还是打开看看是否配置正确了。
然后安装插件即可 就是 help/install new software ,地址:http://dl-ssl.google.com/android/eclipse
来自:http://my.oschina.net/tdONEmadao/blog/281873?p={{currentPage-1}}
http://dl-ssl.google.com/android/eclipse/ 无法访问的解决办法:
很明显,国内网络和谐掉了google这个服务器,可以强制指向下Host ,以下是添加内容:
74.125.237.1 dl-ssl.google.com
具体操作方式:http://blog.163.com/angel_boa/blog/static/1906800912014015105249315/
点击桌面左下角开始菜单中的搜索,把以下路径,复制到搜索窗口中,c:\windows\system32\drivers\etc,点击立即搜索 ,就找到该文件,其实是一个纯文本的文件,
1、用记事本打开
2、将:203.208.46.146 dl-ssl.google.com 添加至最后一行
3、保存关闭Host
android sdk代理设置:
D:\Program Files\adt-bundle-windows-x86-20130219\SDK Manager.exe 打开后:tools->option ->http proxy(others force to https...)
——————————————————————————————————————————————————————————————
摘自:
http://bbs.51cto.com/thread-947038-1.html
=============第二大步骤:Adb控制手机里的应用应用程序及抓包=============
1.如何用adb获得手机里面某个apk的应用信息、版本信息
adb shell dumpsys package com.examle.xx
adb shell dumpsys 列出所有
2 如何用adb启动apk
adb shell am start -n breakan.test/breakan.test.TestActivity
卸载一个apk包方法:
adb uninstall SpareParts.apk
3.获取进程列表好删掉这些安装包:
删除程序方法一:
C:\Users\admin>adb shell pm list packages
package:com.baidu.searchbox
...
...
adb uninstall com.baidu.searchbox
http://mytiankong.com/?p=11755
删除程序之方法二:
需要安卓设备已ROOT,电脑已安装adb工具,直接删除程序包,
adb shell ls /system/app/ //查看系统apk列表
adb remount //挂载读写权限
adb shell rm /system/app/browser.apk //删除程序
adb shell rm /system/app/browser.apk回车,这个程序就被删除了,删除其它的程序把browser.apk改成需要删除的程序名即可,有些设备系统程序还有odex文件,也需要同时删除。
http://sspai.com/23641
会提示失败
原因在于安装后的包名已将改变,变为AndroidMainifest.xml文件中<manifest>节点下,package元素所指定的名字
正确方法是(后面这个;com.andorid什么的运行后通过logcat能够看到apk的日志):
adb uninstall com.android.spare_parts
完成!
摘自:http://blog.csdn.net/ydt_lwj/article/details/7766742
阅读全文
==========第一大步骤:试图在eclipse里用logcat抓手机里的包=============
Eclipse下配置LogCat步骤及可能出现的问题解决:
一)挂载android的sdk,logcat和那个ddms都在里面:
eclipse下的菜单:windows下有一个;preferences里有一个Android,里有一个:
sdk location:选:D:\Program Files\adt-bundle-windows-x86-20130219\sdk。
(在eclipse里windows ->preference 找不到android这个选项,是啥原图?没装eclipse的android插件,后面会讲。)
(D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat)
二)打开DDMS 会自动调出logcat:
Eclipse 用DDMS 调试Android 程序,抓android手机连接电脑里的包,
单击window->open Pespective 里面应该有,没有就到other里找到ddms,这个前提是要安装eclipse的安卓插件。
logcat在:windows->show view->ohter->logcat(没有就在输入框里输入就能找到,前提是要安装了eclipse的android插件。)
来自:http://zhidao.baidu.com/link?url=IjJjp4Y3An_C25G3BDfQvj66WRsUlAAHvubwmM-DYOhRv8WEIpqWToykpNElwfO_rf8sxvBsrQPXyBYtA2myqa
关于,加入写代码如何调试?
Log.v(String tag, String msg);
Log.d(String tag, String msg);
Log.i(String tag, String msg);
Log.w(String tag, String msg);
Log.e(String tag, String msg);
这 5种方法的首字母分别对应VERBOSE、DEBUG、INFO、WARN、ERROR。当利用DDMS进行调试时,它们的区别并不大,只是显示的颜色不 同,我们可以控制要显示的某一类错误,一般我们如果使用'断点'方式来调试程序,则使用Log.e比较合适。但是根据规范建议Log.v,Log.d信息 应当只存在于开发过程中,最终版本只可以包含Log.i, Log.w,Log.e这三种日志信息。
http://blog.sina.com.cn/s/blog_53a99cf30100tha3.html
eclipse的DDMS中找不到安卓模拟设备?怎么办:
其一:
1. 打开cmd命令行,切换到adb命令目录,如果你已经加入了环境变量,切换目录就省了。
2. 输入命令:adb kill-server,adb被杀死了。
3. 接着输入命令:adb start-server,重新启动adb。
4. 再用adb devices命令,是不是看到设备了。
主要原因是可能某个程序占用了adb端口,操作一下下面方法:
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
找到那个程序,kill掉。在cmd命令行下输入taskkill /pid 7024 /f
实践如下:
C:\Users\admin>netstat -ano|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 4296
TCP 127.0.0.1:5037 127.0.0.1:36183 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36184 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36186 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36188 TIME_WAIT 0
C:\Users\admin>taskkill /pid 4296 /f
成功: 已终止 PID 为 4296 的进程。
C:\Users\admin>netstat -ano|findstr 5037 //还有,是tcp协议上的事情一会就没了。
TCP 127.0.0.1:5037 127.0.0.1:36859 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36860 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36861 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:36862 TIME_WAIT 0
TIME_WAIT里这儿有说明,里面的图:
http://blog.csdn.net/mhfh611/article/details/8769617
三)在ddms里的logcat对包过滤:
在左下可以选:save filters,加一个PID,就是进程Id进行过滤,这样就好弄多了,
可以对某个进程进行过滤了。(在Logcat选项卡中就能看到Saved Filters处点击那个绿色的加号+,然后看改成如下截图:(把下图中的包名换成你app的包名即可)
)
==========直接ddms.bat不使用eclipse===============
D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat
adb start-server
——————————————————————————————————————————————————————
在eclipse里windows ->preference 找不到android这个选项,是啥原图:
因为 (http://jingyan.baidu.com/article/7908e85c6b4a52af481ad2ee.html)
里的google插件被屏蔽了,在eclipse里的update里的插件地址给国内国家防火墙屏蔽了(https://dl-ssl.google.com/android/eclipse/(如果出错,请将https改成http))打不开了,于是否,
直接用ddms,eclipse其实就是集成这个ddms到里面了,位置如下:D:\Program Files\adt-bundle-windows-x86-20130219\sdk\tools\ddms.bat 双击即可。
如果,非要从国外下载下来得设置代理:
Eclipse Update时代理设置,androidSDK 和 eclipse 的下载安装和代理设置:更新或安装插件前最好看一下代理,打开 windows/preference 看到这个配置:general network connection.....
这里可以设置你的代理,设置好代理的IP和端口就可以了。eclipse很智能,能检测你正在打开的代理,然后自动帮你配置好,但以防万一还是打开看看是否配置正确了。
然后安装插件即可 就是 help/install new software ,地址:http://dl-ssl.google.com/android/eclipse
来自:http://my.oschina.net/tdONEmadao/blog/281873?p={{currentPage-1}}
http://dl-ssl.google.com/android/eclipse/ 无法访问的解决办法:
很明显,国内网络和谐掉了google这个服务器,可以强制指向下Host ,以下是添加内容:
74.125.237.1 dl-ssl.google.com
具体操作方式:http://blog.163.com/angel_boa/blog/static/1906800912014015105249315/
点击桌面左下角开始菜单中的搜索,把以下路径,复制到搜索窗口中,c:\windows\system32\drivers\etc,点击立即搜索 ,就找到该文件,其实是一个纯文本的文件,
1、用记事本打开
2、将:203.208.46.146 dl-ssl.google.com 添加至最后一行
3、保存关闭Host
android sdk代理设置:
D:\Program Files\adt-bundle-windows-x86-20130219\SDK Manager.exe 打开后:tools->option ->http proxy(others force to https...)
——————————————————————————————————————————————————————————————
摘自:
http://bbs.51cto.com/thread-947038-1.html
=============第二大步骤:Adb控制手机里的应用应用程序及抓包=============
1.如何用adb获得手机里面某个apk的应用信息、版本信息
adb shell dumpsys package com.examle.xx
adb shell dumpsys 列出所有
2 如何用adb启动apk
adb shell am start -n breakan.test/breakan.test.TestActivity
卸载一个apk包方法:
adb uninstall SpareParts.apk
3.获取进程列表好删掉这些安装包:
删除程序方法一:
C:\Users\admin>adb shell pm list packages
package:com.baidu.searchbox
...
...
adb uninstall com.baidu.searchbox
http://mytiankong.com/?p=11755
删除程序之方法二:
需要安卓设备已ROOT,电脑已安装adb工具,直接删除程序包,
adb shell ls /system/app/ //查看系统apk列表
adb remount //挂载读写权限
adb shell rm /system/app/browser.apk //删除程序
adb shell rm /system/app/browser.apk回车,这个程序就被删除了,删除其它的程序把browser.apk改成需要删除的程序名即可,有些设备系统程序还有odex文件,也需要同时删除。
http://sspai.com/23641
会提示失败
原因在于安装后的包名已将改变,变为AndroidMainifest.xml文件中<manifest>节点下,package元素所指定的名字
正确方法是(后面这个;com.andorid什么的运行后通过logcat能够看到apk的日志):
adb uninstall com.android.spare_parts
完成!
摘自:http://blog.csdn.net/ydt_lwj/article/details/7766742
阅读全文
背景: 要点是:各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。 我最近也在研究这一块发现确实也有这样的问题,作下备案。
Oauth2.0相比较Oauth1.0步骤简化,通过HTTPS和限制回调地址来提高安全性。但是各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。所以就会有一些问题存在。比如对回调地址限制不严格就会造成问题。
详细的步骤如下:
1、结合www.hack6.com
2、百度账号可以登录qunar网站,通过百度账号连接服务
3、授权模式中的Implicit grant模式只需要client_id和redirect_uri就可以完成账号的授权流程,从而把获取到的access_token返回到redirect_uri页面中
4、构造如下的URL:
http://openapi.baidu.com/oauth/2.0/authorize?scope=super_msg&response_type=token&client_id=RCKbWANx8KewnXs9rwGWFtZV&redirect_uri=http://lvtu.qunar.com/mobile_ugc/web/album.htm?albumId=4228
client_id为qunar网的百度应用ID
redirect_uri为获取access_token后的回调地址
response_type=token是采用Implicit grant授权模式
scope为申请的权限
5、可以把该地址发给他人诱使别人连接,最方便的利用是结合点击劫持来让用户完成授权流程。从而劫持到用户的access_token
6、获取到的token可以利用api接口来操作该账号(百度的api少的可怜)。
下面图是劫持后的。
修复方案:
1、最好是严格限制redirect_uri,我知道很难。
2、可以在授权页面加入放点击劫持代码,降低风险
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在访问第四步里构造如下的URL地址,出现如下提示:
错误码:1107
错误信息:Invalid Referer
详细描述:当前页面的Referer错误。使用Implicit Grant方式获取Access Token时,Referer必须与应用的根域名绑定同域,请在开发者在应用安全设置中进行绑定。
本文章原创来自:http://www.hack6.com/wzle/gf/2012/baidukaifangpingtaioauthshouquanjiekoukeyijiechiaccess_token_2525525255.html
Oauth2.0相比较Oauth1.0步骤简化,通过HTTPS和限制回调地址来提高安全性。但是各互联网公司的业务在对Oauth2.0的实现上并没有完全按照Oauth2.0的标准来做。所以就会有一些问题存在。比如对回调地址限制不严格就会造成问题。
详细的步骤如下:
1、结合www.hack6.com
2、百度账号可以登录qunar网站,通过百度账号连接服务
3、授权模式中的Implicit grant模式只需要client_id和redirect_uri就可以完成账号的授权流程,从而把获取到的access_token返回到redirect_uri页面中
4、构造如下的URL:
http://openapi.baidu.com/oauth/2.0/authorize?scope=super_msg&response_type=token&client_id=RCKbWANx8KewnXs9rwGWFtZV&redirect_uri=http://lvtu.qunar.com/mobile_ugc/web/album.htm?albumId=4228
client_id为qunar网的百度应用ID
redirect_uri为获取access_token后的回调地址
response_type=token是采用Implicit grant授权模式
scope为申请的权限
5、可以把该地址发给他人诱使别人连接,最方便的利用是结合点击劫持来让用户完成授权流程。从而劫持到用户的access_token
6、获取到的token可以利用api接口来操作该账号(百度的api少的可怜)。
下面图是劫持后的。
修复方案:
1、最好是严格限制redirect_uri,我知道很难。
2、可以在授权页面加入放点击劫持代码,降低风险
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在访问第四步里构造如下的URL地址,出现如下提示:
错误码:1107
错误信息:Invalid Referer
详细描述:当前页面的Referer错误。使用Implicit Grant方式获取Access Token时,Referer必须与应用的根域名绑定同域,请在开发者在应用安全设置中进行绑定。
本文章原创来自:http://www.hack6.com/wzle/gf/2012/baidukaifangpingtaioauthshouquanjiekoukeyijiechiaccess_token_2525525255.html