来源:http://rashost.com/blog/centos5-vps-nginx-solution2
本文介绍在CentOS 5 VPS下的nginx+php+mysql的解决方案之二,本方案使用php-fpm作为fastcgi的进程管理器。
使用php-fpm就必须重新编译php,不能使用系统自带的php。我们的观点是尽量使用系统自带的,除非功能满足不了。本方案中MySQL是使用CentOS 5自带的,Nginx是我们自己编译的。
安装Nginx
centos系统不带nginx,我们用的Nginx是自己编译的,Nginx版本是最新稳定版本0.7.61,到 http://rashost.com/download 下载nginx,然后开始安装:
rpm -ivh nginx-0.7*.rpm
chkconfig --list nginx
chkconfig nginx on
/etc/init.d/nginx start
rpm -ql nginx
上面的rpm -ql nginx命令是看看nginx的文件都安装在哪些目录下面了,可以看到nginx的缺省网页目录应该是/usr/share/nginx/html/
通过浏览器访问,应该能看到nginx的缺省网页了,说明nginx正常工作了!
安装MySQL
我们使用CentOS自带的MySQL,安装命令:
yum install -y mysql-server
chkconfig --list mysqld
chkconfig mysqld on
/etc/init.d/mysqld start
运行mysql -uroot命令,应该可以正常连接到MySQL
安装php & php-fpm
先安装php & php-fpm所依赖的一些库文件:
yum install libmhash libmcrypt libtool-ltdl libpng libjpeg curl
然后到 http://rashost.com/download 下载我们自己编译的php-fpm,并安装:
cd /opt
tar zxf php-fpm-5.2.10*.tar.gz
/opt/php/sbin/php-fpm start
然后编辑/etc/rc.local,在其中加入/opt/sbin/php-fpm start
整合
首先在/usr/share/nginx/html目录下创建文件test.php,其内容很简单,只要下面一行:
<?phpinfo();?>
假设所在VPS的地址是centos5.rashost.com,这时通过浏览器访问http://centos5.rashost.com/test.php是得不到正确的显示结果的。
修改nginx的配置文件/etc/nginx/nginx.conf,在文件内搜索fastcgi_pass,修改该部分内容为:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
然后重启nginx:
/etc/init.d/nginx/restart
然后在浏览器中访问test.php页面,就应该能正确显示了,reboot VPS测试一下,各个模块应该都能自带启动。大功告成
本文介绍在CentOS 5 VPS下的nginx+php+mysql的解决方案之二,本方案使用php-fpm作为fastcgi的进程管理器。
使用php-fpm就必须重新编译php,不能使用系统自带的php。我们的观点是尽量使用系统自带的,除非功能满足不了。本方案中MySQL是使用CentOS 5自带的,Nginx是我们自己编译的。
安装Nginx
centos系统不带nginx,我们用的Nginx是自己编译的,Nginx版本是最新稳定版本0.7.61,到 http://rashost.com/download 下载nginx,然后开始安装:
rpm -ivh nginx-0.7*.rpm
chkconfig --list nginx
chkconfig nginx on
/etc/init.d/nginx start
rpm -ql nginx
上面的rpm -ql nginx命令是看看nginx的文件都安装在哪些目录下面了,可以看到nginx的缺省网页目录应该是/usr/share/nginx/html/
通过浏览器访问,应该能看到nginx的缺省网页了,说明nginx正常工作了!
安装MySQL
我们使用CentOS自带的MySQL,安装命令:
yum install -y mysql-server
chkconfig --list mysqld
chkconfig mysqld on
/etc/init.d/mysqld start
运行mysql -uroot命令,应该可以正常连接到MySQL
安装php & php-fpm
先安装php & php-fpm所依赖的一些库文件:
yum install libmhash libmcrypt libtool-ltdl libpng libjpeg curl
然后到 http://rashost.com/download 下载我们自己编译的php-fpm,并安装:
cd /opt
tar zxf php-fpm-5.2.10*.tar.gz
/opt/php/sbin/php-fpm start
然后编辑/etc/rc.local,在其中加入/opt/sbin/php-fpm start
整合
首先在/usr/share/nginx/html目录下创建文件test.php,其内容很简单,只要下面一行:
<?phpinfo();?>
假设所在VPS的地址是centos5.rashost.com,这时通过浏览器访问http://centos5.rashost.com/test.php是得不到正确的显示结果的。
修改nginx的配置文件/etc/nginx/nginx.conf,在文件内搜索fastcgi_pass,修改该部分内容为:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
然后重启nginx:
/etc/init.d/nginx/restart
然后在浏览器中访问test.php页面,就应该能正确显示了,reboot VPS测试一下,各个模块应该都能自带启动。大功告成
Nginx是个Web服务器新秀,CentOS5官方没有Nginx的RPM包,本文记录了在64位的CentOS55.4下怎样编译Nginx 0.7.61版本的RPM包。
要编译RPM包,首先要有SRPM包,也就是RPM包的源代码包。可以从Nginx官网下载Nginx的源代码然后自己制作Nginx的SRPM包,这比较麻烦。本文下载了fedora 10中自带的Nginx的SRPM包,稍做修改即可。
安装SRPM包:
rpm -ivh nginx-0.7.61-1.fc10.src.rpm
上面命令把源代码安装在了/usr/src/redhat目录下,要编译RPM,需要rpmbuild命令:
yum install -y rpm-build.x86_64
然后就可以开始build了:
cd /usr/src/redhat/SPECS
rpmbuild -bb nginx.spec
build报错了,少了几个必须的库文件,我们来安装:
yum install -y pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 mod_perl-devel.x64_64
然后修改nginx.spec文件,将其中的perl-devel修改成mod_perl-devel。继续build:
rpmbuild -bb nginx.spec
大功告成!build出来的RPM包就是/usr/src/redhat/RPMS/x86_64/nginx-0.7.61-1.x86_64.rpm 。同样的方法,我们在32位的CentOS5.4下也编译了一份,然后把他们都放到 http://rashost.com/download 下供大家下载。
什么情况下封你网站的的80端口
有下面任意情况,我们会封80端口:
1. 你网站的上有任何一个域名没有备案
2. 你网站的上有任何一个网站首页下面没有写上备案号
怎样解封
如果您没有备案的域名都没有指向您的你网站的,指向你网站的的所有域名都满足:
1. 去 http://www.miibeian.gov.cn/CX/main.jsp 查询到域名已经备案
2. 网站首页下面写上备案号码
那么您可以提交服务单给我们,写清楚哪些未备案的域名已经不再指向你网站的了,哪些域名已经备案了,备案号码是多少,我们收到服务单并验证后,会尽快解封80端口
怎样验证备案
到 http://www.miibeian.gov.cn/CX/main.jsp 输入自己的域名查询是否备案成功。如果备案成功,请一定把备案号码放到网站首页的下方,以免被误认为没有备案。
怎样去备案
点击这里查看我们的备案步骤,这是常规的备案方法,备案下来可能需要几十天的时间。
最快的备案方法
网络上有很多人声称能做在24小时以内做好备案,到 http://google.cn/ 搜索"备案",就会发现好多网站可以花钱购买到备案号码。
需要注意的是,我们不对这些网络上的快速备案做任何担保和推荐,请您自己鉴别真伪,自己来选择。
有下面任意情况,我们会封80端口:
1. 你网站的上有任何一个域名没有备案
2. 你网站的上有任何一个网站首页下面没有写上备案号
怎样解封
如果您没有备案的域名都没有指向您的你网站的,指向你网站的的所有域名都满足:
1. 去 http://www.miibeian.gov.cn/CX/main.jsp 查询到域名已经备案
2. 网站首页下面写上备案号码
那么您可以提交服务单给我们,写清楚哪些未备案的域名已经不再指向你网站的了,哪些域名已经备案了,备案号码是多少,我们收到服务单并验证后,会尽快解封80端口
怎样验证备案
到 http://www.miibeian.gov.cn/CX/main.jsp 输入自己的域名查询是否备案成功。如果备案成功,请一定把备案号码放到网站首页的下方,以免被误认为没有备案。
怎样去备案
点击这里查看我们的备案步骤,这是常规的备案方法,备案下来可能需要几十天的时间。
最快的备案方法
网络上有很多人声称能做在24小时以内做好备案,到 http://google.cn/ 搜索"备案",就会发现好多网站可以花钱购买到备案号码。
需要注意的是,我们不对这些网络上的快速备案做任何担保和推荐,请您自己鉴别真伪,自己来选择。
搜索安装扩展The Addon Bar (restored) 即可:
https://jackxiang.com/post/7227/
在网站开发中,通常为了方便开发,本地开发时会使用跟生产环境会相同的域名,然后通过切换 hosts 进行访问。
比如在开发时,指定 hosts :
127.0.0.1 www.jackxiang.com
需要对生产环境进行访问时,就修改 hosts,或者直接删除相应记录:
12.23.34.45 www.jackxiang.com
这样子做,除了方便开发外,还避免发布时引发不必要的路径问题。
正常情况下,修改 hosts 之后是需要重启 Firefox 才能生效的,如果是切换环境比较频繁的话,还是很烦人的,特别是当打开其他窗口的时候,重启一下 Firefox 代价还是很高的。
DNS Flusher 可以很简单地解决这个问题,装上后会在 Firefox 的状态栏右下角显示当前网站的 IP 地址,修改 hosts 后,回来点击一下,马上就刷新了,非常方便。
地址:https://addons.mozilla.org/en-US/firefox/addon/7408
HostAdmin插件
轻松切换当前域名绑定的IP (hosts文件中配置的)
https://jackxiang.com/post/7227/
在网站开发中,通常为了方便开发,本地开发时会使用跟生产环境会相同的域名,然后通过切换 hosts 进行访问。
比如在开发时,指定 hosts :
127.0.0.1 www.jackxiang.com
需要对生产环境进行访问时,就修改 hosts,或者直接删除相应记录:
12.23.34.45 www.jackxiang.com
这样子做,除了方便开发外,还避免发布时引发不必要的路径问题。
正常情况下,修改 hosts 之后是需要重启 Firefox 才能生效的,如果是切换环境比较频繁的话,还是很烦人的,特别是当打开其他窗口的时候,重启一下 Firefox 代价还是很高的。
DNS Flusher 可以很简单地解决这个问题,装上后会在 Firefox 的状态栏右下角显示当前网站的 IP 地址,修改 hosts 后,回来点击一下,马上就刷新了,非常方便。
地址:https://addons.mozilla.org/en-US/firefox/addon/7408
HostAdmin插件
轻松切换当前域名绑定的IP (hosts文件中配置的)
Linux 下单片机和Linux系统下的串口通讯程序:
http://wenku.baidu.com/view/b3eb1e11866fb84ae45c8da0.html
http://hi.baidu.com/zizio/item/358100ccea7d7a3a459416af
来源:http://www.dss.cn/Article/embed_system/200512/815.html
摘 要:介绍了一种采用Linux操作系统的PC机通过串口和MCS-51系列单片机进行通信的设计方法,给出了基本的硬件原理和通信程序设计的2种方法。实验证明,这种方案简单可靠、价格低廉,为Linux在工业控制等领域中的应用提供了一种解决方法。
关键词:Linux;单片机;串行通信;工业控制
单片机性能稳定、价格低廉、功能强大,在智能仪器、工业装备以及日用电子消费品中得到了越来越广泛的应用。在单片机的输入输出控制中,除直接接上小键盘和LCD显示屏等方法外,一般都通过串口和上位机PC进行通信,而后一种方法由于能实现远程控制,并且能够利用PC机强大的数据处理功能以及友好的控制界面,显得尤为重要。在一般的利用PC机对单片机进行控制的场合,都是采用Windows作为上位机的平台,其优点是界面友好,编程和操作都比较容易,缺点是稳定性太差,这对于需要连续数天或数月运行的装置来说,尤其不合适。在要求比较苛刻的场合,一般都采用UNIX工作站作为主控平台,如合肥同步辐射加速器的主控平台采用的是SUN的Solaris工作站系统,然而UNIX工作站昂贵的价格又大大限制了其使用的范围。近年来,随着Linux的迅猛发展,使其逐渐从少数人的玩具变成了主流的操作系统。Linux是遵循GPL协议的免费源代码开放软件,任何人都可以自由的从Internet上取得其源程序,也可在GPL的协议下修改其源代码以适应特定的应用,其运行在普通的PC上,性能稳定,特别适于做工业控制,因此实现Linux和单片机的串行通信非常有意义,他可以是昂贵的UNIX工作站的一种可选的替代方法。
1 硬件原理
目前国内使用较多的为MCS-51系列的单片机,因此选用的单片机实验对象为一片AT89C51,图1是硬件原理图,由于要实现符合RS232C的串行通信,还应该用一片ICL232CPE(MAX232)作为串行通信的电平转换电路。在实验过程中,为了查看通信是否成功,除了让单片机对上位机回送数据外,还在单片机外围扩展了几片锁存器,几个LED发光二极管和几个小键盘。串行通信是采用最简单的TxD,RxD,GND三线制连接,注意TxD和RxD两边应该交叉连线。
上位机是一台普通的PC机,共有2个串行口COM1,COM2,其运行RedHat8.0,实际上,如果不要求运行Gnome或KDE等图形界面,Linux对系统硬件的要求相当低。
实验证明,此电路简单可靠,非常适用于测试串行通信。
2 串行通信程序设计
串行通信程序包括下位机单片机和上位机PC机的程序。单片机接收上位机传来的数据,放到片内RAM里面,再将RAM内数据同时发送到外部扩展锁存器和上位机,由此可以判断通信是否成功。此程序由汇编语言写成,初始化时波特率设置为4 800 b/s,通信方式为8-N-1。
上位机程序的编写是关键部分,因为要对串口硬件设备进行操作,有2种方法,一是利用Linux内核自带的串口驱动程序,另外一种方法就是直接读写串口硬件端口,下面分别介绍。
2.1 利用串口驱动程序的编程方法
利用Linux自身的串口驱动程序进行编程,实际上就是调用驱动程序的一系列函数,完成串口通信参数的设置,数据的发送和接收。在这种方法中,Linux给每个串口都分配一个文件索引号,有相应的文件名称,实际上是将硬件设备看成一种特殊的文件,如COM1,COM2对应的文件分别为/dev/ttyS0,/dev/ttyS1,操作这2个串口实际上就是操作这2个文件,而对硬件设备文件的操作与对普通文件的操作并没有什么不同,都可以使用相同的文件I/O调用函数(open,write,read,close),不同之处在于用系统调用open()打开串口得到相应设备的文件描述符以后,先要对其进行初始化,设置一些特定的参数,如波特率、数据位、输入输出方式等,这些参数存放在structtermios中,函数tcsetattr()可以设置串口的structtermios,tcgetattr()可以得到串口的struct termios。设置完通信参数后就可用read和write对串口文件进行读写了。运行程序时要注意用户是否有对要操作的串口文件进行读写的权力,可以用chmod命令进行文件权限修改。
初始化函数如下:
初始化以后就开始发送和接收数据,先将一个字符串发送给单片机,单片机接收到数据后,将数据返回给上位机。但需要注意的是,由于上位机速度比单片机快得多,一次不能发送过多的数据,否则极有可能使发送缓冲区溢出而丢失数据,发送过后,还需等待一段时间,使单片机将数据完全发送到上位机后,再进行读取。
2.2 直接读写串口硬件端口的方法
在使用这个方法的时候,必须对串口通信的硬件原理有一些了解。PC机的串口是由通用异步收发器8250UART(或16550)为核心构成的,寄存器基地址分别是0x3f8(COM1)和0x2f8(COM2),还有其他的一些用于控制的寄存器。有很多寄存器是与Modem相关的,而在使用三线制进行通信时用不到,只用关心与通信相关的寄存器,比起使用为通用功能编写的串口设备驱动程序来,直接读写相关寄存器效率更高。
初始化后,就可以进行数据的收发了,接受数据之前必须保证接收数据就绪,这可以通过0x2fd的D0来判断,发送数据之前必须保证发送寄存器为空,这可以通过0x2fd的D5来判断,代码如下:
3 结语
实验表明,此系统采用的2种方法都完全实现了LinuxPC机与单片机之间点对点的通信,方法简单可靠,基本上在需要用到PC机与单片机串行通信的场合均可采用此种方法。随着近年来Linux在国内应用范围的日益壮大,在工业控制、数据采集等领域也必将越来越多的采用Linux,本文可以算作是一个有益的尝试。当然在实际应用中还需要考虑一些问题,比如进行出错处理的问题,可以在一个要发送的字符串后再发送一个校验和,当收到返回的校验和与发送的校验和不一致时再进行重发,再比如所采用的RS232C传输距离很短,并且抗干扰能力很差,这时需要将总线转换成差分传输的RS485/RS422。另外,稍加改进,就可实现PC机与多片51单片机的串行通信,这时由于共用一条总线,必须给每个单片机分配一个地址,然后由PC机对总线进行仲裁,只有获得总线使用权的单片机才能与上位机进行通信,这里不再赘述。
总之,本文只是为Linux PC和单片机串行通信提供了一个典型的范例,要应用到实际的项目中去,还需要根据实际的情况具体考虑,灵活应用,最终才能形成一个可靠的基于Linux平台的系统。
参考文献
[1] PhiCornes.Linux从入门到精通[M].童寿彬译.北京:电子工业出版社,1998.
[2]Peter Baumann H . Linux Serial - programming - HOWTO中文版[M].曾元佑译.
[3]万福君,潘松峰.单片微机原理系统设计与应用[M].合肥:中国科学技术大学出版社,2001.
[4][美]安格斯生.串行端口大全[M].精英科技译.北京:中国电力出版社,2001.
http://wenku.baidu.com/view/b3eb1e11866fb84ae45c8da0.html
http://hi.baidu.com/zizio/item/358100ccea7d7a3a459416af
来源:http://www.dss.cn/Article/embed_system/200512/815.html
摘 要:介绍了一种采用Linux操作系统的PC机通过串口和MCS-51系列单片机进行通信的设计方法,给出了基本的硬件原理和通信程序设计的2种方法。实验证明,这种方案简单可靠、价格低廉,为Linux在工业控制等领域中的应用提供了一种解决方法。
关键词:Linux;单片机;串行通信;工业控制
单片机性能稳定、价格低廉、功能强大,在智能仪器、工业装备以及日用电子消费品中得到了越来越广泛的应用。在单片机的输入输出控制中,除直接接上小键盘和LCD显示屏等方法外,一般都通过串口和上位机PC进行通信,而后一种方法由于能实现远程控制,并且能够利用PC机强大的数据处理功能以及友好的控制界面,显得尤为重要。在一般的利用PC机对单片机进行控制的场合,都是采用Windows作为上位机的平台,其优点是界面友好,编程和操作都比较容易,缺点是稳定性太差,这对于需要连续数天或数月运行的装置来说,尤其不合适。在要求比较苛刻的场合,一般都采用UNIX工作站作为主控平台,如合肥同步辐射加速器的主控平台采用的是SUN的Solaris工作站系统,然而UNIX工作站昂贵的价格又大大限制了其使用的范围。近年来,随着Linux的迅猛发展,使其逐渐从少数人的玩具变成了主流的操作系统。Linux是遵循GPL协议的免费源代码开放软件,任何人都可以自由的从Internet上取得其源程序,也可在GPL的协议下修改其源代码以适应特定的应用,其运行在普通的PC上,性能稳定,特别适于做工业控制,因此实现Linux和单片机的串行通信非常有意义,他可以是昂贵的UNIX工作站的一种可选的替代方法。
1 硬件原理
目前国内使用较多的为MCS-51系列的单片机,因此选用的单片机实验对象为一片AT89C51,图1是硬件原理图,由于要实现符合RS232C的串行通信,还应该用一片ICL232CPE(MAX232)作为串行通信的电平转换电路。在实验过程中,为了查看通信是否成功,除了让单片机对上位机回送数据外,还在单片机外围扩展了几片锁存器,几个LED发光二极管和几个小键盘。串行通信是采用最简单的TxD,RxD,GND三线制连接,注意TxD和RxD两边应该交叉连线。
上位机是一台普通的PC机,共有2个串行口COM1,COM2,其运行RedHat8.0,实际上,如果不要求运行Gnome或KDE等图形界面,Linux对系统硬件的要求相当低。
实验证明,此电路简单可靠,非常适用于测试串行通信。
2 串行通信程序设计
串行通信程序包括下位机单片机和上位机PC机的程序。单片机接收上位机传来的数据,放到片内RAM里面,再将RAM内数据同时发送到外部扩展锁存器和上位机,由此可以判断通信是否成功。此程序由汇编语言写成,初始化时波特率设置为4 800 b/s,通信方式为8-N-1。
上位机程序的编写是关键部分,因为要对串口硬件设备进行操作,有2种方法,一是利用Linux内核自带的串口驱动程序,另外一种方法就是直接读写串口硬件端口,下面分别介绍。
2.1 利用串口驱动程序的编程方法
利用Linux自身的串口驱动程序进行编程,实际上就是调用驱动程序的一系列函数,完成串口通信参数的设置,数据的发送和接收。在这种方法中,Linux给每个串口都分配一个文件索引号,有相应的文件名称,实际上是将硬件设备看成一种特殊的文件,如COM1,COM2对应的文件分别为/dev/ttyS0,/dev/ttyS1,操作这2个串口实际上就是操作这2个文件,而对硬件设备文件的操作与对普通文件的操作并没有什么不同,都可以使用相同的文件I/O调用函数(open,write,read,close),不同之处在于用系统调用open()打开串口得到相应设备的文件描述符以后,先要对其进行初始化,设置一些特定的参数,如波特率、数据位、输入输出方式等,这些参数存放在structtermios中,函数tcsetattr()可以设置串口的structtermios,tcgetattr()可以得到串口的struct termios。设置完通信参数后就可用read和write对串口文件进行读写了。运行程序时要注意用户是否有对要操作的串口文件进行读写的权力,可以用chmod命令进行文件权限修改。
初始化函数如下:
初始化以后就开始发送和接收数据,先将一个字符串发送给单片机,单片机接收到数据后,将数据返回给上位机。但需要注意的是,由于上位机速度比单片机快得多,一次不能发送过多的数据,否则极有可能使发送缓冲区溢出而丢失数据,发送过后,还需等待一段时间,使单片机将数据完全发送到上位机后,再进行读取。
2.2 直接读写串口硬件端口的方法
在使用这个方法的时候,必须对串口通信的硬件原理有一些了解。PC机的串口是由通用异步收发器8250UART(或16550)为核心构成的,寄存器基地址分别是0x3f8(COM1)和0x2f8(COM2),还有其他的一些用于控制的寄存器。有很多寄存器是与Modem相关的,而在使用三线制进行通信时用不到,只用关心与通信相关的寄存器,比起使用为通用功能编写的串口设备驱动程序来,直接读写相关寄存器效率更高。
初始化后,就可以进行数据的收发了,接受数据之前必须保证接收数据就绪,这可以通过0x2fd的D0来判断,发送数据之前必须保证发送寄存器为空,这可以通过0x2fd的D5来判断,代码如下:
3 结语
实验表明,此系统采用的2种方法都完全实现了LinuxPC机与单片机之间点对点的通信,方法简单可靠,基本上在需要用到PC机与单片机串行通信的场合均可采用此种方法。随着近年来Linux在国内应用范围的日益壮大,在工业控制、数据采集等领域也必将越来越多的采用Linux,本文可以算作是一个有益的尝试。当然在实际应用中还需要考虑一些问题,比如进行出错处理的问题,可以在一个要发送的字符串后再发送一个校验和,当收到返回的校验和与发送的校验和不一致时再进行重发,再比如所采用的RS232C传输距离很短,并且抗干扰能力很差,这时需要将总线转换成差分传输的RS485/RS422。另外,稍加改进,就可实现PC机与多片51单片机的串行通信,这时由于共用一条总线,必须给每个单片机分配一个地址,然后由PC机对总线进行仲裁,只有获得总线使用权的单片机才能与上位机进行通信,这里不再赘述。
总之,本文只是为Linux PC和单片机串行通信提供了一个典型的范例,要应用到实际的项目中去,还需要根据实际的情况具体考虑,灵活应用,最终才能形成一个可靠的基于Linux平台的系统。
参考文献
[1] PhiCornes.Linux从入门到精通[M].童寿彬译.北京:电子工业出版社,1998.
[2]Peter Baumann H . Linux Serial - programming - HOWTO中文版[M].曾元佑译.
[3]万福君,潘松峰.单片微机原理系统设计与应用[M].合肥:中国科学技术大学出版社,2001.
[4][美]安格斯生.串行端口大全[M].精英科技译.北京:中国电力出版社,2001.
背景:最近同事遇到一个问题,那就是一不小心把一张表因为分号把where给隔断了,导致全表全给更新了,其别说前面的数据,先说今天上传的视频后缀啥的,都没了,但还好今天有上传日志,于是,得从日志里获取uuid和路径名,前端四台机,合并后,用grep -B 3进行了查找导出,并用grep -v进行去重,只依次留下两行uuid,pathAndSuffix ,为此,再用grep 分别把uuid和pathAndSuffix 分成两个文件,此时,就可以用paste进行行合并,从而实现了列序变行序。
功能说明:合并文件的列。
语 法:paste [-s][-d ][--help][--version][文件...]
补充说明:paste指令会把每个文件以列对列的方式,一列列地加以合并。
参 数:
-d或--delimiters= 用指定的间隔字符取代跳格字符。
-s或--serial 串列进行而非平行处理。
--help 在线帮助。
--version 显示帮助信息。
列合并:
[root@rhel5 ~]# more file*
::::::::::::::
file1.txt
::::::::::::::
f
f
f
::::::::::::::
file2.txt
::::::::::::::
1
2
3
[root@rhel5 ~]# paste -d "" file1.txt file2.txt>merge.txt
[root@rhel5 ~]# more merge.txt
f1
f2
f3
来自:http://blog.itpub.net/9240380/viewspace-764820
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。
粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
paste格式为:
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
例子:
wangnc> pg pas1
ID897
ID666
ID982
wangnc> pg pas2
P.Jones
S.Round
L.Clip
基本paste命令将pas1和pas2两文件粘贴成两列:
wangnc> paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
通过交换文件名即可指定哪一列先粘:
wangnc> paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982
要创建不同于空格或tab键的域分隔符,使用-d选项。下面的例子用冒号做域分隔符。
wangnc> paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
要合并两行,而不是按行粘贴,可以使用-s选项。下面的例子中,第一行粘贴为ID号,第二行是名字。
wangnc> paste -s pas1 pas2
ID897 ID666 ID982
P.Jones S.Round L.Clip
paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个6列格式显示目录列表。方法如下:
wangnc> ls /etc | paste -d" " - - - - - -
MANPATH PATH SHLIB_PATH SnmpAgent.d/ TIMEZONE X11/
acct/ aliases@ arp@ audeventstab audomon@ auto_master
auto_parms.log auto_parms.log.old backup@ backup.cfg bcheckrc@ bootpd@
bootpquery@ bootptab btmp@ catman@ checklist@ chroot@
clri@ cmcluster/ cmcluster.conf cmom.conf conf@ convertfs@
copyright cron@ csh.login d.cshrc@ d.exrc@ d.login@
也可以以一列格式显示输出:
wangnc> ls /etc | paste -d"" -
MANPATH
PATH
SHLIB_PATH
SnmpAgent.d/
TIMEZONE
X11/
acct/
aliases@
arp@
audeventstab
audomon@
auto_master
auto_parms.log
auto_parms.log.old
backup@
backup.cfg
功能说明:合并文件的列。
语 法:paste [-s][-d ][--help][--version][文件...]
补充说明:paste指令会把每个文件以列对列的方式,一列列地加以合并。
参 数:
-d或--delimiters= 用指定的间隔字符取代跳格字符。
-s或--serial 串列进行而非平行处理。
--help 在线帮助。
--version 显示帮助信息。
列合并:
[root@rhel5 ~]# more file*
::::::::::::::
file1.txt
::::::::::::::
f
f
f
::::::::::::::
file2.txt
::::::::::::::
1
2
3
[root@rhel5 ~]# paste -d "" file1.txt file2.txt>merge.txt
[root@rhel5 ~]# more merge.txt
f1
f2
f3
来自:http://blog.itpub.net/9240380/viewspace-764820
paste '/tmp/xxy_month_1.txt' '/tmp/couter_by_moth.txt' > '/tmp/xxy_all_data.txt'
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。
粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
paste格式为:
paste -d -s -file1 file2
选项含义如下:
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @。
-s 将每个文件合并成行而不是按行粘贴。
- 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。
例子:
wangnc> pg pas1
ID897
ID666
ID982
wangnc> pg pas2
P.Jones
S.Round
L.Clip
基本paste命令将pas1和pas2两文件粘贴成两列:
wangnc> paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
通过交换文件名即可指定哪一列先粘:
wangnc> paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982
要创建不同于空格或tab键的域分隔符,使用-d选项。下面的例子用冒号做域分隔符。
wangnc> paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
要合并两行,而不是按行粘贴,可以使用-s选项。下面的例子中,第一行粘贴为ID号,第二行是名字。
wangnc> paste -s pas1 pas2
ID897 ID666 ID982
P.Jones S.Round L.Clip
paste命令还有一个很有用的选项(-)。意即对每一个(-),从标准输入中读一次数据。使用空格作域分隔符,以一个6列格式显示目录列表。方法如下:
wangnc> ls /etc | paste -d" " - - - - - -
MANPATH PATH SHLIB_PATH SnmpAgent.d/ TIMEZONE X11/
acct/ aliases@ arp@ audeventstab audomon@ auto_master
auto_parms.log auto_parms.log.old backup@ backup.cfg bcheckrc@ bootpd@
bootpquery@ bootptab btmp@ catman@ checklist@ chroot@
clri@ cmcluster/ cmcluster.conf cmom.conf conf@ convertfs@
copyright cron@ csh.login d.cshrc@ d.exrc@ d.login@
也可以以一列格式显示输出:
wangnc> ls /etc | paste -d"" -
MANPATH
PATH
SHLIB_PATH
SnmpAgent.d/
TIMEZONE
X11/
acct/
aliases@
arp@
audeventstab
audomon@
auto_master
auto_parms.log
auto_parms.log.old
backup@
backup.cfg
用\转义好像不行耶!
如:
echo "something" | awk '{print "\'"}'
时提示输入下一行,但下一行输入"
报错:
awk: cmd. line:1: {print "\}'
awk: cmd. line:1: ^ unterminated string
谁来帮小弟一把!
awk中打印单引号
碰巧要用awk生成一段sql脚本,所以涉及到在语句中打印出单引号的问题.
EG1: 当为字符串时 echo aaa | awk '{print "select * from A where name='\''TOM'\''"}'
EG2: 当为一字段时 echo TOM | awk '{print "select * from A where name='\''"$1"'\''"}'
EG3: 当为shell中变量时 key=TOM; echo aaa | awk '{print "select * from A where name='\'''$key''\''"}'
说明:把转义的单引号要用单引号括起来如 awk '{print "'\''"}'
EG1:单引-双引-单引-转义单引-单引-keyStr-单引-转义单引-单引-双引-单引
EG2:单引-双引-单引-转义单引-单引-双引-keyStr-双引-单引-转义单引-单引-双引-单引
EG2:单引-双引-单引-转义单引-单引-单引-keyStr-单引-单引-转义单引-单引-双引-单引
注意 : awk中括在双引号中的三种特殊字符不被忽略:$ , \ , ` , 即双引号会解释字符串的特别意思,而单引号直接使用字符串输出
举个栗子:
cat bok.txt |awk '{print $1" "$2" "$3" "$4 " where uid='\''"$5"'\''"}'
update object_uploadVideo set raw_file_path='/upload/video/share/XXXXXXXX-7964-11e5-803e-d43d7e0625c8.mpg' where uid='XXXXXXXX-7964-11e5-803e-d43d7e0625c8'
http://blog.oracle.com.cn/index.php/42136/viewspace-4800.html
这个哥们好像更详细:http://www.cnblogs.com/emanlee/p/3620785.html
awk输出单引号,双引号
双引号:
awk '{print "\""}' #放大:awk '{print " \" "}'
使用“”双引号把一个双引号括起来,然后用转义字符\对双引号进行转义,输出双引号。
单引号:
awk '{print "'\''"}' # 放大: awk '{print " ' \ ' ' " }'
使用一个双引号“”,然后在双引号里面加入两个单引号‘’,接着在两个单引号里面加入一个转义的单引号\',输出单引号。
uuid输出双引号包裹起来示例:
cat bok.txt |awk '{print $1" "$2" "$3" "$4 " where uid=\""$5"\""}'
update object_uploadVideo set raw_file_path='/upload/video/share/XXXXXXXX-7964-11e5-803e-d43d7e0625c8.mpg' where uid=“XXXXXXXX-7964-11e5-803e-d43d7e0625c8”
awk处理特殊字符(原创)之反引号(``),反斜杠 backslash-escaped( \ ):
http://czmmiao.iteye.com/blog/1887660
如:
echo "something" | awk '{print "\'"}'
时提示输入下一行,但下一行输入"
报错:
awk: cmd. line:1: {print "\}'
awk: cmd. line:1: ^ unterminated string
谁来帮小弟一把!
awk中打印单引号
碰巧要用awk生成一段sql脚本,所以涉及到在语句中打印出单引号的问题.
EG1: 当为字符串时 echo aaa | awk '{print "select * from A where name='\''TOM'\''"}'
EG2: 当为一字段时 echo TOM | awk '{print "select * from A where name='\''"$1"'\''"}'
EG3: 当为shell中变量时 key=TOM; echo aaa | awk '{print "select * from A where name='\'''$key''\''"}'
说明:把转义的单引号要用单引号括起来如 awk '{print "'\''"}'
EG1:单引-双引-单引-转义单引-单引-keyStr-单引-转义单引-单引-双引-单引
EG2:单引-双引-单引-转义单引-单引-双引-keyStr-双引-单引-转义单引-单引-双引-单引
EG2:单引-双引-单引-转义单引-单引-单引-keyStr-单引-单引-转义单引-单引-双引-单引
注意 : awk中括在双引号中的三种特殊字符不被忽略:$ , \ , ` , 即双引号会解释字符串的特别意思,而单引号直接使用字符串输出
举个栗子:
cat bok.txt |awk '{print $1" "$2" "$3" "$4 " where uid='\''"$5"'\''"}'
update object_uploadVideo set raw_file_path='/upload/video/share/XXXXXXXX-7964-11e5-803e-d43d7e0625c8.mpg' where uid='XXXXXXXX-7964-11e5-803e-d43d7e0625c8'
cat /tmp/xxy_month_2.txt |awk '{print "select FQQ as QQNumber,count(*) as total_times from Tbl_ExchangeHistory where FQQ='\''"$1"'\'' group by FQQ;"}';
http://blog.oracle.com.cn/index.php/42136/viewspace-4800.html
这个哥们好像更详细:http://www.cnblogs.com/emanlee/p/3620785.html
awk输出单引号,双引号
双引号:
awk '{print "\""}' #放大:awk '{print " \" "}'
使用“”双引号把一个双引号括起来,然后用转义字符\对双引号进行转义,输出双引号。
单引号:
awk '{print "'\''"}' # 放大: awk '{print " ' \ ' ' " }'
使用一个双引号“”,然后在双引号里面加入两个单引号‘’,接着在两个单引号里面加入一个转义的单引号\',输出单引号。
uuid输出双引号包裹起来示例:
cat bok.txt |awk '{print $1" "$2" "$3" "$4 " where uid=\""$5"\""}'
update object_uploadVideo set raw_file_path='/upload/video/share/XXXXXXXX-7964-11e5-803e-d43d7e0625c8.mpg' where uid=“XXXXXXXX-7964-11e5-803e-d43d7e0625c8”
awk处理特殊字符(原创)之反引号(``),反斜杠 backslash-escaped( \ ):
http://czmmiao.iteye.com/blog/1887660
每月15日24点执行某个项目:
提示报错:
"/tmp/crontab.XXXXzdHqvi":24: bad hour
errors in crontab file, can't install.
Do you want to retry the same edit? n
修改:
参考:
曾经用过的一个实例:
1月7日凌晨0点执行一个脚本!
注意些crontab脚步注意的问题参考:
http://www.jackxiang.com/post/2479/
附:每天6点自动重启
编辑/etc/crontab
#vi /etc/crontab
添加
#reboot everyday 6:00
0 6 * * * root /sbin/reboot
保存退出即可
======================================
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
Linux提示no crontab for root的解决办法:
比如运行一个脚本的时候出现错误,提示:
no crontab for root
网上也搜出了一大堆的解决办法,但是每一个是我想要的。
经过自己研究才发现解决办法很简答!就是没有crontab嘛,建一个就是咯。
解决办法:
1、登录到root用户。
2、在root下输入:crontab -e
3、可能会提示你:
no crontab for root - using an empty one
然后会叫你“Select a editor ......”下面有几个选项,就是叫你选择编辑器。我一般选 vim.tiny
4、进入crontab编辑页面之后就直接"shift+:",然后输入wq保存即可。
然后一个新的crontab就生成了!
来自:http://zhizhuofl.blog.163.com/blog/static/6991477920107524756962/
0 24 15 * * /usr/local/xxy/xxy.sh > /dev/null 2>&1
提示报错:
"/tmp/crontab.XXXXzdHqvi":24: bad hour
errors in crontab file, can't install.
Do you want to retry the same edit? n
修改:
59 23 15 * * /usr/local/xxy/xxy.sh > /dev/null 2>&1
参考:
0 2 1 * * root rm -f /tmp/* #每月1号凌晨2点,清理/tmp下的文件
0 8 6 5 * root mail robin < /home/galeki/happy.txt #每年5月6日给robin发信祝他生日快乐
0 8 6 5 * root mail robin < /home/galeki/happy.txt #每年5月6日给robin发信祝他生日快乐
曾经用过的一个实例:
0 0 07 01 * /bin/sh /usr/local/tads/htdocs/*/crontab/install.sh >/dev/null 2>&1
1月7日凌晨0点执行一个脚本!
注意些crontab脚步注意的问题参考:
http://www.jackxiang.com/post/2479/
附:每天6点自动重启
编辑/etc/crontab
#vi /etc/crontab
添加
#reboot everyday 6:00
0 6 * * * root /sbin/reboot
保存退出即可
======================================
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
Linux提示no crontab for root的解决办法:
比如运行一个脚本的时候出现错误,提示:
no crontab for root
网上也搜出了一大堆的解决办法,但是每一个是我想要的。
经过自己研究才发现解决办法很简答!就是没有crontab嘛,建一个就是咯。
解决办法:
1、登录到root用户。
2、在root下输入:crontab -e
3、可能会提示你:
no crontab for root - using an empty one
然后会叫你“Select a editor ......”下面有几个选项,就是叫你选择编辑器。我一般选 vim.tiny
4、进入crontab编辑页面之后就直接"shift+:",然后输入wq保存即可。
然后一个新的crontab就生成了!
来自:http://zhizhuofl.blog.163.com/blog/static/6991477920107524756962/
<DIV class=head_img1><IMG src="** 型动中国.files/award_04.jpg" useMap=#Map3 border=0><MAP id=Map3 name=Map3><AREA shape=RECT target=_blank coords=657,41,867,117 href="http://maestro.qq.com/con/user/act/reportzero"></MAP></DIV>
正确(IE6下面必须要0><MAP 之间没有任何字符,而firefox,IE7,8都没有问题):
如下,出现空格后有断层:(空格,回车都不行)
border=0> <MAP id=Map3
border=0>
<MAP id=Map3
最后发现:
useMap=#Map3 border=0></DIV>
useMap=#Map3 border=0>这里不能有空格</DIV>
正确(IE6下面必须要0><MAP 之间没有任何字符,而firefox,IE7,8都没有问题):
border=0><MAP id=Map3
如下,出现空格后有断层:(空格,回车都不行)
border=0> <MAP id=Map3
border=0>
<MAP id=Map3
最后发现:
useMap=#Map3 border=0></DIV>
useMap=#Map3 border=0>这里不能有空格</DIV>
<DIV class=head_img1><IMG src="**型动中国.files/award_04.jpg" useMap=#Map3 border=0><MAP id=Map3 name=Map3><AREA shape=RECT target=_blank coords=657,41,867,117 href="http://maestro.qq.com/con/user/act/reportzero"></MAP></DIV>
php > $f = 0.58;
php > var_dump(intval($f * 100));
int(57)
https://www.yidianphp.com/archives/276/
https://www.laruence.com/2013/03/26/2884.html
以下所有代码都是在PHP命令行模式下执行的。
定义浮点数
php > $a = 1.0;
php > var_dump($a);
float(1)
科学计数法定义浮点数
php > $b = 1.1e4;
php > var_dump($b);
float(11000)
php > $c = -1.1e-2;
php > var_dump($c);
float(-0.011)
注意浮点数运算的陷阱。PHP本身不能精确地表示某些浮点数,因此计算结果与预期的不同。切记不要比较浮点数是否相等。
php > var_dump(floor((0.1 + 0.7) * 10));
float(7)
php > var_dump((0.1 + 0.7) * 10 == 8.0);
bool(false)
php > var_dump((int) (0.1 + 0.7) * 10);
int(0)
php > var_dump((int) ((0.1 + 0.7) * 10));
int(7)
php > var_dump(intval($f * 100));
int(57)
https://www.yidianphp.com/archives/276/
https://www.laruence.com/2013/03/26/2884.html
以下所有代码都是在PHP命令行模式下执行的。
定义浮点数
php > $a = 1.0;
php > var_dump($a);
float(1)
科学计数法定义浮点数
php > $b = 1.1e4;
php > var_dump($b);
float(11000)
php > $c = -1.1e-2;
php > var_dump($c);
float(-0.011)
注意浮点数运算的陷阱。PHP本身不能精确地表示某些浮点数,因此计算结果与预期的不同。切记不要比较浮点数是否相等。
php > var_dump(floor((0.1 + 0.7) * 10));
float(7)
php > var_dump((0.1 + 0.7) * 10 == 8.0);
bool(false)
php > var_dump((int) (0.1 + 0.7) * 10);
int(0)
php > var_dump((int) ((0.1 + 0.7) * 10));
int(7)
调试程序发现一个bug,总结就是比较相等的问题:
"a.php" 14L, 144C written
[~]# /usr/local/php/bin/php a.php
2010-01-20equal
改为:
if($a === $b)
还是相等,奇怪了!!!
回忆未来(372647693) 15:37:37
这个问题,兄弟们是咋整的。
我姓-->苏(14044522) 15:39:01
转成字符比较
我姓-->苏(14044522) 15:40:09
你这个数有17位呀!!兄弟
膘叔(19129540) 15:40:46
哈哈。
膘叔(19129540) 15:40:56
17位。还算是int吗?
回忆未来(372647693) 15:41:02
溢出吧。呵呵
膘叔(19129540) 15:41:36
这不是BUG,这分明就是错误 。
膘叔(19129540) 15:41:50
能够让你写成这样的。分明就是错误。。。
膘叔(19129540) 15:41:56
int的范围都不知道。。。
回忆未来(372647693) 15:42:28
呵呵,批评有你,php无罪,哈哈。。
我姓-->苏(14044522) 15:42:43
长整型
回忆未来(372647693) 15:43:16
要是php提示如下:
php warning:
提示:你的位数17位。还当int比较吗?兄弟!
就好了。
膘叔(19129540) 15:43:17
bigint,要额外加载库的。
我姓-->苏(14044522) 15:44:36
.........
回忆未来(372647693) 15:44:40
咋个比较呢。那
我姓-->苏(14044522) 15:44:57
转成字符串了咯
膘叔(19129540) 15:45:21
strval
回忆未来(372647693) 15:45:31
结贴。
吉祥草(81193073) 16:37:58
$a = 61563184422810820;
这个数太大了。建议你传出来的时候就是字符串。
挖掘机<meetcode@qq.com> 16:42:16
能不能这样,穿出来是字符串
挖掘机<meetcode@qq.com> 16:42:21
比较长度
挖掘机<meetcode@qq.com> 16:42:58
长度一致,取一半儿换整比较
亾玍,IFELSE(358751844) 16:46:01
谁遇到 过这个问题
<?php
echo date("Y-m-d");
$a = 61563184422810820;
$b = 61563184422810816;
if($a == $b)
{
echo "equal";
}
else
{
echo 'not equal';
}
?>
echo date("Y-m-d");
$a = 61563184422810820;
$b = 61563184422810816;
if($a == $b)
{
echo "equal";
}
else
{
echo 'not equal';
}
?>
"a.php" 14L, 144C written
[~]# /usr/local/php/bin/php a.php
2010-01-20equal
改为:
if($a === $b)
还是相等,奇怪了!!!
回忆未来(372647693) 15:37:37
这个问题,兄弟们是咋整的。
我姓-->苏(14044522) 15:39:01
转成字符比较
我姓-->苏(14044522) 15:40:09
你这个数有17位呀!!兄弟
膘叔(19129540) 15:40:46
哈哈。
膘叔(19129540) 15:40:56
17位。还算是int吗?
回忆未来(372647693) 15:41:02
溢出吧。呵呵
膘叔(19129540) 15:41:36
这不是BUG,这分明就是错误 。
膘叔(19129540) 15:41:50
能够让你写成这样的。分明就是错误。。。
膘叔(19129540) 15:41:56
int的范围都不知道。。。
回忆未来(372647693) 15:42:28
呵呵,批评有你,php无罪,哈哈。。
我姓-->苏(14044522) 15:42:43
长整型
回忆未来(372647693) 15:43:16
要是php提示如下:
php warning:
提示:你的位数17位。还当int比较吗?兄弟!
就好了。
膘叔(19129540) 15:43:17
bigint,要额外加载库的。
我姓-->苏(14044522) 15:44:36
.........
回忆未来(372647693) 15:44:40
咋个比较呢。那
我姓-->苏(14044522) 15:44:57
转成字符串了咯
膘叔(19129540) 15:45:21
strval
回忆未来(372647693) 15:45:31
结贴。
吉祥草(81193073) 16:37:58
$a = 61563184422810820;
这个数太大了。建议你传出来的时候就是字符串。
挖掘机<meetcode@qq.com> 16:42:16
能不能这样,穿出来是字符串
挖掘机<meetcode@qq.com> 16:42:21
比较长度
挖掘机<meetcode@qq.com> 16:42:58
长度一致,取一半儿换整比较
亾玍,IFELSE(358751844) 16:46:01
谁遇到 过这个问题
背景:在做软链接时是做全路径好还是相对路径好呢,特别是Linux默认的是相对路径实现的,如下:
[root@localhost htdocs]# ls -lart /usr/lib/libmp3lame.so.0
lrwxrwxrwx 1 root root 19 Mar 28 2009 /usr/lib/libmp3lame.so.0 -> libmp3lame.so.0.0.0
.52机器:
[root@localhost lib]# ll libidn.so
lrwxrwxrwx 1 root root 28 Aug 16 2008 libidn.so -> /usr/lib64/libidn.so.11.5.19
.8机器:
[root@test lib]# ln -s libidn.so.11.5.19 libidn.so
[root@test lib]# ls -lart libidn.so
lrwxrwxrwx 1 root root 17 Dec 30 17:19 libidn.so -> libidn.so.11.5.19
如果想变成和.52一样的如何办?
于是和.52一样的了,因为用了绝对的源地址,也就是说ln的源是一个绝对地址:
[root@test lib]# ls -lart libidn.so
lrwxrwxrwx 1 root root 26 Dec 30 17:28 libidn.so -> /usr/lib/libidn.so.11.5.19
这样看,两边就都是绝对地址了:
[root@test lib]# ls -lart /usr/lib/libidn.so
lrwxrwxrwx 1 root root 26 Dec 30 17:28 /usr/lib/libidn.so -> /usr/lib/libidn.so.11.5.19
再看,如下:
[root@localhost htdocs]# ls -lart /usr/lib/libmp3lame.so.0
lrwxrwxrwx 1 root root 19 Mar 28 2009 /usr/lib/libmp3lame.so.0 -> libmp3lame.so.0.0.0
.52机器:
[root@localhost lib]# ll libidn.so
lrwxrwxrwx 1 root root 28 Aug 16 2008 libidn.so -> /usr/lib64/libidn.so.11.5.19
.8机器:
[root@test lib]# ln -s libidn.so.11.5.19 libidn.so
[root@test lib]# ls -lart libidn.so
lrwxrwxrwx 1 root root 17 Dec 30 17:19 libidn.so -> libidn.so.11.5.19
如果想变成和.52一样的如何办?
于是和.52一样的了,因为用了绝对的源地址,也就是说ln的源是一个绝对地址:
[root@test lib]# ls -lart libidn.so
lrwxrwxrwx 1 root root 26 Dec 30 17:28 libidn.so -> /usr/lib/libidn.so.11.5.19
这样看,两边就都是绝对地址了:
[root@test lib]# ls -lart /usr/lib/libidn.so
lrwxrwxrwx 1 root root 26 Dec 30 17:28 /usr/lib/libidn.so -> /usr/lib/libidn.so.11.5.19
再看,如下:
ln -s mhxy2010hn.act/view/ mhxy2010hn.act_view
ln -s mhxy2010hn.act/view/ mhxy2010hn.act_view/
好像不太一样。。。
ln -s mhxy2010hn.act/view/ mhxy2010hn.act_view/
好像不太一样。。。
http://www.babytree.com/topic/xiaoerxunmazhen
http://www.babytree.com/forum/topic_14170
http://www.google.cn/search?hl=zh-CN&newwindow=1&q=%E5%B0%8F%E5%84%BF%E8%8D%A8%E9%BA%BB%E7%96%B9%E7%97%87%E7%8A%B6%E5%8F%8A%E6%B2%BB%E7%96%97&aq=0&oq=%E5%B0%8F%E5%84%BF%E8%8D%A8%E9%BA%BB%E7%96%B9
http://www.baidu.com/s?bs=%D0%A1%B6%F9%DD%A1%C2%E9%D5%EE%D6%A2%D7%B4&f=8&wd=%D0%A1%B6%F9%DD%A1%C2%E9%D5%EE%D6%A2%D7%B4%BC%B0%C6%E4%D6%CE%C1%C6
http://www.babytree.com/forum/topic_14170
http://www.google.cn/search?hl=zh-CN&newwindow=1&q=%E5%B0%8F%E5%84%BF%E8%8D%A8%E9%BA%BB%E7%96%B9%E7%97%87%E7%8A%B6%E5%8F%8A%E6%B2%BB%E7%96%97&aq=0&oq=%E5%B0%8F%E5%84%BF%E8%8D%A8%E9%BA%BB%E7%96%B9
http://www.baidu.com/s?bs=%D0%A1%B6%F9%DD%A1%C2%E9%D5%EE%D6%A2%D7%B4&f=8&wd=%D0%A1%B6%F9%DD%A1%C2%E9%D5%EE%D6%A2%D7%B4%BC%B0%C6%E4%D6%CE%C1%C6
/usr/local/mysql/bin/mysqld_safe --user=root &
/usr/local/mysql/bin/mysqld_safe --user=mysql &
/usr/local/mysql/bin/mysqld_safe --user=mysql &
刚刚安装好MySQL后,是支持innodb引擎的,可是当我将缺省的my.cnf做了修改以后,发现innodb不可用了。查看错误日志,显示 innodb日志文件大小不合适。遂删除之,并重启MySQL后,依然无法开启innodb。一气之下,干脆执行了以下操作:
引用
cd /home/mysql/data/
rm ib*
/usr/local/mysql/mysqld restart
问题解决,innodb可用了。不知道在生产环境中,如果更改了innodb相关参数,是不是也要删除innodb相关数据文件,如果真是那样的话就太糟了。改天在模拟生产环境中试试。
引用
cd /home/mysql/data/
rm ib*
/usr/local/mysql/mysqld restart
问题解决,innodb可用了。不知道在生产环境中,如果更改了innodb相关参数,是不是也要删除innodb相关数据文件,如果真是那样的话就太糟了。改天在模拟生产环境中试试。
查看有关“mysql”的文章">mysql和postgresql都是非常好的开源数据库,在这里我们不讨论谁优谁劣。因为简单粗暴靠几个参数去判断好坏,还是对技术的不负责。不同的生产环境和不同的应用,选择最匹配的数据库才是架构师的责任,而不是一味追求新颖、牛B,更没有必要去追求功能越多越强。
下面是一片07年的文章,尽管现在Mysql已经是5.X了,也多了事务的支持;尽管postgresql8.x了,对windows的支持也今非昔比;但是任何一个软件都有他积累过程和核心优势,我想仍然非常的借鉴意义。 如何结合自己的需求用好每一种数据库的优势,这才是一个架构师明智的选择。
适合的才是最好的。
一、前言
在这篇文章中,我们选用MySQL 4.0.2-alpha与PostgreSQL 7.2进行比较,因为MySQL 4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。
我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。
二、两者的共同优势
这两个产品都属于开放源码的一员,性能和功能都在高速地提高和增强。MySQL AB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择。
三、两者不同的背景
MySQL的背后是一个成熟的商业公司,而PostgreSQL的背后是一个庞大的志愿开发组。这使得MySQL的开发过程更为慎重,而PostgreSQL的反应更为迅速。这样的两种背景直接导致了各自固有的优点和缺点。
四、MySQL的主要优点
1、首先是速度,MySQL通常要比PostgreSQL快得多。MySQL自已也宣称速度是他们追求的主要目标之一,基于这个原因,MySQL在以前的文档中也曾经说过并不准备支持事务和触发器。但是在最新的文档中,我们看到 MySQL 4.0.2-alpha已经开始支持事务,而且在MySQL的TODO中,对触发器、约束这样的注定会降低速度的功能也列入了日程。但是,我们仍然有理由相信,MySQL将有可能一直保持速度的优势。
2、MySQL比PostgreSQL更流行,流行对于一个商业软件来说,也是一个很重要的指标,流行意味着更多的用户,意味着经受了更多的考验,意味着更好的商业支持、意味着更多、更完善的文档资料。
3、与PostgreSQL相比,MySQL更适宜在Windows环境下运行。 MySQL作为一个本地的Windows应用程序运行(在NT/Win2000/WinXP下,是一个服务),而PostgreSQL是运行在 Cygwin模拟环境下。PostgreSQL在Windows下运行没有MySQL稳定,应该是可以想象的。
4、MySQL使用了线程,而PostgreSQL使用的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。
5、MySQL可以适应24/7运行。在绝大多数情况下,你不需要为MySQL运行任何清除程序。PostgreSQL目前仍不完全适应24/7运行,这是因为你必须每隔一段时间运行一次VACUUM。
6、MySQL在权限系统上比PostgreSQL某些方面更为完善。 PostgreSQL只支持对于每一个用户在一个数据库上或一个数据表上的INSERT、SELECT和UPDATE/DELETE的授权,而MySQL 允许你定义一整套的不同的数据级、表级和列级的权限。对于列级的权限,PostgreSQL可以通过建立视图,并确定视图的权限来弥补。MySQL还允许你指定基于主机的权限,这对于目前的PostgreSQL是无法实现的,但是在很多时候,这是有用的。
7、由于MySQL 4.0.2-alpha开始支持事务的概念,因此事务对于MySQL不再仅仅成为劣势。相反,因为MySQL保留无事务的表类型。这就为用户提供了更多的选择。
8、MySQL的MERGE表提供了一个独特管理多个表的方法。
9、MySQL的myisampack可以对只读表进行压缩,此后仍然可以直接访问该表中的行。
五、PostgreSQL的主要优点:
1、对事务的支持与MySQL相比,经历了更为彻底的测试。对于一个严肃的商业应用来说,事务的支持是不可或缺的。
2、MySQL对于无事务的MyISAM表。采用表锁定,一个长时间运行的查询很可能会长时间地阻碍对表的更新。而PostgreSQL不存在这样的问题。
3、PostgreSQL支持存储过程,而目前MySQL不支持,对于一个严肃的商业应用来说,作为数据库本身,有众多的商业逻辑的存在,此时使用存储过程可以在较少地增加数据库服务器的负担的前提下,对这样的商业逻辑进行封装,并可以利用数据库服务器本身的内在机制对存储过程的执行进行优化。此外存储过程的存在也避免了在网络上大量的原始的SQL语句的传输,这样的优势是显而易见的。
4、对视图的支持,视图的存在同样可以最大限度地利用数据库服务器内在的优化机制。而且对于视图权限的合理使用,事实上可以提供行级别的权限,这是MySQL的权限系统所无法实现的。
5、对触发器的支持,触发器的存在不可避免的会影响数据库运行的效率,但是与此同时,触发器的存在也有利于对商业逻辑的封装,可以减少应用程序中对同一商业逻辑的重复控制。合理地使用触发器也有利于保证数据的完整性。
6、对约束的支持。约束的作用更多地表现在对数据完整性的保证上,合理地使用约束,也可以减少编程的工作量。
7、对子查询的支持。虽然在很多情况下在SQL语句中使用子查询效率低下,而且绝大多数情况下可以使用带条件的多表连接来替代子查询,但是子查询的存在在很多时候仍然不可避免。而且使用子查询的SQL语句与使用带条件的多表连接相比具有更高的程序可读性。
8、支持R-trees这样可扩展的索引类型,可以更方便地处理一些特殊数据。
9、PostgreSQL可以更方便地使用UDF(用户定义函数)进行扩展。
六、那么我究竟应该使用MySQL还是PostgreSQL
这个问题很难说得清,而且事实上除了MySQL和PostgreSQL外,使用Oracle、Sybase、Informix等也是明智的选择。如何你确定只在MySQL和PostgreSQL中进行选择,以下规则总是有效的。
1、如果你的操作系统是Windows,你应该使用MySQL。
2、如果你对数据库并不了十分了解,甚至不知道事务、存储过程等究竟是什么,你应该使用MySQL。
3、如果你的应用对数据的完整性和严肃性要求不高,但是追求处理的高速度。例如是一个论坛和社区,你应该使用MySQL。
4、你的应用是一个严肃的商业应用,对数据完整性要求很高。而且你希望对一些商业数据逻辑进行很好的封装,例如是一个网上银行,你应该使用PostgreSQL。
5、你的应用处理的是地理数据,由于R-TREES的存在,你应该使用PostgreSQL。
6、你是一个数据库内核的狂热爱好者,你甚至希望拥有你自己版本的数据库,毫无疑问,你必须使用PostgreSQL,没准下一个PostgreSQL版本中某一个模块的作者就是你。
下面是一片07年的文章,尽管现在Mysql已经是5.X了,也多了事务的支持;尽管postgresql8.x了,对windows的支持也今非昔比;但是任何一个软件都有他积累过程和核心优势,我想仍然非常的借鉴意义。 如何结合自己的需求用好每一种数据库的优势,这才是一个架构师明智的选择。
适合的才是最好的。
一、前言
在这篇文章中,我们选用MySQL 4.0.2-alpha与PostgreSQL 7.2进行比较,因为MySQL 4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利。
我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切。对于一个成熟的数据库,稳定性肯定会日益提供。而随着硬件性能的飞速提高,速度也不再是什么太大的问题。
二、两者的共同优势
这两个产品都属于开放源码的一员,性能和功能都在高速地提高和增强。MySQL AB的人们和PostgreSQL的开发者们都在尽可能地把各自的数据库改得越来越好,所以对于任何商业数据库使用其中的任何一个都不能算是错误的选择。
三、两者不同的背景
MySQL的背后是一个成熟的商业公司,而PostgreSQL的背后是一个庞大的志愿开发组。这使得MySQL的开发过程更为慎重,而PostgreSQL的反应更为迅速。这样的两种背景直接导致了各自固有的优点和缺点。
四、MySQL的主要优点
1、首先是速度,MySQL通常要比PostgreSQL快得多。MySQL自已也宣称速度是他们追求的主要目标之一,基于这个原因,MySQL在以前的文档中也曾经说过并不准备支持事务和触发器。但是在最新的文档中,我们看到 MySQL 4.0.2-alpha已经开始支持事务,而且在MySQL的TODO中,对触发器、约束这样的注定会降低速度的功能也列入了日程。但是,我们仍然有理由相信,MySQL将有可能一直保持速度的优势。
2、MySQL比PostgreSQL更流行,流行对于一个商业软件来说,也是一个很重要的指标,流行意味着更多的用户,意味着经受了更多的考验,意味着更好的商业支持、意味着更多、更完善的文档资料。
3、与PostgreSQL相比,MySQL更适宜在Windows环境下运行。 MySQL作为一个本地的Windows应用程序运行(在NT/Win2000/WinXP下,是一个服务),而PostgreSQL是运行在 Cygwin模拟环境下。PostgreSQL在Windows下运行没有MySQL稳定,应该是可以想象的。
4、MySQL使用了线程,而PostgreSQL使用的是进程。在不同线程之间的环境转换和访问公用的存储区域显然要比在不同的进程之间要快得多。
5、MySQL可以适应24/7运行。在绝大多数情况下,你不需要为MySQL运行任何清除程序。PostgreSQL目前仍不完全适应24/7运行,这是因为你必须每隔一段时间运行一次VACUUM。
6、MySQL在权限系统上比PostgreSQL某些方面更为完善。 PostgreSQL只支持对于每一个用户在一个数据库上或一个数据表上的INSERT、SELECT和UPDATE/DELETE的授权,而MySQL 允许你定义一整套的不同的数据级、表级和列级的权限。对于列级的权限,PostgreSQL可以通过建立视图,并确定视图的权限来弥补。MySQL还允许你指定基于主机的权限,这对于目前的PostgreSQL是无法实现的,但是在很多时候,这是有用的。
7、由于MySQL 4.0.2-alpha开始支持事务的概念,因此事务对于MySQL不再仅仅成为劣势。相反,因为MySQL保留无事务的表类型。这就为用户提供了更多的选择。
8、MySQL的MERGE表提供了一个独特管理多个表的方法。
9、MySQL的myisampack可以对只读表进行压缩,此后仍然可以直接访问该表中的行。
五、PostgreSQL的主要优点:
1、对事务的支持与MySQL相比,经历了更为彻底的测试。对于一个严肃的商业应用来说,事务的支持是不可或缺的。
2、MySQL对于无事务的MyISAM表。采用表锁定,一个长时间运行的查询很可能会长时间地阻碍对表的更新。而PostgreSQL不存在这样的问题。
3、PostgreSQL支持存储过程,而目前MySQL不支持,对于一个严肃的商业应用来说,作为数据库本身,有众多的商业逻辑的存在,此时使用存储过程可以在较少地增加数据库服务器的负担的前提下,对这样的商业逻辑进行封装,并可以利用数据库服务器本身的内在机制对存储过程的执行进行优化。此外存储过程的存在也避免了在网络上大量的原始的SQL语句的传输,这样的优势是显而易见的。
4、对视图的支持,视图的存在同样可以最大限度地利用数据库服务器内在的优化机制。而且对于视图权限的合理使用,事实上可以提供行级别的权限,这是MySQL的权限系统所无法实现的。
5、对触发器的支持,触发器的存在不可避免的会影响数据库运行的效率,但是与此同时,触发器的存在也有利于对商业逻辑的封装,可以减少应用程序中对同一商业逻辑的重复控制。合理地使用触发器也有利于保证数据的完整性。
6、对约束的支持。约束的作用更多地表现在对数据完整性的保证上,合理地使用约束,也可以减少编程的工作量。
7、对子查询的支持。虽然在很多情况下在SQL语句中使用子查询效率低下,而且绝大多数情况下可以使用带条件的多表连接来替代子查询,但是子查询的存在在很多时候仍然不可避免。而且使用子查询的SQL语句与使用带条件的多表连接相比具有更高的程序可读性。
8、支持R-trees这样可扩展的索引类型,可以更方便地处理一些特殊数据。
9、PostgreSQL可以更方便地使用UDF(用户定义函数)进行扩展。
六、那么我究竟应该使用MySQL还是PostgreSQL
这个问题很难说得清,而且事实上除了MySQL和PostgreSQL外,使用Oracle、Sybase、Informix等也是明智的选择。如何你确定只在MySQL和PostgreSQL中进行选择,以下规则总是有效的。
1、如果你的操作系统是Windows,你应该使用MySQL。
2、如果你对数据库并不了十分了解,甚至不知道事务、存储过程等究竟是什么,你应该使用MySQL。
3、如果你的应用对数据的完整性和严肃性要求不高,但是追求处理的高速度。例如是一个论坛和社区,你应该使用MySQL。
4、你的应用是一个严肃的商业应用,对数据完整性要求很高。而且你希望对一些商业数据逻辑进行很好的封装,例如是一个网上银行,你应该使用PostgreSQL。
5、你的应用处理的是地理数据,由于R-TREES的存在,你应该使用PostgreSQL。
6、你是一个数据库内核的狂热爱好者,你甚至希望拥有你自己版本的数据库,毫无疑问,你必须使用PostgreSQL,没准下一个PostgreSQL版本中某一个模块的作者就是你。
一直以来,我的项目使用 PHP + MySQL-InnoDB 来提供事务安全的应用服务,目前运行的比较良好。
但最近突然对 PostgreSQL 感了兴趣,就查了很多相关资料,总结下来,呈现 PostgreSQL 比 MySQL 强的多这么一个结论。但是大部分能查到的评论都出自几年前,那个时候的 MySQL 被戏称为玩具数据库。重要的是,MySQL 这几年的发展十分迅速,提供了很多商业数据库必不可少的功能特性,从我这个对 PostgreSQL 不是很了解的角度来看,两者对于我的应用而言,差别已经不是很大了。
其实心中还有这么一个情结:总觉得采用 BSD 许可证,和同样是出自加州伯克利分校的 PostgreSQL,能够更好的在 FreeBSD 上面运行。因为 MySQL 是 Linux 阵营的东西,所以作为 FreeBSD 的忠实用户,不免心中会有拥护 PostgreSQL 而排挤 MySQL 的情绪~~
但产品终究是用来应用的,所以希望大家能针对这两款数据库,结合当下最新的状况,对其在 FreeBSD 下的运行特性,做一些建设性的讨论~~
我是从去年12月与老板沟通后才开始打算将系统逐步向postgresql迁移,之前的数据库有ms sql,mysql。自从我逐步开始迁移到debian+postgresql8.3.7系统之后,到目前为止,尚无什么问题,运行一直都很稳定。
还有一点,很多习惯用mysql的人总喜欢用postgresql的进程访问方式为诟病,其实我个人认为这完全是对unix/linux的进程和线程历史理解的缺乏。据我个人所知,oralce在windows中采用了线程访问方式,这主要是windows中进程的上下文切换的代价要远远比 unix/linux大的多。而oracle在unix/linux则推荐使用进程方式,进程方式拥有高得多的可靠性和数据完整性,因为一个Oracle 进程不可能污染另一个Oracle进程的地址空间,此外oracle的进程方式反而能够稍微更好的提升性能。除此之外,有过unix/linux开发的都知道一些,就是unix包括freebsd中的线程在kernel中实际是一种变相的进程方式运行,只有linux2.6内核以后的线程才开始似乎摆脱了这种情况与进程独立开来。此外在真正的系统运行过程中,难道有人真的会傻的认为1000个线程的并发访问性能会高于2个进程?姑且不说别的,单就2.6的 linux内核创建posix 线程的时候,默认为线程预留2M内存,100线程就开始占用200M内存(当然这个可以调节),此外100线程的上下文切换带来的性能损失远远高于预想的代价。尤其面对大多数高并发的数据库访问,都采用类似数据库连接池方式,在此方式中,如果访问突破某个阀值点,越是高并发,持续时间越久,多cpu,反而越是进程的性能,稳定优势开始集中体现出来。
往往很多人的测试都还在这个阀值点之下,随便写个test程序发布上去搞搞测试,就天天叫嚣着进程如何如何不好。这种才是糊弄一批人。
网上有人比较了lighttpd 的 fastcgi 的进程和线程访问方式,他利用高并发详细测试进程和线程在不同情况下的情况,这其实跟数据库这种方式类似,希望以后客观的说明不要再误导人了。
甚至有次我看到某人疑问,1000客户端访问那难道数据库要启动1000个进程?某人借此来论述postgresql的进程模型如何不好不好。当时正在喝水,我差点都要喷出来。
我想即便是线程模型,也不会傻到1000个客户端连接上来,去启动1000个线程。1000个线程即便启动了,上下文的切换一损耗,说不定还不如2线程跑得快。
postgresql是一个很不错的优秀数据库,我最近也在尝试看他的源码,觉得甚有感触。虽然他的进程模型目前尚没有表现出来最强的优势,但这绝不是进程模型的问题。
我主导的几个系统运行在debian+postgresql+Ice平台上,服务端足够的高并发访问,那核心是基于socket访问的,一直很稳定,我真不知道某些人的疑问从何而来
的确,MySQL 是最快的。
正因为 MyISAM 不支持事务,所以 MySQL 后来引入了 InnoDB。
最新版的 MySQL 已经支持 MyISAM 里的外键,InnoDB 的效率也在提升。个人认为,MySQL 完全可以胜任业务需求,在需要事务安全的部位使用 InnoDB 引擎,其它要求性能的地方可以用 MyISAM。
但最近突然对 PostgreSQL 感了兴趣,就查了很多相关资料,总结下来,呈现 PostgreSQL 比 MySQL 强的多这么一个结论。但是大部分能查到的评论都出自几年前,那个时候的 MySQL 被戏称为玩具数据库。重要的是,MySQL 这几年的发展十分迅速,提供了很多商业数据库必不可少的功能特性,从我这个对 PostgreSQL 不是很了解的角度来看,两者对于我的应用而言,差别已经不是很大了。
其实心中还有这么一个情结:总觉得采用 BSD 许可证,和同样是出自加州伯克利分校的 PostgreSQL,能够更好的在 FreeBSD 上面运行。因为 MySQL 是 Linux 阵营的东西,所以作为 FreeBSD 的忠实用户,不免心中会有拥护 PostgreSQL 而排挤 MySQL 的情绪~~
但产品终究是用来应用的,所以希望大家能针对这两款数据库,结合当下最新的状况,对其在 FreeBSD 下的运行特性,做一些建设性的讨论~~
我是从去年12月与老板沟通后才开始打算将系统逐步向postgresql迁移,之前的数据库有ms sql,mysql。自从我逐步开始迁移到debian+postgresql8.3.7系统之后,到目前为止,尚无什么问题,运行一直都很稳定。
还有一点,很多习惯用mysql的人总喜欢用postgresql的进程访问方式为诟病,其实我个人认为这完全是对unix/linux的进程和线程历史理解的缺乏。据我个人所知,oralce在windows中采用了线程访问方式,这主要是windows中进程的上下文切换的代价要远远比 unix/linux大的多。而oracle在unix/linux则推荐使用进程方式,进程方式拥有高得多的可靠性和数据完整性,因为一个Oracle 进程不可能污染另一个Oracle进程的地址空间,此外oracle的进程方式反而能够稍微更好的提升性能。除此之外,有过unix/linux开发的都知道一些,就是unix包括freebsd中的线程在kernel中实际是一种变相的进程方式运行,只有linux2.6内核以后的线程才开始似乎摆脱了这种情况与进程独立开来。此外在真正的系统运行过程中,难道有人真的会傻的认为1000个线程的并发访问性能会高于2个进程?姑且不说别的,单就2.6的 linux内核创建posix 线程的时候,默认为线程预留2M内存,100线程就开始占用200M内存(当然这个可以调节),此外100线程的上下文切换带来的性能损失远远高于预想的代价。尤其面对大多数高并发的数据库访问,都采用类似数据库连接池方式,在此方式中,如果访问突破某个阀值点,越是高并发,持续时间越久,多cpu,反而越是进程的性能,稳定优势开始集中体现出来。
往往很多人的测试都还在这个阀值点之下,随便写个test程序发布上去搞搞测试,就天天叫嚣着进程如何如何不好。这种才是糊弄一批人。
网上有人比较了lighttpd 的 fastcgi 的进程和线程访问方式,他利用高并发详细测试进程和线程在不同情况下的情况,这其实跟数据库这种方式类似,希望以后客观的说明不要再误导人了。
甚至有次我看到某人疑问,1000客户端访问那难道数据库要启动1000个进程?某人借此来论述postgresql的进程模型如何不好不好。当时正在喝水,我差点都要喷出来。
我想即便是线程模型,也不会傻到1000个客户端连接上来,去启动1000个线程。1000个线程即便启动了,上下文的切换一损耗,说不定还不如2线程跑得快。
postgresql是一个很不错的优秀数据库,我最近也在尝试看他的源码,觉得甚有感触。虽然他的进程模型目前尚没有表现出来最强的优势,但这绝不是进程模型的问题。
我主导的几个系统运行在debian+postgresql+Ice平台上,服务端足够的高并发访问,那核心是基于socket访问的,一直很稳定,我真不知道某些人的疑问从何而来
的确,MySQL 是最快的。
正因为 MyISAM 不支持事务,所以 MySQL 后来引入了 InnoDB。
最新版的 MySQL 已经支持 MyISAM 里的外键,InnoDB 的效率也在提升。个人认为,MySQL 完全可以胜任业务需求,在需要事务安全的部位使用 InnoDB 引擎,其它要求性能的地方可以用 MyISAM。