Oracle + PHP

在 Mac OS X 上安装 Oracle 和 PHP
作者:Matt Rohrer

Oracle、Mac OS X 和开放源代码技术(如 PHP 和 gqlplus)正一起构建一个令人愉快、高效和稳定的开发环境。下面介绍如何设立这个环境。

随着 Apple 的 Mac OS X 转移到 UNIX 基础上,一个结合了非凡的易用性和坚如磐石的基础的开发平台有望产生,许多开发人员都为这一平台的前景振奋不已。考虑到 Oracle 有一个 Oracle9i Database Release 2 for OS X 10.2 (Jaguar) 的开发人员版本,并已宣布 Oracle Database 10g 将完全支持 OS X 平台,前景看起来甚至更加光明了。

作为一个开发平台,OS X最振奋人心的方面之一就是对成千上万的为类似 UNIX 的系统开发的开放源代码工具和框架的支持。Apache Web server 和 PHP 脚本语言是为开发人员提供的两个最流行和健壮的开放源代码工具,而在 OS X 上又可以很容易地使用它们。正如 Sean Hull 的“Oracle 和 PHP 入门”所说到的那样,PHP 是与 Oracle 一起使用的一种优秀的语言。

如果您是一位利用 Oracle 应用程序进行工作的开发人员,并且一直渴望得到 Windows 或 Linux 的一个替代品 — 或者如果您是一位经验丰富的 OS X 用户,并且正打算将您的下一个项目建立在 Oracle 的基础上 — 那么本文就是为您提供的。本文假定您已经熟悉了在 shell 环境下进行工作,并且已安装了 OS X 10.3 (Panther) 或 10.2 (Jaguar),包括开发人员工具和一个管理员帐号。

虽然该开发人员版本最初是为 10.2.x Server (Jaguar) 提供的,但我已在以下 OS X 客户端版本上测试了它:10.2.6、10.2.8 和 10.3.2 (Panther)。在 Jaguar 上安装和在 Panther 上安装之间唯一的区别是 Apple 已经在 Panther 的 Apache 配置文件中激活了 PHP。如果您在 Jaguar 上安装,您将需要编辑配置文件来激活 PHP。此外,Jaguar 上的默认用户 shell 是 tcsh,而 Panther 使用 bash。以下说明是针对 bash shell 的。要使用 bash,请在 tsch 提示符下输入:

shell> exec bash

在完成本文之后,您将拥有一个可工作的 Oracle 例程和通过 PHP 脚本使用 PHP 的 OCI 接口来与 Oracle 通信的能力。本文还演示了如何安装 gqlplus — Oracle 的 SQL*Plus 客户端的一个包装器,这个包装器为您提供了命令行编辑、完成和历史功能,您可能在您的 shell 环境中已经习惯了这些功能。

在开始安装之前,您需要为 Jaguar 下载 Oracle9i R2 Developer Release 版本。它的大小有 34MB,因此在您开始之前,请确保您拥有一个快速的连接或者很多的时间。在您下载时,转至 http://www.php.net/get/php-4.3.4.tar.bz2/from/a/mirror,获取 PHP 源代码的 4.3.4 版。虽然 Apple 将一个 PHP 版本与 OS X 捆绑在了一起,但您仍需要编译您自己带OCI 支持的拷贝,以和 Oracle 一起工作。

安装 Oracle

当下载了数据库后,您将需要创建拥有数据库文件和后台程序过程的一个用户和一个用户组。打开一个终端窗口,键入以下命令,当出现提示时,输入您的口令:


shell$ sudo mkdir /Users/oracle
shell$ sudo nicl .-create /groups/dba passwd "*"
shell$ sudo nicl .-append /groups/dba gid 1521
shell$ sudo nicl .-append /groups/dba users oracle
shell$ sudo nicl .-append /groups/admin users oracle
shell$ sudo nicl .-create /users/oracle
shell$ sudo nicl .-append /users/oracle gid 1521
shell$ sudo nicl .-append /users/oracle uid 1521
shell$ sudo nicl .-append /users/oracle shell /bin/bash
shell$ sudo nicl .-append /users/oracle home /Users/oracle
shell$ sudo nicl .-append /users/oracle realname "OracleDB"
shell$ sudo chown oracle:dba /Users/oracle

