原文是Multiple column index vs multiple indexes

对于要经常查询的含量大量数据的数据库,建立索引是非常重要的,建立索引一般都是在where语句用得较多的列上。现在有个问题,如果一个表有多个列需要建立索引,是把所有列建成一个索引,还是对每一个列建一个索引,上篇文章做了一个介绍,这是作者得出的结论,Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.意思应该是说对多个列建索引比对每个列分别建索引更有优势,而且要知道索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。

这是一个多列索引的问题,这个问题是如何安排列的顺序是至关重要的,比如需要对一个表里面的两个字段uid, rstatus建一个索引,那么索引的顺序是(uid, rstatus)还是(rstatus, uid)呢。在搞清楚如何安排顺序之前先了解一个概念,cardinality:金山的翻译是"集的势",比如,Mytest表有1700条记录,rstatus字段有750个不同的记录,那么就可以说We have a cardinality of 750 for rstatus。总的规则可以说是cardinality越大的字段应该排在索引的第一位就是说索引的位置是(rstatus, uid),因为cardinality越大那么第一次取出来的记录集就越小,再进行第二次查询的次数就越少了。不过这只是对于建两个索引的规则,如果是三个以上就没有那么简单了,具体地看原文,有比较详细的例子。还需要提出的是即使我们建了一个很有效的索引,但是查询优化器也许会选择不用它,如果它会考虑更多因素以决定这个索引是否有足够的效率。

It was also pointed out to me, that even if an efficient multi-column index is created, the query optimizer may choose to never use it. This is
because the optimizer looks at further statistics to determine if the index would be efficient enough or not.



官方文档:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

老外的博客:

http://blog.decaresystems.ie/index.php/2007/05/21/how-to-create-a-successful-multi-column-index-from-first-principals/ 也有比较详细的介绍mysql如何使用联合索引的!

我试了一下将建立联合索引的顺序变化为KEY `u_r` (rstatus,`uid`) 出现:ref  key_len 都有变化,如下:

mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | mytest | range | u_r           | u_r  | 8       | NULL |    2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.03 sec)

mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 3, 1);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `mytest` (`id`, `uid`, `rstatus`) VALUES(null, 4, 1);
Query OK, 1 row affected (0.00 sec)

mysql> explain select * from mytest where uid in (1,2) and rstatus = 1;
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | mytest | range | u_r           | u_r  | 8       | NULL |    2 | Using where |
+----+-------------+--------+-------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select * from mytest where uid in (3,4) and rstatus = 1;
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | mytest | ref  | u_r           | u_r  | 4       | const |    1 | Using where |
+----+-------------+--------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)

老外原文:

Conclusion: For benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table picking only one index on the pair.



   我估计是对多个列建索引比对每个列分别建索引更有优势,mysql会根据最好的平均效率选取需不需要索引,如Mysql分析发现不用索引更快那就不必用到索引了!

in适用于外表大内表小的情况!与数据的多少也很有关系的!

传说中FreeBSD比linux稳定,大型网站几乎都建立在FreeBSD系统上,我一直疑惑难道linux是否真的不能做大型网站。于是用netcraft网站做了个测试:

http://toolbar.netcraft.com/site_report?url=www.phpchina.com
按照上面的链接你就可以查询任何一个网站的服务器架构,当然,可信度和准确度我不能保证。下面是我测试的案例:

www.phpchina.com清一色linux;
www.tencent.com清一色linux;
www.qq.com清一色linux;
www.taobao.com linux;
www.ebay.com.cn 查询显示OS清一色linux,WebServer清一色IIS,令人费解;
www.alibaba.com 清一色linux;
www.bokee.com清一色的linux;
www.google.com清一色linux;
www.pconline.com.cn linux;
www.yninfo.com清一色的linux;
www.tom.com 清一色Debian;
www.cctv.com linux+sun的服务器;
www.126.com 清一色linux
www.163.com清一色linux,大家或许都认为网易是使用FreeBSD的,

但163/126就全部用上了linux,令人费解。

   看来用linux做大站的也不少啊!!!谁说linux不能做大站呢?

  另外又发现两个奇怪的东东:
www.ebay.com 居然清一色的win2000!!!
http://www.myspace.com 全美访问量第一,居然也清一色的win2003;

    在我印象中,大型网站是压根不能用windos系统的。但这两个案例给我的理论一个有力的回击:系统稳定与否,关键还是在人!
    无论是Windows还是FreeBSD还是Linux都可以做大型网站,只要人足够牛X就行。这里不谈windows了,还是从大家口水仗打得最厉害的linux和freebsd分析分析吧。
    首先说明一点:为什么不拿linux和windows比较,而只是和freebsd比较呢?答案在于linux或是freebsd都感觉到了对方带来的压力,都认定对方是自己的竞争对手。既然称得上是对手,自然是各有所长,难分轩轾,谁也不能把谁压倒罢了。

    论坛里争论FreeBSD和linux谁谁更好,其实是从一个静态的角度来看的,在某个特定时间里,FreeBSD或许比linux更稳定,linux或许比FreeBSD更快捷,但两家都在动态发展,没有谁永远领先,没有谁永远落后,FreeBSD稳定的特性,Linux2.6可以超越它;而linux 快捷的优势,FreeBSD也会迅速居上。我就不信,linus和他的黑客团队在技术上会输给学院派的FreeBSD团队?或者FreeBSD的高手们比不上一群黑客,?他们谁都可以暂时领先,谁都可以暂时落后,但谁都不是吃干饭的!

    目前流行这么一种传说:linux和freebsd内核性能上相比:linux2.2比freebsd要差,linux2.4和freebsd难分伯仲,而linux2.6比freebsd好得多。这里freebsd被静态化了,以一个动态发展的linux去比较某个固定版本的freebsd,显然是有失公平的。有道是:士别三日,即更刮目相看,更何况是技术日新月异的IT行业!
    又有这么一种说法:LINUX被黑的多而FreeBSD被黑的少,盖出于安全性较逊?这也是无稽之谈,用liunx的人基数比freebsd大,菜鸟自然也就更多了。系统安不安全关键在人,如果你不信,可以尝试去黑一下www.ebay.com或www.myspace.com,他们的服务器可都是windows哟。

    其实两家最根本的差别不在技术,而在于设计理念:linux不求最稳,但求最新;FreeBSD不求最新,只求最稳——这样说也许不对,但也能反映一些问题。
    我对FreeBSD与Linux比较的最终结论是:谁好谁稳定都只是暂时的,两家的存在状态,是一个“既生瑜何生亮”的问题,在长久的发展过程中,技术上的常胜将军并不存在,双方只有此消彼长,各领风骚。至于大家为什么非要证明FreeBSD比Linux好或Linux比FreeBSD好,我想程序员普遍都喜欢追求完美,非要用最好最完美的系统才甘心吧!
   FreeBSD和Linux我都用过,不在超大型应用中,很难感受两者的差别。个人选择的linux,考虑到使用linux的人比较多,商机自然也就更多吧,钱在哪眼光就看哪,至少linux的就业机会比FreeBSD多。当然,这是非技术因素的考虑了。

------------------------------------------------------------------------------------------------------
51NET以太网开发板(豪华版):http://www.hificat.com/net_2/net_photo.asp
我看了一下产品介绍提问如下(6个):


1.继电器的电流低了点(10A/250VAC),能否做成(15A/250VAC)的?

2.cpu是40M赫兹的w78E58bp-40,能匹配稍微大点吗?

3.32k源程序编译空间的代码,大体靠谱估算了一下有1200行的代码量,能否扩展为64k?

4.偶然出现忽然断电,会不会冲击板子的电器元件,如果无给个好的解决方案也行!

5.Ds18B20是一个在温度液晶显示一个温度,可否做一个demo程序为:ds18B20多个(16个),在液晶并排显示为16个的温度,并结合16路控制继电器的来通段,如果这个不好回答,回答能否在该板实现也可.

6.板子的维修问题?保修多长时间,过保修后,可否返修?付费问题!












GNOME 是一个用户界面友好的桌面环境,能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态),一个桌面(存放数据和应用程序的地方),一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。
安装 GNOME的最简单的方法是在FreeBSD安装过程中通过 “Desktop Configuration”菜单来进行。它们也可以很容易地从一个package或Ports Collection安装:要从网络安装GNOME,只要键入: # pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: # cd /usr/ports/x11/gnome2 # make install clean 一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。如果没有对配置文件做过什么特殊的改动, 只需简单地键入: % echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startx, GNOME桌面环境就启动了。
Note: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。而是,用同样的命令创建一个可执行文件.xsession。要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令: % echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession 另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节会解释如何使用kdm, KDE显示管理器来做。
X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状, 最佳对比度,或者像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为1。
1.安装CVSUP:
最好在安装时装好cvsup;

freebsd# cd /usr/ports/net/cvsup-without-gui/
freebsd# make install clean

2.升组源码:
freebsd# ee /usr/share/examples/cvsup/stable-supfile
把:
default host=CHANGE_THIS.FreeBSD.org
改为:
default host=cvsup.FreeBSDchina.org

freebsd# cvsup -g -L 2 /usr/share/examples/cvsup/stable-supfile
freebsd# cd /usr/obj
freebsd# chflags -R noschg *
freebsd# rm -rf *

3.重新编译源码和内核

freebsd# cd /usr/src
freebsd# make buildworld
freebsd# make buildkernel KERNCONF=freebsd
freebsd# make installkernel KERNCONF=freebsd
reboot

4.重新登陆系统进入单用户模式
启动时boot -s

# adjkerntz -i         //调整内核时区
# fsck -p              //整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题
# mount -u /           //装载根分区
# mount -a -t ufs      //装载所有的ufs分区
# swapon -a            //启动虚拟内存,打开交换空间
# mergemaster -p       //选择YES
# cd /usr/src
# make installworld
# mergemaster          //要安装的全选"i"
# reboot

源码和内核升级完毕
写了一个批量自动上传下载文件的小工具。 特点:

   1. 文件名中可包含日期如TEST20070212.txt
   2. 可多次运行,不会重复处理已成功的条目
   3. 配置方便,异常处理完善

想来今后或许还用得上,所以放在这里晒一下。好不好用各位试下就知道了。 myftp.sh内容如下:


#!/bin/bash
#Author: Robin Guo

DATE_YYYYMMDD=`date +%Y%m%d`
DATE_YYMMDD=`date +%y%m%d`
DATE_YYYY_MM_DD=`date +%Y-%m-%d`

#日志文件~/log/YYYYMMDD.LOG
FTP_LOG=~/log/${DATE_YYYYMMDD}.LOG

#Function ftp_download
#Example:
#ftp_download ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/config.test config.test
ftp_download()
{
if [ "$#" = "2" ]
then
if [ -f $2 ]
then
#文件已存在,说明上次下载已成功,可跳过
echo "INFO : $2 exists" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO   : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 $1 -o $2 > /dev/null  2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
echo "INFO : downlaod $1 is ok" | tee -a $FTP_LOG
touch $2 > /dev/null 2>&1
else
echo "ERROR: download $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
rm -f $2 > /dev/null 2>&1
fi
fi
echo "" | tee -a $FTP_LOG
fi
}

#Function ftp_upload
#Example:
#ftp_upload uploadfile.txt ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/upload.txt

ftp_upload()
{
if [ "$#" = "2" ]
then
if [ -f $1 ]
then
if [ -f $1.ok ]
then
#“文件.ok”存在,说明上次已成功上传,可跳过
echo "INFO : already upload $1" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO   : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 -T $1 $2 > /dev/null  2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
#上传成功,做标记
touch  ${1}.ok > /dev/null 2>&1
echo "INFO : upload $1 is ok" | tee -a $FTP_LOG
else
echo "ERROR: upload $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
fi
fi
else
echo "ERROR: upload failed. $1 not exists." | tee -a $FTP_LOG
fi
echo "" | tee -a $FTP_LOG
fi
}

date "+%y-%m-%d %H:%M" | tee -a $FTP_LOG

if [ "$#" != "1" ]
then
echo "Usage: ftp.sh ftp.cfg"
exit 1
fi

FTP_CONFIG=$1
if [ -f $FTP_CONFIG ]
then
echo "INFO : Config File: $FTP_CONFIG" | tee -a $FTP_LOG
echo "" | tee -a $FTP_LOG
else
echo "ERROR: Config File $FTP_CONFIG not exist" | tee -a $FTP_LOG
exit 1
fi

killall curl > /dev/null 2>&1

#从配置中读取条目
while read V_SYSID V_FILE_NAME V_DIRE V_REMOTE_PATH V_LOCAL_PATH
do
FIRST_CHAR=${V_SYSID:0:1}
if [ "$FIRST_CHAR" != "#" ]
then
#展开文件名中的日期段
FILE_NAME=${V_FILE_NAME}
FILE_NAME=${FILE_NAME/\$YYYYMMDD\$/$DATE_YYYYMMDD}     # $YYYYMMDD$ to 20070120
FILE_NAME=${FILE_NAME/\$YYMMD\$/$DATEYYMMDD}           # $YYMMDD$ to 070120
FILE_NAME=${FILE_NAME/\$YYYY-MM-DD\$/$DATE_YYYY_MM_DD} # $YYYY-MM-DD$ to 2007-01-20
if [ "$V_DIRE" = "DNLD" ]
then
echo "INFO : Download ${FILE_NAME} ... " | tee -a $FTP_LOG
ftp_download ${V_REMOTE_PATH}${FILE_NAME} ${V_LOCAL_PATH}${FILE_NAME}
fi
if [ "$V_DIRE" = "UPLD" ]
then
echo "INFO : Upload ${FILE_NAME}... " | tee -a $FTP_LOG
ftp_upload ${V_LOCAL_PATH}${FILE_NAME} ${V_REMOTE_PATH}${FILE_NAME}
fi

fi
done < $FTP_CONFIG

典型的配置范例myftp.cfg如下:

#SYSID FILE_NAME DIRECTION(DNLD/UPLD) REMOTE_PATH/ LOCAL_PATH/
0001 010YCDZ$YYYYMMDD$.txt   UPLD ftp://user:passwd@10.245.62.226:21/dz/ /home/myftp/whdl/
0002 010YCJZ$YYYYMMDD$.TXT   UPLD ftp://user:passwd@10.245.62.226:21/jz/ /home/myftp/whdl/
0003 010YJJS$YYYY-MM-DD$.TXT DNLD ftp://user:passwd@10.245.62.226:21/pk/js/ /home/myftp/whdl/
点击在新窗口中浏览此图片

Installation (安装)

wget http://www.monkey.org/~provos/libevent-1.3e.tar.gz
tar zxvf libevent-1.3e.tar.gz
cd libevent-1.3e/
./configure --prefix=/usr
make && make install
cd ../

wget http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
tar zxvf dbcached-1.0.beta2.tar.gz
cd dbcached-1.0.beta2/
./configure --prefix=/usr/local/dbcached --with-libevent=/usr
make && make install
cd ../

Run as a daemon (作为守护进程运行)

/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -x 192.168.0.2 -y 26010 -z 26010

    ● -x {ip_addr} hostname or IP address of nmdb server

    ● -y {num} TCP port number of nmdb server (default: 26010) for set & get command

    ● -z {num} UDP port number of nmdb server (default: 26010) only for set command, UDP will be used to replace TCP for set command when using parameter -z

    ● -x {IP地址} nmdb 服务器的域名或者IP地址,推荐使用IP地址

    ● -y {端口号} nmdb 服务器的TCP端口号 (默认: 26010) 支持 set/delete/... 等写命令 和 get 等读命令

    ● -z {端口号} nmdb 服务器的UDP端口号 (默认: 26010) 只支持 get 等都命令, 当使用 -z 参数时,将使用 UDP 协议代替 TCP 协议执行 set 操作,执行 get 操作时仍然使用 TCP 协议。强烈推荐加上 -z 参数。

    ● 其他参数跟 memcached 1.2.4 完全一样,就不再详细说明。

    ● 如果想让 dbcached 通过 NMDB 保存数据时采用 TCP 协议,去掉 -z 参数即可,例如:(除非因防火墙、NAT穿透等问题导致 UDP 协议不可用,否则不建议使用 TCP 协议)

/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -x 192.168.0.2 -y 26010

    ● 如果想让 dbcached 作为普通的 Memcached 运行,去掉 -x、-y、-z 参数即可,例如:

/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody
载录来源:http://code.google.com/p/dbcached/
张也转载了:http://blog.s135.com/read.php?329&guid=17
http://blog.sina.com.cn/s/blog_4d52f5a701000bav.html
http://blog.sina.com.cn/s/articlelist_1340168604_2_1.html
ubuntu下配置nginx+php+mysql+zend
http://www.zhanghaifeng.com/archives/33

CentOS 5.1下 postfix + extmail + dovecot + maildrop 最新版安装笔记:
http://hi.baidu.com/delphiss/blog/item/38571c94f7a7d50e7af48052.html
使用共享主机,控制面版是CPANEL的朋友都知道,他默认绑定主域名的目录为public_html

所以如果想要放域名yourdomain.com能直接访问,势必需要把所有文件全直接放进public_html下。这时候如果你想再建个子站,bbs.yourdomain.com,这时BBS目录就和其他php文件或主站的文件夹混在一起,很不利于管理

可以通过.htaccess文件来实现转向

以下以cms目录和www域名为例:

/————————————-以下为.htaccess文件内容————————————————-
# 开启功能
RewriteEngine on

# 你的主域名

RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$

# 把哪个子目录你想指向主域名
# 这里以CMS为例

RewriteCond %{REQUEST_URI} !^/cms/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 你想在哪个子目录上绑定主域名,把subfolder改成子目录

RewriteRule ^(.*)$ /cms/$1

#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
RewriteRule ^(/)?$ cms/index.php [L]

//———————-OVER——————————————

以上内容就是把目录cms指向主域名
比如www.yourmaindomain.com,访问时就直接转到了cms目录


我的配置:



# 开启功能
RewriteEngine on

# 你的主域名

RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$

# 把哪个子目录你想指向主域名
# 这里以CMS为例

RewriteCond %{REQUEST_URI} !^/mycom/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 你想在哪个子目录上绑定主域名,把subfolder改成子目录

RewriteRule ^(.*)$ /mycom/$1

#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$
RewriteRule ^(/)?$ mycom/index.php

作者:老王

问题:主从服务器表类型的选择

一般的共识是主服务器使用innodb,从服务器使用myisam,以便各尽其能。

问题:主从服务器字段类型的选择

