使用PostgreSQL数据库做PHP开发
说明:下面内容更多是讲怎么安装环境的,实际开发内容几乎没有,你可以考虑是否阅读本文。
PostgreSQL数据库应该算是数据库界的启明星,其中一些功能甚至超过了Oracle等商业数据库,在开源世界来讲,可以说是非常不错的,甚至MySQL都跟它差很远。它支持包括JDBC、ODBC、DBI等等数据库链接方式,基本上能够目前所有流行的编程语言进行交互,可以说是适合任何编程开发者。
官方的介绍内容也许更能说明问题:http://www.pgsqldb.org/pgsqldoc-8.0c/preface.html
---------------------------------------------------------------------------------------------------------------------------------------------
何为 PostgreSQL?
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,版本 4.2为基础的对象关系型数据库管理系统(ORDBMS)。 POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。
PostgreSQL 是最初的伯克利的代码的一个开放源码的继承人。 它支持大部分 SQL:2003 标准并且提供了许多其他现代特性:
复杂查询
外键
触发器
视图
事务完整性
多版本并发控制
同样,PostgreSQL 可以用许多方法扩展,比如, 通过增加新的:
数据类型
函数
操作符
聚集函数
索引方法
过程语言
并且,因为许可证的灵活,任何人都可以以任何目的免费使用,修改,和分发 PostgreSQL, 不管是私用,商用,还是学术研究使用。
----------------------------------------------------------------------------------------------------------------------------------------------
今天想尝试一下PHP使用PostgreSQL做开发的感觉,于是就赶紧装一个吧。
一开始考虑是在Windows安装最新的8.0.3版本,但是想想,可能实际开发平台更多的是在Unix/Linux下,于是就准备在FreeBSD下做开发,刚好昨天把FreeBSD5.4升级了,赶紧ports一个回来。
cd /usr/ports/database/postgresql80-server
cat Makefile
一看,原来最新版是8.0.3,呵呵,正好呀,赶紧装。
make install
漫长等待的过程,它要去下载什么gmake,还要下载postgresql-8.0.3.tar.bz2等文件,老半天才装完。呵呵,很兴奋,启动一下看看:
/usr/local/etc/rc.d/postgresql.sh start (这个文件也许你的文件名不是这样)
晕,怎么出错了?反正死活就是启动不了,看来还得手工安装一下,先卸载掉吧:
cd /usr/ports/database/postgresql80-server
make deinstall
唉,把文件拷走吧:
cd /usr/ports/distfiles
mv ./postgresql-8.0.3.tar.bz2 /usr/local/src
解压缩:
cd /usr/local/src
bunzip2 -d ./postgresql-8.0.3.tar.gz2
tar xvf ./postgresql-8.0.3.tar
解压缩成功:
cd ./postgresql-8.0.3
配置文件,安装到我们的老目录里:
./configure --prefix=/usr/local/pgsql
gmake
等待的过程,到后来,晕,怎么又出错?
提示文件系统已经满了。。。-_-#
我的是虚拟机,空间分配不合理,看看能不能给 /usr 加点空间。
去google狂搜资料,只找到个 tunefs 的命令能解决这个问题,看了半天也没明白,链接:
http://www.freebsd.org.cn/snap/doc/zh_CN.GB2312/books/handbook/configtuning-disk.html
想想还是算了,装到其他分区不就完了,看看空间情况:
%df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 507630 55060 411960 12% /
devfs 1 1 0 100% /dev
/dev/ad0s1e 507630 70072 396948 15% /tmp
/dev/ad0s1f 2025982 1960440 -96536 105% /usr
/dev/ad0s1d 507630 76340 390680 16% /var
那就装到 /var 下吧,呵呵:
./configure --prefix=/var/pgsql
gmake
gmake install
过程顺利,好,添加个运行pg的用户:
adduser
Username: postgres
Full name: PostgreSQL Server User
Uid (Leave empty for default):
Login group [postgres]:
Login group is postgres. Invite postgres into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash nologin) [sh]: /bin/csh
Home directory [/home/postgres]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]: yes
Lock out the account after creation? [no]:
Username : postgres
Password : <blank>
Full Name : PostgreSQL Server User
Uid : 1004
Class :
Groups : postgres
Home : /home/postgres
Shell : /bin/csh
Locked : no
建立存放数据库的目录:
mkdir /var/pgsql/data
把所有权给postgres用户:
chown postgres /var/pgsql/data
切换到用户postgres:
su - postgres
初始化数据库:
/var/pgsql/bin/initdb -D /var/pgsql/data
开始运行:
/var/pgsql/bin/postmaster -D /var/pgsql/data >logfile 2>&1 &
晕,怎么一堆错误!!!
postmaster does not know where to find the server configuration file.
You must specify the --config-file or -D invocation option or set the PGDATA environment variable.
没有指定配置文件,赶紧看看配置文件再哪里?
find / -name "postgresql.conf"
/var/pgsql/data/postgresql.conf
哦,原来初始化数据库的时候就建立了配置文件,赶紧写上:
./postmaster --config-file=/var/pgsql/data/postgresql.conf
晕,怎么又出现新的错误?
哦,原来没有配置postgresql.conf的内容,赶紧把重要的配置一下,配置过的内容如下:
#---------------------------------------------------------------------------
# FILE LOCATIONS
#---------------------------------------------------------------------------
# The default values of these variables are driven from the -D command line
# switch or PGDATA environment variable, represented here as ConfigDir.
# data_directory = 'ConfigDir' # use data in another directory
data_directory = '/var/pgsql/data'
# hba_file = 'ConfigDir/pg_hba.conf' # the host-based authentication file
hba_file = '/var/pgsql/data/pg_hba.conf'
# ident_file = 'ConfigDir/pg_ident.conf' # the IDENT configuration file
ident_file = '/var/pgsql/data/pg_ident.conf'
看出来了吧,就是指定了一个数据库文件目录,两个配置文件的路径。
再启动:
./postmaster --config-file=/var/pgsql/data/postgresql.conf
LOG: database system was shut down at 2005-07-15 01:20:24 CST
LOG: checkpoint record is at 0/A38D20
LOG: redo record is at 0/A38D20; undo record is at 0/0; shutdown TRUE
LOG: next transaction ID: 678; next OID: 17231
LOG: database system is ready
OK,成功。好,看看能不能从我哪儿访问,先访问下默认的5432端口:
telnet 192.168.0.215 5432
怎么回事,无法连接?赶紧Google一下,哦,原来是默认只是允许本地链接,要修改配置文件:
vi /var/pgsql/data/postgresql.conf
修改以下内容:
#---------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#---------------------------------------------------------------------------
# - Connection Settings -
#listen_addresses = 'localhost' # what IP interface(s) to listen on;
# defaults to localhost, '*' = any
listen_addresses = '*'
#port = 5432
看到没有,就是把监听地址默认的localhost改为*,就是允许所有。再启动后telnet,呵呵,黑乎乎屏幕出现,没有问题。
哈哈,现在终于能用PHP来连接了吧。
打开php里的pgsql扩展,输出phpinfo()看看能不能支持pgsql,一看,能了,赶紧写代码看看:
<?php
$link_str = "host=192.168.0.215 port=5432 dbname=test user=postgres password=postgres";
$link_id = pg_connect($link_str);
print_r($link_id);
?>
保存为pgsql.php,打开浏览器:http://localhost/pgsq.php,哈哈,等着出链接ID吧!
哦,怎么回事?出现错误:
Warning: pg_connect() [function.pg-connect]: Unable to connect to PostgreSQL server: FATAL: no pg_hba.conf entry for host "192.168.0.216", user "postgres", database "test" in E:\Web\www\Temp\pgsql\pg.php on line 3
仔细看,pg_hba.conf entry for host "192.168.0.216" ,哦,原来是这个配置文件里没有允许我这个IP地址的访问,真是安全哪!
看来这个pg_hba.conf里面也必须设置才行,赶紧打开:
vi /var/pgsql/data/pg_hba.conf
添加了一段IP地址,如下内容:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all 192.168.0.216 trust
# IPv6 local connections:
host all all ::1/128 trust
看见没有,我添加了:
host all all 192.168.0.216 trust
如果你要允许一个段的IP,就可以添加成 192.168.0.1/24 什么的。
再启动postgresql,我浏览器再次连接,浏览器输出:
Resource id #1
^_^,成功了吧!
赶紧下个windows下的管理工具来,去:http://www.pgadmin.org/ 下载了一个 pgAdmin III回来,安装完后,启动,添加服务器,成功。用起来不错,跟MysqlCC有一拼,还支持中文。
基本到这里就没有什么了,呵呵,另外,说一个pgsql的特征,就是如果同一个用户在多个IP上登陆到服务器上,那么就只允许一个用户执行,操作,其他用户无法执行,否则出现错误,比如我在我的XP上使用pgAdmin登陆后,我又到服务器端去执行操作:
/var/pgsql/bin/createdb db1
createdb: database creation failed: ERROR: source database "template1" is being accessed by other users
看见没有,出错了吧。
从上面种种来看,pgsql真是安全哪,把很多安全问题都扼杀在摇篮,而且配置也很丰富,虽然我安装过程复杂了一点。其实多看看手册就明白的很了,只怪我不看手册。
晕,说了半天,没怎么说PHP怎么做开发,呵呵,搭环境比较重要吧,至于开发和pgsql本身的特性,慢慢去研究。
附加点好东西:
官方推荐的安装过程,但是实际中不好使:
-------------------------------------------------------------------------------------------
./configure
gmake
su
gmake install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test
------------------------------------------------------------------------------------------
PostgreSQL中文手册:http://www.pgsqldb.org/twiki/bin/view/PgSQL/PgDocList
PostgreSQL中文论坛:http://bbs.pgsqldb.com
PostgreSQL官方网站:http://www.postgresql.org
Author: heiyeluren
WriteTime: 2005-7-15 下午16:30