文章目錄
使用PostgreSQL資料庫做PHP開發
作者:heiyeshuwu
使用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