您将注意到用户和用户组 ID 都被设为 1521,这是 Oracle 监听器的默认 TCP 端口。我在运行后台程序过程的用户帐号上采用了这个惯例 — 如果您已经有了一个用户 ID 为 1521 的用户或者想采用一个不同的惯例,请相应地修改命令。现在为 Oracle 用户设置口令:

shell$ sudo passwd oracle

接下来将您下载的 Oracle920DevRel.tar.gz 和 php-4.3.4.tar.bz2 文件转移到 Oracle 用户的主目录下,并修改它们的所有权:

shell$ sudo mv Oracle920DevRel.tar.gz php-4.3.4.tar.bz2/Users/oracle
    
shell$ sudo chown oracle:dba /Users/oracle/*

剩下的安装过程大部分都将以 Oracle 用户的身份完成,因此请打开另一个终端窗口并输入

shell$ sudo su - oracle

来切换到 Oracle 用户。

接下来的步骤是解压缩 Oracle920DevRel.tar.gz 档案文件并把它放在适当的地方。从 Oracle 用户的主目录启动,输入以下命令:

shell$ tar xzf Oracle920DevRel.tar.gz
(this will take a while, and at the end you will be left with an
'orahome' directory)
shell$ mkdir Source
shell$ mv orahome Source/9iR2
shell$ cd Source/9iR2
shell$ ln -s lib dylib

您的 ORACLE_HOME/Users/oracle/Source/9iR2。如果您想把它转移到其它地方,请务必建立符号链接,以便 Oracle 二进制文件能够找到它们所需的函数库。

要正确地创建一个数据库和运行 Oracle,您必须首先通过设置一些环境变量并调整默认的过程和内存限制来定制 Oracle 用户环境。在 Oracle 用户的主目录下创建一个包含以下内容的名称为 .bashrc.oracle 的文件:

# .bashrc.oracle - set up ENV for oracle users

# Change ORACLE_SID, HOST_NAME, and DOMAIN_NAME below to suit your
# environment
export ORACLE_SID=OSXDEV
export HOST_NAME=host
export DOMAIN_NAME=example.com

## You shouldn't have to change anything below here ##

# Root of All Oracle installation
# If you change this, set up symlinks so Oracle binaries can find libs
export ORACLE_HOME=/Users/oracle/Source/9iR2
# Same as ORACLE_HOME
export SRCHOME=$ORACLE_HOME
# Add Oracle binaries to path
export PATH=$ORACLE_HOME/bin:$PATH
# Required to find dynamic libraries
export DYLD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/lib:$DYLD_LIBRARY_PATH

# Set shell user limits
ulimit -c unlimited
ulimit -d unlimited
ulimit -s 65536

# Fix delete in SQL*Plus
stty erase ^H

# Alias for ease of movement
alias cdo="cd $ORACLE_HOME"

注意文件的开头设置了几个环境变量:ORACLE_SID、HOST_NAMEDOMAIN_NAME。修改它们的值,以适合您的环境。我试图使我的开发环境尽可能地保持与我的生产环境类似,因此我将把我的 ORACLE_SID 修改成和生产系统中的 ORACLE_SID 一样,同时可能在末尾添加 DEV,以指示它是一个开发例程。HOST_NAMEDOMAIN_NAME 变量由创建数据库的脚本和下面的网络配置文件使用 — 如果您的计算机没有 DNS 名,那么您应当能够使用默认值或将它修改为一个您偏好的名称,而不会有负面影响

当您的配置完成时,在 Oracle 主目录中创建或编辑一个名称为 .bashrc 的文件,并添加下面一行:

. ~/.bashrc.oracle

这将允许接下来作为 Oracle 用户登录时,自动从 .bashrc.oracle 中获取环境变量。命令存储在一个单独的文件中,以便计算机上需要使用 Oracle 的其它用户能够在他们的 .bashrc 文件中添加相同的行。

如果您已经创建了 .bashrc 文件,您可能还想调整您的路径,这可以通过包含下面这行来实现:

export PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:$PATH

要为您当前的 shell 激活环境,在提示符下输入相同的行:

shell$ .~/.bashrc.oracle

接下来,确保您的系统能够解析您为 HOST_NAME 设置的名称。使用 sudo (输入 Oracle 用户的口令)来编辑 /etc/hosts 文件,将下面这一行

127.0.0.1       localhost

改为

127.0.0.1       localhost HOST_NAME

其中,HOST_NAME 是您在 .bashrc.oracle 中设置的值。

创建一个数据库

现在您的 ORACLE_HOME 已经准备就绪,并且您的环境也得到了正确的配置,您可以创建一个数据库了。将列表 1 中的行拷贝到一个名称为 createDB 的文件中。

这个脚本创建了几个配置文件(init{ORACLE_SID}.ora、listener.oratnsnames.ora),然后创建数据库。这个脚本中有几个地方您可能想要修改 — 特别是当您在设置一个与当前的生产环境相对应的开发环境时。首先,您可以修改 LOG_DIRDATA_DIR 变量,以将您的数据库日志文件和数据文件放到另一个目录下。默认的目录是 $ORACLE_HOME/dbs

第二,在 "# Set up your INIT.ORA file" 行之后,您可以调整 init{ORACLE_SID}.ora 中的一些设置来反映您的生产环境,请记住您的开发例程的资源设置不需要和生产服务器的资源设置一样高。您可以从您的数据库管理员那请求您的生产文件 init.ora 的一个拷贝,在 Oracle9i 数据库管理员指南中提供了这些设置的一个详细的参考,该指南您可以在 http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96521/toc.htm 下找到(需要 OTN 会员资格)。

第三,您可以定制 Oracle 监听器后台程序和客户端的设置,方式是编辑 "# Set up your LISTENER.ORA file" 和 "# Set up your TNSNAMES.ORA file" 之后的部分。默认值是 IPC (进程间通信),但如果您需要有与数据库连接的远程客户端,您需要去掉 TCP 行的注释。如果您想要在您的 Mac 上使用 SQL*Plus,以和远程数据库一起工作,您还可以添加其它的例程到 TNSNAMES.ORA 文件中。

最后,您可以定制创建数据库的命令。例如,您将看到脚本创建了两个单独的表空间 — 一个名称为 "tmeda",另一个名称为 "imeda"。在我们的应用程序中,表在 "tmeda" 表空间中创建,索引在 "imeda" 表空间中创建,且表空间文件分别位于生产服务器上不同的磁盘分区中。您还可以修改数据文件和日志文件的大小来反映您的应用程序需要的空间数量。

当您根据您的环境对脚本进行了定制后,或者您确定脚本默认值就可行时,使该脚本可执行并运行它。注意脚本运行需要一段时间,并要使用很大数量的资源 — 当它运行时,您可能要去做点别的什么事情。比如,默认脚本在我的 12 英寸的 PowerBook G4 867 (640 MB 内存)上花了 30 分钟。

输入以下命令:

shell$ chmod 755 createDb
shell$ ./createDb

测试例程

在脚本完成运行之后,数据库和监听器将运行。要确认一切都工作正常,请通过 SQL*Plus 登录并执行以下命令:

shell$ sqlplus scott/tiger
SQL> select object_name from user_objects;

您将看到

OBJECT_NAME
    ------------------
BONUS
DEPT
EMP
PK_DEPT
PK_EMP
SALGRADE

选中 6 行。

恭喜!Oracle 已经在 OS X 上运行了。这时,您可以修改默认的口令、创建用户和加载您的应用程序。如果您已经修改了 $ORACLE_HOME/network/admin/tnsnames.ora 文件,您还可以与远程的 Oracle 例程连接。

您可以使用下面的脚本来启动和停止 Oracle 数据库和监听器。

#!/bin/sh

# Use to start and stop the Oracle database
# Must be run by oracle user or member of DBA group

start() {
$ORACLE_HOME/bin/sqlplus /nolog <<__EOF__
connect / as sysdba
startup
__EOF__
sleep 2
$ORACLE_HOME/bin/lsnrctl start
    }

stop() {
$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/sqlplus /nolog <<__EOF__
connect / as sysdba
shutdown abort
__EOF__
    }

if [ -z $ORACLE_HOME ]; then      
echo "You must define ORACLE_HOME" 1>&2
exit 2
fi

if ( !-d $ORACLE_HOME ]; then
echo "Unable to find ORACLE_HOME" 1>&2
exit 2
fi

case "$1" in
'start')
start
    ;;
'stop')
stop 
    ;;
    *)
echo "Usage:$0 { start | stop }"
exit 2
    ;;
esac

exit 0

把它放在 Oracle 用户路径(如果您已经按照上面的指导完成了操作,~/bin 将可以工作;只需先创建它)上的一个目录中,确保它是可执行的,然后按以下方式使用它:

shell$ oraclectl start
shell$ oraclectl stop
 

安装 PHP

现在 Oracle 已经安装并运行了,编译 PHP 是件轻而易举的工作。在 MAC OS X 安装中包含了 Apache Web server 和一个 PHP 模块,但您需要将 OCI 支持编译到您自己的定制模块中。首先备份该模块,Apple 提供了(在提示符下输入以下整行):

shell$ sudo mv /usr/libexec/httpd/libphp4.so/usr/libexec/httpd/
libphp4.so.apple

现在解压缩您从 php.net 下载的档案文件:

shell$ tar xjf php-4.3.4.tar.bz2
shell$ cd php-4.3.4

PHP 使用标准的 "./configure; make; make install" autoconf 语法进行编译和安装,但在为 OS X 进行编译时,有几点需要记住,一个是 Apple 已经包含了您的 PHP 扩展所需的许多(但不是所有)支持函数库(如 XSLT 和图形支持)。如果没有包含您的应用程序所需的扩展的函数库,那么您将需要在编译 PHP 之前下载、编译和安装它们。有一些项目能够使管理第三方程序包的过程变得轻松,其中有 Fink (http://fink.sourceforge.net/) 和 DarwinPorts (http://darwinports.opendarwin.org/)。参见下面的“一个更好的 SQL*Plus”,了解一个使用 DarwinPorts 来安装 readline 函数库的例子。

尽管如此,目前您应当集中精力安装一个让您能够与 Oracle 通信的基础 PHP 模块。您可以修改下面的配置行来激活您的应用程序所需的扩展。

shell$ ./configure --with-apxs --with-oci8
shell$ make
shell$ sudo make install
 

在 Mac OS X Panther 自带的 Apache httpd.conf 文件中为您启用了 PHP 支持。不过,如果您在使用 Jaguar,那么您将需要自己来激活它 — 关于详细信息,请参见 http://www.php.net/manual/en/install.macosx.phphttp://developer.apple.com/internet/macosx/php.html

测试安装

为了确保 PHP 能够与 Oracle 连接,在 /Library/Webserver/Documents/test_oci.php 中创建一个包含以下内容的文件:

   <?php

        // Set this to the value you set in ~oracle/.bashrc.oracle
        $sid = 'OSXDEV';

        //
        // You shouldn't have to change anything below here
        //
        $home='/Users/oracle/Source/9iR2';
        putenv("ORACLE_HOME=$home");
        putenv("ORACLE_SID=$sid");
        putenv("TNS_ADMIN=$home/network/admin");

        echo "<html><head><title>Test OCI</title></head><body>\n";

        // Persistent connections are recommended for OCI
        $conn = OCIPlogon('scott', 'tiger', $sid);
        if ($conn) {
            $stmt = OCIParse($conn, "SELECT TO_CHAR(SYSDATE,
                                     'YYYY-MM-DD HH24:MI:SS') AS datetime 
                                     FROM DUAL");
            if ($stmt) {                                         
                if (OCIExecute($stmt)) {                             
                    while (OCIFetchInto($stmt, $row, OCI_ASSOC)) {        
                        // keys from OCI_ASSOC are always UPPERCASE 
                        echo "SYSDATE: ", $row['DATETIME'];
                    }                                                     
                }
            }
        }

        echo "</body></html>\n";
    ?> 

$sid 变量的值修改为您在 .bashrc.oracle 中设置的值,然后启动 Web server:

shell$ sudo apachectl start

您现在可以使您的浏览器指向 http://127.0.0.1/test_oci.php,然后您将看到当前的日期和时间。刷新您的浏览器若干次,观察时间改变,注意页面显示要比第一次快得多。永久连接是使用 Oracle 和 PHP 所必需的。

PHP 的 OCI 扩展支持许多高级的 Oracle特性,如存储过程、连接变量和游标。关于使用 OCI 和 PHP 的更多信息可以在这里找到:

一个更好的SQL*Plus

最后,我想向您介绍一个工具,这个工具使得作为 Oracle 开发人员的我的工作变得轻松了许多。Ljubomir J. Buturovic 创建了 gqlplus,SQL*Plus 的一个包装器。这个包装器使用GNU readline 函数库来增加命令行历史、编辑和表/列名称完成功能。它可以在大多数类似 UNIX 的系统上运行,下载包含了 Linux/Intel、Solaris/SPARC、OSF1/Alpha、IRIX 和 OSX/PPC 平台的二进制文件。

不过,有一点要注意:正如我之前所提到的,Apple 没有包含一些对使用 OS X 进行开发非常有用的函数库,因此在使用 gqlplus 之前,您需要安装 readline 函数库。出于这个目的,我选择了使用 DarwinPorts 集合,但您当然也可以使用 Fink 或者从 GNU 项目中取出源代码,并自己编译它。

首先,下载 DarwinPorts 集合的最新的快照,然后构建并安装端口工具:

shell$ curl -O http://darwinports.opendarwin.org/
darwinports-nightly-cvs-snapshot.tar.gz
shell$ tar zxf darwinports-nightly-cvs-snapshot.tar.gz
shell$ cd darwinports/base
shell$ ./configure --prefix=/usr/local
shell$ make
shell$ sudo make install

我选择将 /usr/local 作为已安装端口的主目录,因为许多程序包默认在那里查找函数库。当安装了端口工具时,您可以安装 readline:

shell$ cd ../dports
shell$ sudo port install readline

DarwinPorts 自动获取源代码,并配置、编译和安装函数库。现在您需要做的全部就是从 http://prdownloads.sourceforge.net/gqlplus/gqlplus-1.8.tar.gz?download 下获取 gqlplus,然后解压缩并安装它。因为 SourceForge 使得不通过浏览器进行下载非常困难,所以在接下来的步骤中,您将可能需要切换回您的用户帐号。

shell$ cd Desktop   # (or wherever you downloaded the file)
shell$ tar zxf gqlplus-1.8.tar.gz
shell$ sudo cp gqlplus-1.8/OSX/gqlplus /usr/local/bin 

现在切换回 Oracle 用户,然后使用和 SQL*Plus 下一样的语法来试验它:

shell$ gqlplus scott/tiger

请尝试各种行编辑命令 — 在 http://cnswww.cns.cwru.edu/php/chet/readline/rluserman.html 下提供了一个在线帮助。

结论

Oracle、Mac OS X 和开放源代码技术(如 PHP 和 gqlplus)正一起创建一个令人愉快、高效和稳定的开发环境。Oracle 对完全支持 OS X 上的 Oracle Database 10g 版本的承诺为那些想探索 Mac 的用户消除了最后一个障碍。


Matt Rohrer 是 Prognostikos — 一个专门从事 web 应用程序开发和 UNIX 系统管理的技术咨询公司 — 的负责人。他还偶尔受雇作为 Oracle 数据库管理员。他的时间一部分在俄勒冈州的波特兰度过,另一部分则在他的妻子和儿子居住的一个丹麦小镇上与家人分享。


请评价这篇文章:

极好 一般 较差 很差

将您的意见发送给我们

寄送此页面
Printer View 打印机视图