[他山之石]PHP扩展之网络socket扩展导读
Php/Js/Shell/Go jackxiang 2012-9-8 22:54
没想到在CSDN上看到一个兄弟写的文章成连载了,于是细看了下,发现对PHP的Socket的编码及扩展实现写得不错,建议看下其扩展写法,很有学习教育意义,再就是对Epoll模型的分析很到位,觉得写得都不错,特摘录下Socket这块的PHP扩展代码分析结合其PHP的Soket服务器写法,原文来自:
http://blog.csdn.net/shagoo/article/details/6647961
http://blog.csdn.net/shagoo/article/details/6396089
《Socket深度探究4PHP(一)》和《Socket深度探究4PHP(二)》 Socket 深度探究 4 PHP (三) 应该是写得很有体系的难得一见的不错的好文章。
阅读全文
http://blog.csdn.net/shagoo/article/details/6647961
http://blog.csdn.net/shagoo/article/details/6396089
《Socket深度探究4PHP(一)》和《Socket深度探究4PHP(二)》 Socket 深度探究 4 PHP (三) 应该是写得很有体系的难得一见的不错的好文章。

[实践OK]Linux服务器系统清掉last登录日志管理常用lastlog命令,linux查看用户登陆历史记录。Linux清除用户登录记录和命令历史方法 。
Unix/LinuxC技术 jackxiang 2012-9-3 13:24
背景:在跳板机上连接的信息不想让人知道或者不想让攻击者知道密钥的IP和端口信息,一旦拿到权限后就能知道密钥很麻烦,于是,得把历史记录消除,在secureCRT里面登录其它机器时加上,如何隐藏你的 Linux 的命令行历史。来自:https://linux.cn/article-7575-1.html
Linux服务器系统清掉last登录日志:
#echo ""> /var/log/wtmp 此文件默认打开时乱码的,里面可以看到ip等等信息
https://blog.csdn.net/counsellor/article/details/87082207
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。
以下来自:http://doc.chinaunix.net/linux/201208/2306409.shtml
查看某用户 cat /home/username/.bash_history 的操作历史
使用root登陆使用last -x可查看用户登陆历史。
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
补充说明:单独执行last指令,它会读取位于/var/log目录下,
名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行。
-d 将IP地址转换成主机名称。
-f 指定记录文件。
-n 或- 设置列出名单的显示列数。
-R 不显示登入系统的主机名称或IP地址。
-x 显示系统关机,重新开机,以及执行等级的改变等信息。
lastlog可简单查看所有用户最后一次的登陆时间
http://blog.163.com/lideren_2008/blog/static/147057920120515235866/
________________Linux清除用户登录记录和命令历史方法摘自上面的URl __________________
清除登陆系统成功的记录
[root@localhost root]# echo > /var/log/wtmp #此文件默认打开时乱码,可查到ip等信息
[root@localhost root]# last #此时即查不到用户登录信息
清除登陆系统失败的记录
[root@localhost root]# echo > /var/log/btmp #此文件默认打开时乱码,可查到登陆失败信息
[root@localhost root]# lastb #查不到登陆失败信息
清除历史执行命令
[root@localhost root]# history -c
或者,清空用户目录下的这个文件即可
[root@localhost root]# echo > ./.bash_history
1.vi /root/history #新建记录文件
2.history -c #清除记录
3.history -r /root/history.txt #导入记录
4.history #查询导入结果
example
[root@localhost root]# vi /root/history
[root@localhost root]# history -c
[root@localhost root]# history -r /root/history.txt
[root@localhost root]# history
1 echo > /var/log/wtmp
2 last
3 echo > /var/log/btmp
4 lastb
5 history -c
6 echo > ./.bash_history
7 history
Linux服务器系统清掉last登录日志:
#echo ""> /var/log/wtmp 此文件默认打开时乱码的,里面可以看到ip等等信息
https://blog.csdn.net/counsellor/article/details/87082207
lastlog文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示**Never logged**。注意需要以root身份运行该命令,例如:
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可加一些参数,例如,"last -u 102"命令将报告UID为102的用户;"last -t 7"命令表示限制为上一周的报告。
以下来自:http://doc.chinaunix.net/linux/201208/2306409.shtml
查看某用户 cat /home/username/.bash_history 的操作历史
使用root登陆使用last -x可查看用户登陆历史。
last 命令:
功能说明:列出目前与过去登入系统的用户相关信息。
语 法:last [-adRx][-f ][-n ][帐号名称…][终端机编号…]
补充说明:单独执行last指令,它会读取位于/var/log目录下,
名称为wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
参 数:
-a 把从何处登入系统的主机名称或IP地址,显示在最后一行。
-d 将IP地址转换成主机名称。
-f 指定记录文件。
-n 或- 设置列出名单的显示列数。
-R 不显示登入系统的主机名称或IP地址。
-x 显示系统关机,重新开机,以及执行等级的改变等信息。
lastlog可简单查看所有用户最后一次的登陆时间
http://blog.163.com/lideren_2008/blog/static/147057920120515235866/
________________Linux清除用户登录记录和命令历史方法摘自上面的URl __________________
清除登陆系统成功的记录
[root@localhost root]# echo > /var/log/wtmp #此文件默认打开时乱码,可查到ip等信息
[root@localhost root]# last #此时即查不到用户登录信息
清除登陆系统失败的记录
[root@localhost root]# echo > /var/log/btmp #此文件默认打开时乱码,可查到登陆失败信息
[root@localhost root]# lastb #查不到登陆失败信息
清除历史执行命令
[root@localhost root]# history -c
或者,清空用户目录下的这个文件即可
[root@localhost root]# echo > ./.bash_history
1.vi /root/history #新建记录文件
2.history -c #清除记录
3.history -r /root/history.txt #导入记录
4.history #查询导入结果
example
[root@localhost root]# vi /root/history
[root@localhost root]# history -c
[root@localhost root]# history -r /root/history.txt
[root@localhost root]# history
1 echo > /var/log/wtmp
2 last
3 echo > /var/log/btmp
4 lastb
5 history -c
6 echo > ./.bash_history
7 history
php用system后台运行命令不等待结果的用法
Php/Js/Shell/Go jackxiang 2012-8-31 19:15
system(“nohup ./t.py $ks &”);这个不会在后台运行,php会一直挂起直到t.py结束。
system(“nohup ./t.py $ks >>log.txt &”);这样写才能在后台运行因为system函数启动一个程序并希望保持在后台运行,
必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
如:
到无穷的黑夜文件中去:
system(“nohup ./t.py $ks >>log.txt &”);这样写才能在后台运行因为system函数启动一个程序并希望保持在后台运行,
必须确保该程序的输出被重定向到一个文件或者其它输出流去,否则 PHP 会在程序执行结束前挂起。
如:
到无穷的黑夜文件中去:
在ATMEL的89S51系列的89S51与89C51功能相同,指令兼容。HEX程序无需任何转换可以直接使用。89S51只比89C51增加了一个看门狗功能。
向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H,即可激活看门狗。
汇编程序如下:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
C51程序如下:
在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6来声明看门狗寄存器。
sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E; //先送1E
WDTRST=0xE1; //后送E1
喂狗指令与激活相同:
WDTRST=0x1E;
WDTRST=0xE1;
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。
阅读全文
向看门狗寄存器(WDTRST地址是0A6H)中先写入01EH,再写入0E1H,即可激活看门狗。
汇编程序如下:
Mov 0A6H,#01EH ;先送1E
Mov 0A6H,#0E1H ;后送E1
C51程序如下:
在AT89X51.h声明文件中增加一行 sfr WDTRST = 0xA6来声明看门狗寄存器。
sfr WDTRST = 0xA6;
Main()
{
WDTRST=0x1E; //先送1E
WDTRST=0xE1; //后送E1
喂狗指令与激活相同:
WDTRST=0x1E;
WDTRST=0xE1;
注意事项:
1. 89S51的看门狗必须由程序激活后才开始工作。
2. 看门狗使用的是CPU的晶振。在晶振停振的时候看门狗也无效。
3. 89S51只有14位计数器。在16383个机器周期内必须至少喂狗一次。而且这个时间是固定的,无法更改。当晶振为12M时每16个毫秒需喂狗一次。

严泽远 10:08:42
我用的是STC12C5628AD
回忆未来-向东-Jàck 13:08:22
AT89S52有软件喂狗,但是STC12C5A60S2 单片机有硬件看门狗,用哪个好呢?
张彦欣单片机 13:59:27
AT89S52有看门狗?
回忆未来-向东-Jàck 14:11:23
STC12C5A60S2 这个也需要写代码喂狗?
回忆未来-向东-Jàck 14:13:50
STC12C5A60S2 这个自己带PWM,我用AT89S52的定时器产生也成,但是好像时序有点问题,如果不关中断的话。所以,STC12C5A60S2 感觉要稳定点儿,兄弟怎么看?
张彦欣单片机 14:15:19
是的。
用单片机做的温度监控系统,ds18b20采集温度,现在还要输出PWM波频率为100HZ,应该如何实现?求大神指点
用低定时器中断时不行的,会使ds18b20输出错误,若在ds18b20程序中关中断,pwm波会有断续。
我告诉你为什么:
因为定时器中断是强制性的,一旦计时溢出,无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。
这是一定不行的,定时器写的pwm是会破坏18b20的时序的;
如果时间允许序的话,即pwm高(低)电平时间大于读写18b20的时间;我建议你在每个pwm的高(低)电平的时候进行18b20的操作;
若时间不允许的话,那么只能在定时器中加上18b20的读取时间了,这样将会很麻烦;
以上仅供参考。
稍微高级一点的MCU应该带有PWM寄存器吧,STC也有类似40个引脚的增强型的单片机,如:stc12c5a60s2
http://item.taobao.com/item.htm?spm=a230r.1.10.210&id=9929702075
书:“十五”高等院校规划教材:《增强型8051单片机实用开发技术》
好多地都没有货了,直接购买PDF版本:http://item.taobao.com/item.htm?spm=a230r.1.10.86.WziaXb&id=16258074740
百度文库PWM简单代码:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
淘宝上有卖开发板的,找到两家便宜的店:
http://item.taobao.com/item.htm?spm=a230r.1.10.208.JW2dkE&id=14811238438&_u=u19u1s735c
对于PWM输出的硬件设计PPT:http://wenku.baidu.com/view/75758588cc22bcd126ff0ca3.html
这样的设计势必要对应程序:http://wenku.baidu.com/view/f02443bd960590c69ec3760f.html
更简单的PWM设置链接:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
,比如有独立的PWM模块,AT24C04等,和AT系列的单片机不同点在于没有仿真罢了。我遇到这种问题是直接在读取温度时就把中断关闭,不让PWM的中断打扰,读取温度的时间应该很短,影响不大,By:jack
STC12C5A60S2能直接替换STC89C52开发板的上的STC89C52单片机吗?
是40引脚的吧 是的话 应该可以
单片机其他外延模块 LED LCD 蜂鸣器 彩灯之类的 需要单片机来的信号都是TTL信号 单片机的电压变化都是一致的 可以进行替换 芯片只要能实现引脚高低信号电压的一致就没问题
您好:
可以的。STC12C5A60S2和STC89C52引脚兼容,前者只是P0口复用了AD,内部资料多了点。
http://zhidao.baidu.com/question/206521917.html?fr=qrl&cid=93&index=1
STC12C5A60S2开了两路PWM,还能不能开定时器0中断啊
可以的,STC12C5A60S2的PWM是独立的硬件模块,不耗STC12C5A60S2的指令执行,所以可以开定时器0中断以及处理其它任务
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。
一个基础板兼容多种STC和ATMel的单片机板:
http://item.taobao.com/item.htm?spm=a230r.1.10.56.zM593N&id=18138913000
答:支持STC89C52、STC12C5A60S2、AT89C51、AT89C52、AT89S51、AT89S52等最常用的51系列单片机。除此之外,还支持其它40脚的51系列单片机以及ATmega16!STC89C52、STC12C5A60S2可以用串口直接下载程序
DS18B20用N次定时中断读取,比如4MS中断一次,第1次复位18B20,
第2次18B20引脚置高,第3次发出转换命令 搜索器件,并启动,到第40次时再复位18B20,41次引脚置高,42次读取命令,43次读取数据。也就是说读取一次温度,需要中断43次,整个过程都在中断中执行。pwm就可以用中断了,18B20也不会读取错误了。希望对你有帮助。
实时是不行了,这儿可以参考一下时间错位的办法:http://bbs.icbuy.com/thread-57813-1-1.html
STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?
串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的
STC单片机11.0592晶振实现115200波特率串口通信
在8051系列单片机如:89S51、89C51 这些单片机上,用11.0592M晶振实现115200波特率通信,几乎是不可能的。
如果换了STC单片机,例如在STC12C5A60S2实现115200的高速通信就相当简单了。
因为,STC12单片机有独立的波特率发生器。
#include "STC12C5A60S2.H"
#include "stdio.h"
void init_uart()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
char putchar (unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
记得头文件加上 stdio.h,然后在代码里实现 putchar 函数,这样你就可以很方便的用 printf函数进行串口输出了。
例如
int hh=0,mm=0,ss=0;
printf("现在的时间:%d:%d:%d\r\n", hh,mm,ss);
是不是串口输出变简单多了。
阅读全文
我用的是STC12C5628AD
回忆未来-向东-Jàck 13:08:22
AT89S52有软件喂狗,但是STC12C5A60S2 单片机有硬件看门狗,用哪个好呢?
张彦欣单片机 13:59:27
AT89S52有看门狗?
回忆未来-向东-Jàck 14:11:23
STC12C5A60S2 这个也需要写代码喂狗?
回忆未来-向东-Jàck 14:13:50
STC12C5A60S2 这个自己带PWM,我用AT89S52的定时器产生也成,但是好像时序有点问题,如果不关中断的话。所以,STC12C5A60S2 感觉要稳定点儿,兄弟怎么看?
张彦欣单片机 14:15:19
是的。
用单片机做的温度监控系统,ds18b20采集温度,现在还要输出PWM波频率为100HZ,应该如何实现?求大神指点
用低定时器中断时不行的,会使ds18b20输出错误,若在ds18b20程序中关中断,pwm波会有断续。
我告诉你为什么:
因为定时器中断是强制性的,一旦计时溢出,无论程序执行到何处都会被暂停,优先去执行中断服务程序。 DS18B20这种对时序有严格要求的单总线通讯,在发送和接收数据时被定时器中断扰乱了时序,所以无法通讯。要解决此问题建议你采用带硬件PWM的MCU,或者将18B20通讯代码放在中断服务程序内部,如果采用后一种方式,PWM计时时间请算上18B20通讯的时间。
这是一定不行的,定时器写的pwm是会破坏18b20的时序的;
如果时间允许序的话,即pwm高(低)电平时间大于读写18b20的时间;我建议你在每个pwm的高(低)电平的时候进行18b20的操作;
若时间不允许的话,那么只能在定时器中加上18b20的读取时间了,这样将会很麻烦;
以上仅供参考。
稍微高级一点的MCU应该带有PWM寄存器吧,STC也有类似40个引脚的增强型的单片机,如:stc12c5a60s2
http://item.taobao.com/item.htm?spm=a230r.1.10.210&id=9929702075
书:“十五”高等院校规划教材:《增强型8051单片机实用开发技术》
好多地都没有货了,直接购买PDF版本:http://item.taobao.com/item.htm?spm=a230r.1.10.86.WziaXb&id=16258074740
百度文库PWM简单代码:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
淘宝上有卖开发板的,找到两家便宜的店:
http://item.taobao.com/item.htm?spm=a230r.1.10.208.JW2dkE&id=14811238438&_u=u19u1s735c
对于PWM输出的硬件设计PPT:http://wenku.baidu.com/view/75758588cc22bcd126ff0ca3.html
这样的设计势必要对应程序:http://wenku.baidu.com/view/f02443bd960590c69ec3760f.html
更简单的PWM设置链接:http://wenku.baidu.com/view/f4ef50ec856a561252d36fcb.html
,比如有独立的PWM模块,AT24C04等,和AT系列的单片机不同点在于没有仿真罢了。我遇到这种问题是直接在读取温度时就把中断关闭,不让PWM的中断打扰,读取温度的时间应该很短,影响不大,By:jack
STC12C5A60S2能直接替换STC89C52开发板的上的STC89C52单片机吗?
是40引脚的吧 是的话 应该可以
单片机其他外延模块 LED LCD 蜂鸣器 彩灯之类的 需要单片机来的信号都是TTL信号 单片机的电压变化都是一致的 可以进行替换 芯片只要能实现引脚高低信号电压的一致就没问题
您好:
可以的。STC12C5A60S2和STC89C52引脚兼容,前者只是P0口复用了AD,内部资料多了点。
http://zhidao.baidu.com/question/206521917.html?fr=qrl&cid=93&index=1
STC12C5A60S2开了两路PWM,还能不能开定时器0中断啊
可以的,STC12C5A60S2的PWM是独立的硬件模块,不耗STC12C5A60S2的指令执行,所以可以开定时器0中断以及处理其它任务
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。
一个基础板兼容多种STC和ATMel的单片机板:
http://item.taobao.com/item.htm?spm=a230r.1.10.56.zM593N&id=18138913000
答:支持STC89C52、STC12C5A60S2、AT89C51、AT89C52、AT89S51、AT89S52等最常用的51系列单片机。除此之外,还支持其它40脚的51系列单片机以及ATmega16!STC89C52、STC12C5A60S2可以用串口直接下载程序
DS18B20用N次定时中断读取,比如4MS中断一次,第1次复位18B20,
第2次18B20引脚置高,第3次发出转换命令 搜索器件,并启动,到第40次时再复位18B20,41次引脚置高,42次读取命令,43次读取数据。也就是说读取一次温度,需要中断43次,整个过程都在中断中执行。pwm就可以用中断了,18B20也不会读取错误了。希望对你有帮助。
实时是不行了,这儿可以参考一下时间错位的办法:http://bbs.icbuy.com/thread-57813-1-1.html
STC12C5A60S2单片机双串口,为什么串口1用独立波特率发生器时还要使能定时器(0/1)并允许定时器中断?
串口1波特率可使用定时器1或者独立波特率发生器,使用定时器1时做波特率发生时,你就不能用定时器1了,使用独立波特率发生器时,定时器1得到释放,你可以随时使用;此时你使能定时器(0/1)并允许定时器中断只是为了释放定时器,当然你用不到定时器中断,也可以关掉,对波特率无影响的
STC单片机11.0592晶振实现115200波特率串口通信
在8051系列单片机如:89S51、89C51 这些单片机上,用11.0592M晶振实现115200波特率通信,几乎是不可能的。
如果换了STC单片机,例如在STC12C5A60S2实现115200的高速通信就相当简单了。
因为,STC12单片机有独立的波特率发生器。
#include "STC12C5A60S2.H"
#include "stdio.h"
void init_uart()
{
PCON &= 0x7f; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
}
char putchar (unsigned char i)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = i;
while(TI ==0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
return SBUF;
}
记得头文件加上 stdio.h,然后在代码里实现 putchar 函数,这样你就可以很方便的用 printf函数进行串口输出了。
例如
int hh=0,mm=0,ss=0;
printf("现在的时间:%d:%d:%d\r\n", hh,mm,ss);
是不是串口输出变简单多了。

转自老乡的博客:http://www.toplee.com/blog/615.html
很多人用Editplus, 但是修改了文件后,需要切换到文件目录,点击鼠标右键使用TortoiseSVN的提交菜单项来提交,需要增加很多鼠标点击和确认的操作,对于频繁修改的文件来说,非常麻烦,今天研究了一番,找到个好的解决办法:
先下载 http://www.sliksvn.com/pub/Slik-Subversion-1.5.2-win32.msi 安装上,这是一个在windows上提供标准svn命令行的工具,使用默认安装到C盘的相应目录下即可。
阅读全文
很多人用Editplus, 但是修改了文件后,需要切换到文件目录,点击鼠标右键使用TortoiseSVN的提交菜单项来提交,需要增加很多鼠标点击和确认的操作,对于频繁修改的文件来说,非常麻烦,今天研究了一番,找到个好的解决办法:
先下载 http://www.sliksvn.com/pub/Slik-Subversion-1.5.2-win32.msi 安装上,这是一个在windows上提供标准svn命令行的工具,使用默认安装到C盘的相应目录下即可。

如今tornadoweb和nginx事相当流行的web服务器,很多指标都显示在大多数情况下,他们比apache的性能要好很多。既然如此,我就有以下问题:
Epoll模型是导致他们如此快速的根本原因吗?如果我想写一个好的socket服务器,我能够从中学到什么东西呢?
如果你想写一个socket服务器,建议先看看dan kegel几年前写的c10k文章
http://www.kegel.com/c10k.html
我也认为beej的《网络编程指导》也是一本非常方便实用的书籍
http://beej.us/guide/bgnet/
如果,你需要更多的参考,W. Richard stevens写的《unix网络编程也是一本很好的书籍。
总之,要回答那个问题,apache和nginx最大的不同是,apache使用了每个请求一个线程的阻塞I/O模型,nginx使用了单线程的非阻塞I/O模型。Apache的工作池的确是缩减了一些启动内容并销毁了一些进程,但是在处理多请求的时候他仍然让CPU在不同的线程间跳来跳去。Nginx却把所有的请求都放在一个线程里面。当有一个请求想要发送网络请求的时候,nginx向后端求求附加一个回调,然后再一个新的活跃客户端请求上工作。事实上,这意味着他返回到时间循环(epoll,kqueue,或者是select)然后后请求文件描述符,并告知有些事情要报告。注意,系统调用在主要时间循环里面实际上是一个阻塞操作,因为直到文件描述符可以读写之前是无事可做的。
所以,nginx和ternado如此高效同时服务多个客户端请求的主要原因是:只有一个进程(因此也就剩内存)只有一个线程(因为也就减少了CUP在不同的上下文里面交换)。至于epool,他只是select的另一个更加高级的版本。如果有N个打开的文件描述符(sockets),他就会让你从中选择一个按0(1)的时间复杂度而不是0(N)的时间复杂度进行读操作。事实上,如果你在编译的时候使用了—with-select_module参数,你就可以使用select模型,我敢打赌,那笔apche更加的高效。我对apache的内核不是很熟悉,但是一个快速的grep操作可以告诉我们apache的确是使用了select和epoll模型—可能当服务器在监听多端口/接口的时候,或者他确实有多个为一个客户端请求准备了多了后端请求。
偶尔,我照着这个开始编写一个基本的socket服务器,想要搞清楚为什么nginx是如此的高效。在熟读了nginx的源代码然后又看完了上面的链接中的那些书籍之后,我发现,写一个nginx的模块要比写自己的服务器简单的多。因此也就诞生了一个nginx模块开发指南
http://www.evanmiller.org/nginx-modules-guide.html
(注意,这本指导是针对nginx0.5-0.6编写的,现在有些api已经变化了)如果你做一些与http关的事情,我说你的确应该支持一下nginx因为他把那些愚蠢客户端的请求处理的是如此之好。例如,我自己业余写的一个socket服务器在大多数客户端下都很好出了safari浏览器,我到现在都没搞清楚这是怎么回事。即使在其他的协议下,nginx也能适应,nginx的事物处理能力已经完全对协议层透明,这就是为什么他技能代理http,也能代理imap.ngingx的核心代码组织的相当好,写的也相当优秀,唯一的缺陷是几乎没有什么注释。我不会在被nginx牵着鼻子走,当他和一个协议解释器纠缠不清的时候。相反,使用一个解释生成器。我写了一些关于在nginx中使用解释生成器的东西在下面这给对方:
http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing
这可能比你想要的信息要多,不过我还是希望你能找到一些对你有用的东西
Epoll模型是导致他们如此快速的根本原因吗?如果我想写一个好的socket服务器,我能够从中学到什么东西呢?
如果你想写一个socket服务器,建议先看看dan kegel几年前写的c10k文章
http://www.kegel.com/c10k.html
我也认为beej的《网络编程指导》也是一本非常方便实用的书籍
http://beej.us/guide/bgnet/
如果,你需要更多的参考,W. Richard stevens写的《unix网络编程也是一本很好的书籍。
总之,要回答那个问题,apache和nginx最大的不同是,apache使用了每个请求一个线程的阻塞I/O模型,nginx使用了单线程的非阻塞I/O模型。Apache的工作池的确是缩减了一些启动内容并销毁了一些进程,但是在处理多请求的时候他仍然让CPU在不同的线程间跳来跳去。Nginx却把所有的请求都放在一个线程里面。当有一个请求想要发送网络请求的时候,nginx向后端求求附加一个回调,然后再一个新的活跃客户端请求上工作。事实上,这意味着他返回到时间循环(epoll,kqueue,或者是select)然后后请求文件描述符,并告知有些事情要报告。注意,系统调用在主要时间循环里面实际上是一个阻塞操作,因为直到文件描述符可以读写之前是无事可做的。
所以,nginx和ternado如此高效同时服务多个客户端请求的主要原因是:只有一个进程(因此也就剩内存)只有一个线程(因为也就减少了CUP在不同的上下文里面交换)。至于epool,他只是select的另一个更加高级的版本。如果有N个打开的文件描述符(sockets),他就会让你从中选择一个按0(1)的时间复杂度而不是0(N)的时间复杂度进行读操作。事实上,如果你在编译的时候使用了—with-select_module参数,你就可以使用select模型,我敢打赌,那笔apche更加的高效。我对apache的内核不是很熟悉,但是一个快速的grep操作可以告诉我们apache的确是使用了select和epoll模型—可能当服务器在监听多端口/接口的时候,或者他确实有多个为一个客户端请求准备了多了后端请求。
偶尔,我照着这个开始编写一个基本的socket服务器,想要搞清楚为什么nginx是如此的高效。在熟读了nginx的源代码然后又看完了上面的链接中的那些书籍之后,我发现,写一个nginx的模块要比写自己的服务器简单的多。因此也就诞生了一个nginx模块开发指南
http://www.evanmiller.org/nginx-modules-guide.html
(注意,这本指导是针对nginx0.5-0.6编写的,现在有些api已经变化了)如果你做一些与http关的事情,我说你的确应该支持一下nginx因为他把那些愚蠢客户端的请求处理的是如此之好。例如,我自己业余写的一个socket服务器在大多数客户端下都很好出了safari浏览器,我到现在都没搞清楚这是怎么回事。即使在其他的协议下,nginx也能适应,nginx的事物处理能力已经完全对协议层透明,这就是为什么他技能代理http,也能代理imap.ngingx的核心代码组织的相当好,写的也相当优秀,唯一的缺陷是几乎没有什么注释。我不会在被nginx牵着鼻子走,当他和一个协议解释器纠缠不清的时候。相反,使用一个解释生成器。我写了一些关于在nginx中使用解释生成器的东西在下面这给对方:
http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing
这可能比你想要的信息要多,不过我还是希望你能找到一些对你有用的东西
在Vmware的虚拟机上想通过yum等更新下rpm,于是自己ping 一下却发现没有出得去,采用的是桥连的方法:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
From 192.168.1.108 icmp_seq=1 Destination Host Unreachable
From 192.168.1.108 icmp_seq=2 Destination Host Unreachable
From 192.168.1.108 icmp_seq=3 Destination Host Unreachable
From 192.168.1.108 icmp_seq=5 Destination Host Unreachable
原来一看是网关没有设好:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
DEVICE="eth0"
BOOTPROTO="static"
IPADDR=192.168.1.108
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
GATEWAY=192.168.1.254,后修改为:GATEWAY=192.168.1.1,发现这个192.168.1.1是集成了:DNS,网关,DHCP服务于一体的一个东东,这个东东也就是我买的那个无线路由器的Ip,修改后出现新的现象:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
但用:curl "www.jackxiang.com" 是Ok的,于是查了下google如下,问题是为何出现:DUP!这个玩意?不明白啊,尽管有下面的解释,还是不太明白到底是为什么:
这个是个ICMP重定向应答,ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发
请解释网关和域名服务器的作用:
为何刚才设置错了网关就不行呢?看来得对网关这个玩意有所了解,如下知识汇总:
阅读全文
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
From 192.168.1.108 icmp_seq=1 Destination Host Unreachable
From 192.168.1.108 icmp_seq=2 Destination Host Unreachable
From 192.168.1.108 icmp_seq=3 Destination Host Unreachable
From 192.168.1.108 icmp_seq=5 Destination Host Unreachable
原来一看是网关没有设好:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT="yes"
DEVICE="eth0"
BOOTPROTO="static"
IPADDR=192.168.1.108
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
GATEWAY=192.168.1.254,后修改为:GATEWAY=192.168.1.1,发现这个192.168.1.1是集成了:DNS,网关,DHCP服务于一体的一个东东,这个东东也就是我买的那个无线路由器的Ip,修改后出现新的现象:
root@192.168.1.108:~# ping jackxiang.com
PING jackxiang.com (72.46.128.86) 56(84) bytes of data.
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=48 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
64 bytes from 72-46-128.static.versaweb.net (72.46.128.86): icmp_seq=1 ttl=47 time=245 ms (DUP!)
但用:curl "www.jackxiang.com" 是Ok的,于是查了下google如下,问题是为何出现:DUP!这个玩意?不明白啊,尽管有下面的解释,还是不太明白到底是为什么:
这个是个ICMP重定向应答,ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据报向它的目的地转发
请解释网关和域名服务器的作用:
为何刚才设置错了网关就不行呢?看来得对网关这个玩意有所了解,如下知识汇总:

[值得参考]用php+snmp实现服务器监控程序,Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。
Php/Js/Shell/Go jackxiang 2012-8-21 15:07
Cacti基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测
官方网站:http://www.cacti.net/
演示地址:http://www.cacti.net/screenshots.php
下载地址:http://www.cacti.net/download_cacti.php
文章来源:http://www.OSphp.com.cn
程序介绍:
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。Cacti通过snmpget来获取数据,使用RRDtool绘画图形,也可外挂Scripts及加上Templates来作出各式各样的监控图,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善,界面友好,支持插件扩展。
转载自 xiaoxiaolq最终编辑 xiaoxiaolq值班监控服务器时,需一台台去登录查看服务器情况,很是麻烦,故用PHP SNMP做了个简单的服务器监控系统。结合了用来发短信的MAS系统,当服务器反生异常时可通过短信进行报警。
阅读全文
官方网站:http://www.cacti.net/
演示地址:http://www.cacti.net/screenshots.php
下载地址:http://www.cacti.net/download_cacti.php
文章来源:http://www.OSphp.com.cn
程序介绍:
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形解决方案。Cacti通过snmpget来获取数据,使用RRDtool绘画图形,也可外挂Scripts及加上Templates来作出各式各样的监控图,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善,界面友好,支持插件扩展。
转载自 xiaoxiaolq最终编辑 xiaoxiaolq值班监控服务器时,需一台台去登录查看服务器情况,很是麻烦,故用PHP SNMP做了个简单的服务器监控系统。结合了用来发短信的MAS系统,当服务器反生异常时可通过短信进行报警。

在WINDOWS7系统下,使用以前Xp的快捷键win+u+u关机不行了?告诉你个新方法,操作键数和次数一样,好用的要尖叫。
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
更高明的办法:win + -> +回车!这个办法和XP一样,只需要3次操作!
[实践Ok]开机自动启动samba
Unix/LinuxC技术 jackxiang 2012-8-18 18:28
service nmb start
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
service nscd start
1. 在 /etc/init.d 中作一个如下内容的脚本smbd
一般要封装一下:
2. 然后执行
ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd
ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd
3.测试一下及赋权限:
开机启动:
service smbd start
env: /etc/init.d/smbd: 权限不够
chmod -R a+x /etc/init.d/smbd
[实践Ok]让Samba支持软连接,方便开发的实践操作。
Unix/LinuxC技术 jackxiang 2012-8-18 18:24
今天,自己搭建一个samba时,想建立一个软链接,但发现报错:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
查来查去,原来是少了一行:unix extensions = no ,少这一行,能看见软链接,但点不进去,说是权限不够。
也就是需要三行配置,如下:
samba的conf代码:
PHP下一个不错的Excel类:PHP类phpExcel应用
Php/Js/Shell/Go jackxiang 2012-8-18 10:08
PHP语言在实际编写中经常会与数据库打上交道。下面我们就来一起看看PHP类phpExcel的具体使用方法。phpExcel,操作excel很方便,尤其是可以方便的加入图片,支持jpg gif png格式。
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:
阅读全文
下面是总结的几个PHP类phpExcel使用方法
创建一个excel
$objPHPExcel = new PHPExcel();
PHP类phpExcel保存excel—2007格式
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter=new PHPExcel_Writer_Excel5($objPHPExcel);//非2007格式
$objWriter->save("xxx.xlsx");
直接输出到浏览器
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate,post-check=0,pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="resume.xls" ');
header("Content-Transfer-Encoding:binary");
$objWriter->save("php://output");
PHP类phpExcel设置excel的属性:

php文件锁(转)
Php/Js/Shell/Go jackxiang 2012-8-18 09:55
点评:Mysql的;group_concat这个函数在PHP和Mysql结合的优化上可能在某些时候能够派上用场,如下:
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160
Group_Concat 是 MySQL 中用户Group By 的一个函数,函数语法如下:
这个函数在 MySQL 4.1 中被加入。函数返回一个字符串结果,该结果由分组中的值连接组合而成。
充分利用此函数,可以简化我们程序中的一些写法。
比如我们现在有一个学生成绩表,为了方便不同班级科目的设置,对学生的成绩没有采用一条记录多个字段的方式,而是采用多条记录一个成绩字段方式存储。
现在要求获得一个班级中学生各科成绩列表。
通过Group_Concat 函数,我们只要简单执行如下的SQL语句,
然后在程序中通过一个循环,将选出的结果输出来就可以了。如果不使用,我们通常需要将选出来的数据做再次整理,(多增加一些变量做一些循环判断,没有采用Group_Concat后的逻辑简单)
来自:http://www.sunnyu.com/?p=160
C++中,a++与++a有什么区别?
Php/Js/Shell/Go jackxiang 2012-8-12 16:37
一般来说他们的区别在于混合表达式中运算符的处理顺序。
a++是先处理其他运算,然后a再自加;
而++a则是先处理a自加运算,再处理其他表达式运算;
如果只是单纯的表达式a++;或者是++a;这两个表达式的结果就没什么区别。
譬如是
计算的结果是a=2,b=1,c=2
c=++a是表达式先处理自加运算后处理赋值运算;
b=a++是表达式先处理赋值运算后处理自加运算;
http://iask.sina.com.cn/b/16210468.html
a++是先处理其他运算,然后a再自加;
而++a则是先处理a自加运算,再处理其他表达式运算;
如果只是单纯的表达式a++;或者是++a;这两个表达式的结果就没什么区别。
譬如是
计算的结果是a=2,b=1,c=2
c=++a是表达式先处理自加运算后处理赋值运算;
b=a++是表达式先处理赋值运算后处理自加运算;
http://iask.sina.com.cn/b/16210468.html
PHP反转字符串函数strrev()函数的用法
Php/Js/Shell/Go jackxiang 2012-8-12 11:14
定义和用法
strrev() 函数反转字符串。
语法
strrev(string)
参数 描述
string 必需。规定要反转的字符串。
例子
复制代码 代码如下:
输出:
!dlroW olleH
Shell 也有对应的一个函数:
strrev() 函数反转字符串。
语法
strrev(string)
参数 描述
string 必需。规定要反转的字符串。
例子
复制代码 代码如下:
输出:
!dlroW olleH
Shell 也有对应的一个函数: