分类: 开发

CentOS 配置 Apache, PHP, Mysql 开发环境

作为一个Linux超级菜鸟来说,偶尔需要配置一下Web开发环境,每次都需要重新查资料,于是稍微记录一下,加深印象,另外也算是一篇笔记,下次不用到处去Google了。

该文章只是用于Web开发的测试环境,性能和安全完全没有认识,如果有人看到,请不要用于生产环境,对任何后果不负任何责任,嘿嘿。

目的

在CentOS上配置用于开发的Web环境,包含Apache, PHP, Mysql。

安装Apache

直接通过yum安装Apache,yum -y install httpd

安装好后,默认情况下, Apache 的配置文件 httpd.conf 文件在 /etc/httpd/conf/httpd.conf 位置,编辑配置文件,修改DocumentRootDirectory 两处设置为你需要保存网站文件的位置。

安装Mysql

直接通过yum安装Mysql,yum -y install mysql

安装PHP

由于CentOS通过yum安装的PHP为5.1版本,我需要5.2.17版本来保证和线上的运行环境一致,所以自己下载PHP源码进行编译安装。

  1. http://php.net 下载对应版本的源码到 /tmp/ 目录并解压。
  2. 进入解压后的目录 /tmp/php-5.2.17/
  3. 根据需求配置需要的模块 ./configure --enable-mbstring --with-curl --with-gd --with-mcrypt --with-mysql --with-mysqli --with-apxs2=/usr/sbin/apxs
  4. make
  5. make install

上面的语句肯定不会执行成功,因为缺少一大堆的依赖文件,configure: error: libpng.(a|so) not found. 当遇到这种提示时,需要安装libpng库,除此之外还需要安装开发包。yum -y install libpng libpng-devel,对于其它的依赖支持也同样处理。

上面的参数 –with-apxs2=url 可以让 PHP 找到 Apache 的配置详情,然后自动添加 Apache 支持。同样如果没有安装 httpd-devel,编译PHP的时候是找不到 apxs 的路径的。

好了,以上的配置安装都成功了后,现在写一个phpinfo()的php文件,然后访问 http://localhost 应该就可以看到 phpinfo 页面了。

如果看到的是PHP代码,到Apache的配置文件 httpd.conf 里加上PHP文件类型:AddType application/x-httpd-php .php

在 phpinfo 页面可以看到PHP配置文件的目录和加载的配置文件。
Loaded Configuration File (已加载的配置文件)
Configuration File (php.ini) Path (配置文件所在的目录)
如果值为空则表示没有配置文件,需要更改PHP的配置的话,可以从php源码目录里将 php.ini-recommended 拷贝并重命名为 php.ini 到 Configuration File (php.ini) Path 指定的那个目录,然后进行修改。

如果发现编译安装好后又需要添加某个PHP插件?

  1. 进入PHP源码目录
  2. make clean
  3. ./configure 在原有的参数基础上再加上新加的参数
  4. make
  5. make install

其它相关配置

/etc/my.cnf 配置mysql参数,有的话不需要重复添加

[mysqld] #应该有这句了
default-character-set = utf8 #默认编码utf8
[mysql] #应该有这句,没有则添加上
default-character-set = utf8 #默认编码utf8

设置Mysql随系统启动
chkconfig mysqld on 随系统启动,通过 chkconfig --list mysqld 检验状态,2-5为on就OK
/etc/rc.d/init.d/mysqld start 启动mysql

一些 Mysql 语句:
show databases; 查看存在的数据库
use test; 连接使用数据库test
show tables; 查看数据库里的表
drop table test; 删除test表
drop database test; 删除某个数据库
delete from mysql.user where user=”; 删除匿名用户
set password for root@localhost=password(‘密码’) 设置root密码
grant all privileges on test.* test@localhost identified by ‘密码’ 建立对test数据库有完全操作权限的名为test的用户;
revoke all privileges on *.* from test@localhost; 取消test对数据库的操作权限
flush privileges; 刷新使生效
注意到了上面的语句中的用户都是test@localhost吧,表示该用户只能在localhost访问数据库
如果远程访问数据库,需要设置将host改为%; 或者通过GRANT语句另外授权帐号

一些PHP配置参数参考,也可以通过查看 ./configure 文件了解详细参数配置
./configure
–prefix=/usr/local/php php 安装目录
–with-apxs2=/usr/local/apache/bin/apxs
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv 关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持
–enable-gd-native-ttf 支持TrueType字符串函数库
–with-curl 打开curl浏览工具的支持
–with-curlwrappers 运用curl工具打开url流
–with-ttf 打开freetype1.*的支持,可以不加了
–with-xsl 打开XSLT 文件支持,扩展了libxml2库 ,需要libxslt软件
–with-gettext 打开gnu 的gettext 支持,编码库用到
–with-pear 打开pear命令的支持,php扩展用的
–enable-calendar 打开日历扩展功能
–enable-mbstring 多字节,字符串的支持
–enable-bcmath 打开图片大小调整,用到zabbix监控的时候用到了这个模块
–enable-sockets 打开 sockets 支持
–enable-exif 图片的元数据支持
–enable-magic-quotes 魔术引用的支持
–disable-rpath 关闭额外的运行库文件
–disable-debug 关闭调试模式
–with-mime-magic=/usr/share/file/magic.mime 魔术头文件位置
cgi方式安装才用的参数
–enable-fpm 打上php-fpm 补丁后才有这个参数,cgi方式安装的启动程序
–enable-fastcgi 支持fastcgi方式启动php
–enable-force-cgi-redirect 同上 ,帮助里没有解释
–with-ncurses 支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库
–enable-pcntl freeTDS需要用到的,可能是链接mssql 才用到
mhash和mcrypt算法的扩展
–with-mcrypt 算法
–with-mhash 算法
–with-openssl openssl的支持,加密传输时用到的
–with-pcre-dir=/usr/local/bin/pcre-config perl的正则库案安装位置

触发器设计技巧与实例

  在数据库设计中,有两种方法可设定自动化的资料处理规则,一种是条件约束,一种是触发器,一般而言,条件约束比触发器较容易设定及维护,且执行效率较好,但条件约束只能对资料进行简单的栏位检核,当涉及到多表操作等复杂操作时,就要用到触发器了。
  一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted

在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更新前的记录
删除时 不存储记录 存放被删除的记录

触发器的种类及触发时机
After触发器:触发时机在资料已变动完成后,它将对变动资料进行必要的善后与处理,若发现有错误,则用事务回滚(Rollback Transaction)将此次操作所更动的资料全部回复。
Istead of 触发器:触发时机在资料变动前发生,且资料如何变动取决于触发器现在介绍一下创建触发器的编写格式:

After类型:
Create Trigger 触发器名称
on 表名
after 操作(insert,update)
as
Sql语句

Instead类型
Create Trigger 触发器名称
on 表名
Instead of 操作(update,delete)
as
Sql语句

实例1:
  在订单(表orders)中的订购数量(列名为num)有变动时,触发器会先到客户(表Customer)中
取得该用户的信用等级(列名为Level),然后再到信用额度(Creit)中取出该等级
许可的订购数量上下限,最后比较订单中的订购数量是否符合限制。

代码:
Create Trigger num_check
on orders
after insert,update
as
if update(num)
begin
if exists(select a.* from orders a join customer b on a.customerid=b.customerid
join creit c on b.level=c.level
where a.num between c.up and c.down)
begin
rollback transaction
exec master..xp_sendmail 'administrator','客户的订购数量不符合限制'
end
end

实例2:
有工资管理系统中,当公司对某员工甲的月薪进行调整时,通常会先在表员工中修改薪资列,然后在表员工记录中修改薪资调整时间与薪资

Create trigger compensation
on 员工
after update
as
if @@rowcount=0 return
if update(薪资)
begin
insert 员工记录
select 员工遍号,薪资,getdate()
from inserted
end

Response.ContentType的类型小集 [MIME]