字段类型对于分页等操作有很大影响。主服务器一般是innodb,因为不涉及查询,所以可以使用varchar等来存储字符串来节省空间,从服务器一般是 myisam,因为涉及查询,所以必须在char和varchar之间仔细权衡,没有varchar, text, blob字段的表是静态表,反之是动态表,静态表的检索效率要比动态表好若干倍,一般来说,所有涉及大结果集的查询都应该尽可能保证在静态表上完成,这里说一个例子:比如说常见的articles表有title(varchar), body(text)等字段,在做文章列表的时候,因为不是静态表,所以查询不会很快,下面开始重构解决方案:把原来的articles表拆分成 subjects表和contents表,title字段设置为一个足够的char类型放在subjects表里,body字段还保持是text类型放到 contents表里,subjects和contents表之间的关系是一对多,这样,顺带着也方便的实现了多页文章的功能,而且更重要的是在查询文章列表的时候,操作都是在subjects静态表里完成,效率肯定会比前一种方案提升很多。阅读全文
早就听说lighttpd加PHP的FAST-CGI方式性能不错,抽时间装了下.只是完成了环境的安装,还没具体看性能什么的!

以下是我装lighttpd+PHP(FAST-CGI)+mysql的,如有问题,请给我评论.



一、先安装MySQL

安装mysql,你可以安装源码包,也可以用编译好的!直接解压拷贝也行.我用的是直接拷贝编译好的!

1.编译源码包

./configure --prefix=/data2/ali --enable-assembler --enable-thread-safe-client --without-debug

make

make install

2.用编译好的压缩包!直接解压拷贝

tar zxf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz

cd mysql-standard-5.0.27-linux-i686-glibc23

cp -rf mysql-standard-5.0.27-linux-i686-glibc23 /usr/local/mysql


//以下是为了启动多个端口

mkdir -p /data2/ali/mysql3308

mkdir -p /data2/ali/mysql3309

./scripts/mysql_install_db --ldata=/data2/ali/mysql3308

cp support-files/my-medium.cnf /data2/ali/mysql3308/my.cnf

vi /data2/ali/mysql3308/my.cnf

修改内容如下:

#

[mysqld]

datadir = /data2/ali/mysql3308/

port = 3308

socket = /tmp/mysql-3308.sock

#


cp /data2/ali/mysql3308/ /data2/ali/mysql3309/

vi /data2/ali/mysql3309/my.cnf

修改内容如下:

#

[mysqld]

datadir = /data2/ali/mysql3309/

port = 3309

socket = /tmp/mysql-3309.sock

#

启动mysql

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root &

/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root &


检查mysql是否启动成功。

ps -ax|grep mysql

20835 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root

20862 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3308/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3308/ --user=root --pid-file=/data2/ali/mysql3308//XD_Blog_Web_132_42.pid --skip-external-locking --port=3308 --socket=/tmp/mysql-3308.sock

20872 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root

20903 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3309/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3309/ --user=root --pid-file=/data2/ali/mysql3309//XD_Blog_Web_132_42.pid --skip-external-locking --port=3309 --socket=/tmp/mysql-3309.sock


连接mysql

mysql -S /tmp/mysql-3108.sock




二、接着安装php

tar zxf php-5.2.4.tar.gz

cd php-5.2.4

./configure \

--prefix=/usr/local/php-fcgi \

--enable-fastcgi \

--enable-force-cgi-redirect \

--without-iconv \

--enable-mbstring \

--with-mysql=/usr/local/mysql

make

make install


复制参数文件到目标目录:

cp php.ini-dist /usr/local/php-fcgi/lib/php.ini


检查fast-cgi是否安装成功可以运行如下命令

/usr/local/php-fcgi/bin/php-cgi -v

显示如下信息,内容里包含“PHP 5.2.4 (cgi-fcgi)"表示支持fast-cgi了

PHP 5.2.4 (cgi-fcgi) (built: Oct 28 2007 20:08:41)

Copyright (c) 1997-2007 The PHP Group

Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies



三、最后安装lighttpd

1.安装配置lighttpd


1.1 首先创建运行lighttpd的用户和组


# groupadd lighttpd

# useradd -g lighttpd -s /sbin/nologin -d /dev/null lighttpd


1.2 开始安装lighttpd


# wget http://www.lighttpd.net/download/lighttpd-1.4.8.tar.gz

# tar -zxvf lighttpd-1.4.8.tar.gz

# cd lighttpd-1.4.8

# ./configure --prefix=/usr/local/lighttpd


# make

# make install


# mkdir /usr/local/lighttpd/conf

# mkdir /usr/local/lighttpd/log


# mv ./doc/lighttpd.conf /usr/local/lighttpd/conf/

# cp ./doc/rc.lighttpd.redhat /etc/init.d/lighttpd




vi conf/lighttpd.conf

将 #”mod_fastcgi”, 的#去掉

server.modules = (

"mod_rewrite",

"mod_redirect",

# "mod_alias",

"mod_access",

# "mod_cml",

# "mod_trigger_b4_dl",

# "mod_auth",

# "mod_status",

# "mod_setenv",

"mod_fastcgi",


找到fastcgi的定义


#### fastcgi module

## read fastcgi.txt for more info

## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini

fastcgi.server = ( ".php" =>

( "localhost" =>

(

"socket" => "/var/run/lighttpd/php-fastcgi.socket",

"bin-path" => "/usr/local/php-fcgi/bin/php-cgi"

)

)

)


一开始我把配置写"bin-path" => "/usr/local/php-fcgi/bin/php"这样,发现报错,后来改了下以上的配置,发现OK了!

启动lighttpd命令是这样的:

/usr/local/lighttpd/sbin/lighttpd -f conf/lighttpd.conf
我的:
/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf


最后可以在程序目录下建个test.php,检查一下是否正常!

最后发现在curl这儿:在command模式下可以看到curl php -m可以看到curl模块,但是通过lighttpd就说那个模块不存在。。???
       在使用SecureCRT进行远程操作的时候,遇到一个奇怪的问题,【ctrl+l】清屏失效,按完这个组合键之后,没有任何反应,键盘是好的。输入clear命令觉得麻烦。有人遇到过这样的问题吗?
找到问题原因:“谷歌金山词霸合作版”的热键冲突了,关掉它,就OK了。。。
我喜欢在.bashrc 中加上这句  alias c='clear'     运行: source ~/.bashrc  
如果不是root登陆但是su成 root的用户:source /root/.bashrc  OK。。。
  
If还是没有搞定:
如果暂时清屏幕在Linux的terminal下还是用:cls吧。
如果在Mysql下面还是用mysql的清屏命令:system clear或system reset 吧,这样也成,试了一下:\! clear;  ,斜杠转义一下。
ssh-keygen -r rsa 在用户名下面的.ssh目录生成几个文件:
id_rsa.pub
id_rsa
id_dsa.pub
id_dsa
known_hosts
我们需要:id_rsa,放入window或者其他linux/unix来作为私钥。

/etc/rc.d/sshd rcvar






#!/usr/local/bin/php -q
<?php

function read() {
    $fp=fopen("/dev/stdin", "r");
    $input=fgets($fp, 255);
    fclose($fp);

    return $input;
}

print("What is your first name? ");
$first_name = read();

print("What is your last name? ");
$last_name = read();

print("\nHello, $first_name $last_name!  Nice to meet you!\n");

?>

http://www.phpe.net/articles/370.shtml
http://www.thismail.org/bbs/redirect.php?tid=2854&goto=lastpost
原始来源老外的网站:http://www.phpbuilder.com/columns/darrell20000319.php3?page=2
https://www.cnblogs.com/wcwen1990/p/6917109.html



最后谈严格模式:Mysql尽可能采用严格模式,一定程序上防止一些编码问题和长度问题(https://blog.csdn.net/fdipzone/article/details/50616247)。
set global sql_mode=''; #这种方法修改,当前会话失效后,这个修改就没意义了,建议修改配置文件的方式修改,修改后,不需要重启mysql服务,立即生效,检查是否生效,执行sql ,select @@sql_mode;


show create table t;
CREATE TABLE `t` (
  `c` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

show variables like "%char%";
set names gbk;

mysql> select c ,hex(c) from t;
+------+--------+
| c    | hex(c) |
+------+--------+
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
| 东     | E4B89C |
+------+--------+
8 rows in set (0.00 sec)


php igbk.php
string(4) "b6ab"
int(1)
string(4) "b6ab"
string(4) "b6ab"
Array
(
    [0] => Array
        (
            [c] => 东
            [0] => 东
            [hex] => E4B89C
            [1] => E4B89C
        )

说明三个问题:
1)咱们在显示一个字符时,在SecureCRT里配置的character encoding只是显示,并不像Mysql的set names utf8里的三个参数(character_set_client character_set_connection character_set_results )有由一个字符转向另一个字符集的功效,要想显示正常,则只需要对转出来的结果进行匹配即可显示正常。bin2hex("东")

三条:
一)如果character_set_client和character_set_results 一般情况下要一致,因为一个表示客户端发送的数据格式,另一个表示客户端接受的数据格式为了避免造成数据丢失,需让 character_set_connection的字符编码 大于 character_set_client的字符编码.(MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;)
二)对于Mysql旧版本的默认latin情况,里面尽管传入了UTF8,也能正常的显示和插入(character_set_client| latin1(中文你utf8是3个字节,也就是来自前端网页的UTF8的你字,而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化,但实际上mysql客户端认为我输入了3个latin1字符;还好是UTF8前端,如果客户端是GBK,直接收到一个3字节的UTF8的编码会为是1个gbk字符和一个西欧字符) -> character_set_connection | latin1->),但本质上是以UTF8的方式存入磁盘时是6个字符( character_set_database   | utf8 ),而出来时又被Latin1转回为3个字符后被UTF8看成1个汉字也就是你字,而如果这个Lation1不这样6字节变3字节,也就是(character_set_results 的值由latin1变UTF8后)UTF8后,则6个字符以UTF8直接穿透到显示层了,会在SecureCRT(设置UTF8输出显示)看到UTF8是6个字符认为是两个汉字,也就成了我们认为的乱码!!!归结于:由于latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。
实践如下,实践证明输出与character_set_results的编码有关,当set character_set_results是latin1时会转为输入时的UTF8的三个字符,而set character_set_results="utf8"时,则它输出了存入Mysqld数据库的6个字节的UTF8直接输出,前端认为是两个字也就显示出来了东,也就是把C3A4C2B8C593以SecureCRT配置的前端输出经过UTF8解码显示,就是乱码了。

这个在Mysql里可通过设置set names latin1;并且secureCRT的Character encoding设置为utf8就能正常显示,本质上:
mysql> select c ,hex(c) from t;
+--------+--------------+
| c      | hex(c)       |
+--------+--------------+
| 东 (这里面的输出是将 hex(c)里的内容C3A4C2B8C593 经过character_set_results=latin1编码后显示,这个显示正常不正常是由SecureCRT的输出时是GB2312,还是UTF8,这儿输出本来是latin1,但是被SecureCRT按utf8显示后就是 三个字节的东字!!! )   | C3A4C2B8C593 |
+--------+--------------+


核心内容:输出的那个Lation1变UTF8(set  character_set_results=utf8)后,反而乱码的原因是如下:






From:https://edu.aliyun.com/a/15790


        基础学习:关于前面提到的字节和位的一个关系的一个基础知识:位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111(0XFF,全是1,也就是两个F(十进制是255 ),C3的对应的十进制195,A4对应十进制是164);通常1个字节可以存入一个ASCII码,“c3a4 c2bd c2a0”(6个字节) ,ASCII码用十六进制表示的,C3、a4等等,http://ascii.911cha.com/。

三)对于2的这种情况是在升级时可全部改为UTF8的编码的,是可以根据 mysqldump 时加上 --default-character-set=latin1,导出正常的Utf8编码的中文且显示正常的字符,但是加了这 个后,记得修改里面的set names latin1,为set names utf8, 而在程序代码里连接时也加上set names utf8,黄冶是default-character-set=utf8就能正常显示。(mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt)
=========================================================================================
[转]深入Mysql字符集设置,比阿里巴巴技术团队的更形像,有图:
https://blog.csdn.net/haiross/article/details/51273630  (请道因为UTF8插入时如果存的是比它小的,可能转时出现问题,而没法恢复,因为存入时就坏了:插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有/u0000~/u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。而以latin1入到Utf8后,会导致字符数变多,也就是存储空间会因为中文的UTF8是3个及以上(文章里提到的3个字节变成6个字节),占用了更多磁盘,插入操作的数据将经过latin1(character_set_client)=>latin1(character_set_connection)=>utf8(character_set_results)的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存; )
阿里云大学谈到了其乱码的本质一样的用你的UTF8作描述的文字版:https://edu.aliyun.com/a/15790
MySQL的几个character_set变量的说明:https://www.linuxidc.com/Linux/2017-04/143263.htm
MySQL抓包工具:MySQL Sniffer【转】:
https://www.cnblogs.com/zhoujinyi/p/6497231.html
利用tcpdump对mysql进行抓包操作技巧_Mysql:
https://edu.aliyun.com/a/15214