ez=application/andrew-inset
hqx=application/mac-binhex40
cpt=application/mac-compactpro
doc=application/msword
bin=application/octet-stream
dms=application/octet-stream
lha=application/octet-stream
lzh=application/octet-stream
exe=application/octet-stream
class=application/octet-stream
so=application/octet-stream
dll=application/octet-stream
oda=application/oda
pdf=application/pdf
ai=application/postscript
eps=application/postscript
ps=application/postscript
smi=application/smil
smil=application/smil
mif=application/vnd.mif
xls=application/vnd.ms-excel
ppt=application/vnd.ms-powerpoint
wbxml=application/vnd.wap.wbxml
wmlc=application/vnd.wap.wmlc
wmlsc=application/vnd.wap.wmlscriptc
bcpio=application/x-bcpio
vcd=application/x-cdlink
pgn=application/x-chess-pgn
cpio=application/x-cpio
csh=application/x-csh
dcr=application/x-director
dir=application/x-director
dxr=application/x-director
dvi=application/x-dvi
spl=application/x-futuresplash
gtar=application/x-gtar
hdf=application/x-hdf
js=application/x-javascript
skp=application/x-koan
skd=application/x-koan
skt=application/x-koan
skm=application/x-koan
latex=application/x-latex
nc=application/x-netcdf
cdf=application/x-netcdf
sh=application/x-sh
shar=application/x-shar
swf=application/x-shockwave-flash
sit=application/x-stuffit
sv4cpio=application/x-sv4cpio
sv4crc=application/x-sv4crc
tar=application/x-tar
tcl=application/x-tcl
tex=application/x-tex
texinfo=application/x-texinfo
texi=application/x-texinfo
t=application/x-troff
tr=application/x-troff
roff=application/x-troff
man=application/x-troff-man
me=application/x-troff-me
ms=application/x-troff-ms
ustar=application/x-ustar
src=application/x-wais-source
xhtml=application/xhtml+xml
xht=application/xhtml+xml
zip=application/zip
au=audio/basic
snd=audio/basic
mid=audio/midi
midi=audio/midi
kar=audio/midi
mpga=audio/mpeg
mp2=audio/mpeg
mp3=audio/mpeg
aif=audio/x-aiff
aiff=audio/x-aiff
aifc=audio/x-aiff
m3u=audio/x-mpegurl
ram=audio/x-pn-realaudio
rm=audio/x-pn-realaudio
rpm=audio/x-pn-realaudio-plugin
ra=audio/x-realaudio
wav=audio/x-wav
pdb=chemical/x-pdb
xyz=chemical/x-xyz
bmp=image/bmp
gif=image/gif
ief=image/ief
jpeg=image/jpeg
jpg=image/jpeg
jpe=image/jpeg
png=image/png
tiff=image/tiff
tif=image/tiff
djvu=image/vnd.djvu
djv=image/vnd.djvu
wbmp=image/vnd.wap.wbmp
ras=image/x-cmu-raster
pnm=image/x-portable-anymap
pbm=image/x-portable-bitmap
pgm=image/x-portable-graymap
ppm=image/x-portable-pixmap
rgb=image/x-rgb
xbm=image/x-xbitmap
xpm=image/x-xpixmap
xwd=image/x-xwindowdump
igs=model/iges
iges=model/iges
msh=model/mesh
mesh=model/mesh
silo=model/mesh
wrl=model/vrml
vrml=model/vrml
css=text/css
html=text/html
htm=text/html
asc=text/plain
txt=text/plain
rtx=text/richtext
rtf=text/rtf
sgml=text/sgml
sgm=text/sgml
tsv=text/tab-separated-values
wml=text/vnd.wap.wml
wmls=text/vnd.wap.wmlscript
etx=text/x-setext
xsl=text/xml
xml=text/xml
mpeg=video/mpeg
mpg=video/mpeg
mpe=video/mpeg
qt=video/quicktime
mov=video/quicktime
mxu=video/vnd.mpegurl
avi=video/x-msvideo
movie=video/x-sgi-movie
ice=x-conference/x-cooltalk

关于byval

为什么一个结果是0,一个是10?
第一段:

Private Sub Form_Click()
    Dim a As Integer
    For i = 1 To 10
        Call abcd(a)
    Next i
    Print a
End Sub

Sub abcd(ByVal x)
    x = x + 1
End Sub

第二段:


Private Sub Form_Click()
    Dim a As Integer
    For i = 1 To 10
        Call abcd(a)
    Next i
    Print a
End Sub

Sub abcd(x)
    x = x + 1
End Sub

byval是把内存数值的拷贝给程序,所以改变的只是拷贝,内存原来的值是不会改变的。
第一个a的值并没有变化。

SQL存储过程部分参数

参数值的类型的意义如下:

名称值 整数值 功能
addbtimestamp 135 日期时间数据类型
addecimal 14 十进制整数值
addouble 5 双精度小数值
aderror 10 系统错误信息
adguid 72 全域性唯一识别字(globallyuniqueidentifier)
addispath 9 com/ole自动对象(automationobject)
adinteger 3 4字节有符号整数
adiunknown 13 com/ole对象
adlongvarbinary 205 大型2字节值
adlongvarchar 201 大型字符串值
adlongvarwchar 203 大型未编码字符串
adnumeric 131 十进制整数值
adsingle 4 单精度浮点小数
adsmallint 2 2字节有符号整数
adtinyint 16 1字节有符号整数
adunsignedbigint 21 8字节无符号整数
adunsignedint 19 4字节无符号整数
adunsignedsmallint 18 2字节无符号整数
adunsignedtinyint 17 1字节无符号整数
aduserdefined 132 用户自定义数据类型
advariant 12 ole对象
advarbinary 204 双字节字符变量值
advarchar 200 字符变量值
advarchar 202 未编码字符串变量值
adwchar 130 未编码字符

 
方向值的意义如下:

名称值 整数值 功能
adparaminput 1 允许数据输入至该参数当中
adparamoutput 2 允许数据输出至该参数当中
adparaminputoutput 3 允许数据输入、输出至该参数当中
adparamreturnvalue 4 允许从一子程序中返回数据至该参数当中