特殊变量之character_set_system:character_set_system是个只读数据不能更改。也没多少改的意义,他是元数据的编码,相信不会有人用中文做数据库名和字段名之类的吧,这个字段和具体存储的数据无关。
mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------+
| Variable_name      | 说明                        |
+--------------------------+-----------------------------------------------------+
| character_set_client   | 客户端字符集                    |
| character_set_connection | 当前连接字符集                   |
| character_set_database  | 数据库字符集                    |
| character_set_filesystem | 文件系统字符集,不要修改,使用binary即可 |
| character_set_results  | 返回结果集字符集                                   |
| character_set_server   | 服务器默认字符集,当数据库、表、列没有设置时,如Show create table里的中文表字段批注   |
|             |   默认使用此字符集                |
| character_set_system   | 固定为utf8                                            |
+--------------------------+-----------------------------------------------------+
| Variable_name            | Value                                               |
+--------------------------+-----------------------------------------------------+
| character_set_client     | latin1                                              |
| character_set_connection | latin1                                              |
| character_set_database   | utf8                                                |
| character_set_filesystem | binary                                              |
| character_set_results    | latin1                                              |
| character_set_server     | utf8                                                |


------------------------而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化!-------------------------------------------
这里首先需要解释的是,我想应该就是连接通道的含义了。那什么是连接通道呢?
背景:这种理解其实是早期程序员以PHP为例通常觉得数据存为简体中文比教少占空间,utf8中文占用大于等于三,由unicode字符集决定的,其实现在看来用utf8都不是啥大事,磁盘很便宜。再就是早期mysql默认就是拉丁字符集合。
导致出现想转为utf8的,首先导出时候得指定字符集为拉丁,假如不加指定以拉丁导出其默认是utf8,往往那个建表结构的comment注释是utf8,出现评论正常,数据库内容中文乱码,用file xxx.sql检查的确是一个utf8的sql文件。
如果MySQL服务器上的字符集是 latin1 的,mysqldump 出来的中文都是乱码!一个简单的办法是加上默认字符集选项,如:
mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt  #character_set_connection、character_set_client、character_set_results三个字符集一次性被设置为latin1了。character_set_client、character_set_connection、character_set_results这3个参数值是由客户端每次连接进来设置的,和服务器端没关系。我们登陆进mysql后,执行 set names utf8; 实际就是同时修改上面的这3个参数值的。From:MySQL的几个character_set变量的说明,https://www.linuxidc.com/Linux/2017-04/143263.htm。
有些网站在开发时,并没有正确指定编码,採用了预设的 latin1 ,并且将 big5 的中文资料直接储存。这种情况如果直接用 mysqldump 直接匯出,结果可能是一堆乱码,必须加上 --default-character-set=latin1 让匯出的资料保持正常的 big5 编码。
mysqldump -u USER -p DBNAME --default-character-set=latin1 > DBNAME.sql
如果在匯出备份资料时,忘记加上参数,產生的乱码资料,用 iconv 可以救回部分(以下指令示范假设匯出档為错误编码的utf8),参数 "-c" 表示忽略无法转码的字元。
iconv -c -f utf8 -t latin1 DBNAME.sql > DBNAME.big5.sql
对于 big5 编码的匯出档,也可以用 iconv 转换成 utf8 格式。
iconv -c -f big5 -t utf8 DBNAME.sql > DBNAME.utf8.sql
再进行编码格式设定的替换。
perl -pi -e 's/big5/utf8/g' DBNAME.utf8.sql
旧的Mysql默认选项:
mysql> show variables like "%set%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_results    | latin1                     |


从源码编译mysql的时候,通过编译参数进行设置
编译的时候如果指定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:
创建database、table时,会将其作为默认的字符集/字符序。
client连接server时,会将其作为默认的字符集/字符序。(不用单独SET NAMES)
shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci
RPM打包:
cmake . \
...
-DDEFAULT_CHARSET=utf8 \                                                                                              
...
make %{?_smp_mflags}
=============================================================================

搞成utf8的编码,怎么办?分三步:
1)mysqldump default-character-set=latin databse table > /tmp/utf8format.sql #本质上是存在数据库里面的编码就是latin,指定以Latin字符编码给导出到一个utf8文件里面。
2)在导出文件里面因为1加入了指定导出编码了,于是文件里面sql语句有一个set names latin,把这个改成set names utf8。此时用less看无论建表结构的评论注释还是表里内容均显示正常,中文不乱码。
3)在导入数据的mysqlserver的my.cnf设置尽可能全utf8,如果不设置因为2在sql文件建立表和插入数据前加入设置编码了,直接mysql导入即可。保证全是utf8后,PHP的连接字符串编码也是UTF8即可。

所谓连接通道,就是客户端和服务器端保持连接的一个通道,它是逻辑上的一个概念。客户端通过连接通道发送sql语句到服务器端,服务端执行,将结果再通过连接通道返回至客户端。the connection is the pass when you connect to the server.

这个过程中,有几个临界点(逻辑上概念),是我们需要注意的,mysql也就在这几个临界点上做了文章。

1、当语句离开客户端的时候:
从客户端出来的,包括sql语句本身(这里里面就包含字符串和关键字等了),以及character_set_client系统变量。为什么要包含这个变量呢?这个变量的作用说明2点,也是它的作用:一是表示该语句中的字符集是使用character_set_client指定的字符集编码的,二是通过此系统变量来告诉服务器所发送来的语句中的字符集编码。
2、当服务器端接受到客户端的语句的时候:
mysql会使用character_set_connection/collation_connection指定的字符集以及校验规则,将客户端的字符串,做一个从character_set_client到character_set_connection的转换。
3、当服务器处理好结果以后,在把结果传给客户端前:
mysql会先将结果转换成character_set_results指定的字符集,然后传回给客户端。


当字符串在mysql服务器的时候,最终以什么格式存储到mysql数据库中,这个是受到具体的数据表级别、列级别字符集设置的控制了。
阅读全文
分页: 233/272 第一页 上页 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 下页 最后页 [ 显示模式: 摘要 | 列表 ]