文章
动态脚本语言
| |||
|
作者:Christopher Jones
2014 年 4 月
本文介绍如何在 Oracle HTTP Server 12c (OHS) 上安装 PHP。PHP 是一种非常受欢迎的解释脚本语言,通常用于 Web 应用。OHS 是 Oracle 融合中间件的 Web 服务器组件。它基于 Apache HTTP Server。
OHS 包括一个 FastCGI 模块,可轻松配置成使用 PHP 的绑定 FastCGI 进程管理器(“PHP-FPM”)。PHP-FPM 已成为标准的 PHP 安装方式。它可以替代 PHP 的 FastCGI 接口,拥有高级进程管理等额外特性。有关详细信息,请参见 PHP 文档和 php-fpm.org。
本文使用 64 位 Oracle Linux 6,可从 http://public-yum.oracle.com/ 免费获取。
请按照该站点上的说明安装操作系统。
在本文中,OHS 安装为独立域,采用默认设置:
创建用户 oracle,主目录为 /home/oracle
从 oracle.com 下载 Oracle HTTP Server 12.1.2 并解压缩:
$ cd /home/oracle $ unzip ofm_ohs_linux_12.1.2.0.0_64_disk1_1of1.zip
运行安装程序
$ ./ohs_121200_linux64.bin $ cd /home/oracle/Oracle/Middleware/Oracle_Home/common/bin $ ./config.sh
有关安装详细信息,请参见 OHS 文档。
PHP OCI8 扩展需要免费的 Oracle Instant Client。
从 OTN 下载 Instant Client“基本”RPM
如果要从源代码构建 PHP,您还需要“devel”软件包。
以 root 用户的身份安装 RPM:
# rpm -ivh oracle-instantclient12.1-basic-12.1.0.1.0-1.x86_64.rpm # rpm -ivh oracle-instantclient12.1-devel-12.1.0.1.0-1.x86_64.rpm
不要向 ld.so.conf 添加新的 Instant Client 库目录,因为这会导致使用 OHS 中包含的旧 Oracle 库的软件冲突。
如果为系统预先提供的 PHP 软件包包括 PHP-FPM,也可以安装它们。也可以从源代码编译 PHP。
https://oss.oracle.com/projects/php/ 上的 PHP 二进制文件可用在 64 位 Oracle Linux 6 或 RHEL 6 上进行测试。
在本文中,下载并安装 php55、php55-cli、php55-common、php55-fpm 和 php55-oci8-12cR1 RPM:
# rpm -ivh php55*.rpm
运行命令行 PHP,检查 PHP OCI8 扩展是否可用:
# php --ri oci8 oci8 OCI8 Support => enabled OCI8 DTrace Support => disabled OCI8 Version => 2.0.8 Revision => $Id: f04114d4d67cffea4cdc2ed3b7f0229c2caa5016 $ Oracle Run-time Client Library Version => 12.1.0.1.0 Oracle Compile-time Instant Client Version => 12.1 Directive => Local Value => Master Value oci8.max_persistent => -1 => -1 oci8.persistent_timeout => -1 => -1 oci8.ping_interval => 60 => 60 oci8.privileged_connect => Off => Off oci8.statement_cache_size => 20 => 20 oci8.default_prefetch => 100 => 100 oci8.old_oci_close_semantics => Off => Off oci8.connection_class => no value => no value oci8.events => Off => Off Statistics => Active Persistent Connections => 0 Active Connections => 0
如果包含 PHP-FPM 组件的 PHP 二进制文件不适用于您的系统,可以从源代码构建 PHP。下面是构建 PHP 并将其安装在 /opt 中的步骤。免费的《Underground PHP and Oracle Manual》中讨论了其他各种 PHP 安装方法。
从 php.net 下载 PHP 5.5 并解压缩:
# tar -jxf php-5.5.11.tar.bz2
配置包含 PHP-FPM 模块的 PHP:
# cd php-5.5.11 # ./configure --prefix=/opt/php55 --enable-fpm
可以根据需要添加其他扩展。
构建和安装 PHP:
# make # make install
创建 PHP 配置文件:
# cp php.ini-development /opt/php55/lib/php.ini
编辑 php.ini 并设置时区,例如:
date.timezone = America/Los_Angeles
创建 PHP-FPM 配置文件。
# cp /opt/php55/etc/php-fpm.conf.default /opt/php55/etc/php-fpm.conf
虽然构建 PHP 时可能已经配置了 PHP 源代码附带的 PHP OCI8 版本,PHP PECL 信息库始终有最新的副本。
如果您装有防火墙,请将 PHP 软件包管理器配置成可以穿过防火墙:
# /opt/php55/bin/pear config-set http_proxy http://example.com:80/
安装 PHP OCI8:
# /opt/php55/bin/pecl install oci8
提示输入 ORACLE_HOME 时,按 Enter 允许自动检测 Instant Client RPM:
downloading oci8-2.0.8.tar ... Starting to download oci8-2.0.8.tar (Unknown size) ......done: 1,608,704 bytes 11 source files, building running: phpize Configuring for: PHP Api Version: 20121113 Zend Module Api No: 20121212 Zend Extension Api No: 220121212 Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] : ...
忽略有关不匹配 php_suffix 的任何试探性警告。
如果已经从 ZIP 文件安装了 Instant Client,例如,安装到 /home/oracle/instantclient_12_1 中,用以下信息回答 ORACLE_HOME 提示:
instantclient,/home/oracle/instantclient_12_1
由于变量不会展开,该目录使用绝对路径。
对于 ZIP Instant Client,确保在安装 PHP OCI8 之前创建共享客户端库符号链接:
# cd /home/oracle/instantclient_12_1 # ln -s libclntsh.so.12.1 libclntsh.so
编辑 PHP 配置文件 /opt/php55/lib/php.ini,添加以下代码行:
extension = oci8.so
运行命令行 PHP,检查 PHP OCI8 扩展是否可用:
$ /opt/php55/bin/php --ri oci8 oci8 OCI8 Support => enabled OCI8 DTrace Support => disabled OCI8 Version => 2.0.8 Revision => $Id: f04114d4d67cffea4cdc2ed3b7f0229c2caa5016 $ Oracle Run-time Client Library Version => 12.1.0.1.0 Oracle Compile-time Instant Client Version => 12.1 Directive => Local Value => Master Value oci8.max_persistent => -1 => -1 oci8.persistent_timeout => -1 => -1 oci8.ping_interval => 60 => 60 oci8.privileged_connect => Off => Off oci8.statement_cache_size => 20 => 20 oci8.default_prefetch => 100 => 100 oci8.old_oci_close_semantics => Off => Off oci8.connection_class => no value => no value oci8.events => Off => Off Statistics => Active Persistent Connections => 0 Active Connections => 0
/opt/php55/etc/php-fpm.conf(如果已经安装了 PHP 软件包,则为 /etc/php-fpm.conf)中的配置选项很好地总结了 PHP-FPM 的强大功能。您看能看到监听、监视、池化或日志记录等设置。
本文是针对 Oracle Linux 的,所以使用默认 PHP-FPM 配置即可。
如果要设置 Oracle 环境变量,可将其添加到 php-fpm.conf。例如,如果要将 Oracle 全球化设置更改为法国区域设置,请添加:
# Use a globalization environment for France env[NLS_LANG] = FRENCH_FRANCE.AL32UTF8 # Set the Oracle decimal and group separators to avoid PHP # string-to-number conversion issues (NLS_NUMERIC_CHARACTERS is only # read if NLS_LANG is also set) env[NLS_NUMERIC_CHARACTERS] = .,
在某些平台上,可能还需要将 LD_LIBRARY_PATH 设置为 Instant Client 库目录,例如:
env[LD_LIBRARY_PATH] = /home/oracle/instantclient_12_1:$LD_LIBRARY_PATH
最后一项配置是更新 OHS,将 PHP 请求转发到 PHP-FPM。生产环境中的确切配置方法取决于拓扑和安全目标。下例创建一个基本的虚拟主机,监听端口 7890,文档根目录为 /var/www/html。对该目录中 PHP 资源的任何请求将由 PHP 处理。
创建一个新配置文件 $DOMAIN_HOME/config/fmwconfig/components/OHS/ohs1/moduleconf/php.conf,其中 DOMAIN_HOME 为 /home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain
在本例中,php.conf 文件包含:
LoadModule fastcgi_module "${PRODUCT_HOME}/modules/mod_fastcgi.so"
<IfModule mod_fastcgi.c>
Listen 7890
<VirtualHost *:7890>
ServerName fpmtest.localhost
DocumentRoot /var/www/html
FastCGIExternalServer /var/www/html/php-fpm -host 127.0.0.1:9000
<Directory /var/www/html>
Order allow,deny
Allow from all
<FilesMatch \.php$>
SetHandler application/x-httpd-fastphp5
</FilesMatch>
Action application/x-httpd-fastphp5 /php-fpm
</Directory>
</VirtualHost>
</IfModule>
FastCGI 服务器主机和套接字 127.0.0.1:9000 与 php-fpm.conf 中的 PHP-FPM 默认值匹配。
可以通过以下方式启动 PHP-FPM:
# /opt/php55/sbin/php-fpm
如果安装了 PHP 软件包,可以将 PHP-FPM 作为一个服务启动:
# service php-fpm start
要停止 PHP-FPM,可以结束其进程或者停止服务。
以 oracle 用户身份启动 Node Manager 和 OHS:
$ export DOMAIN_HOME=/home/oracle/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain $ nohup $DOMAIN_HOME/bin/startNodeManager.sh > nm.out & $ $DOMAIN_HOME/bin/startComponent.sh ohs1
您需要提供 OHS 安装期间创建的密码。
可以通过以下方式停止 OHS:
$ $DOMAIN_HOME/bin/stopComponent.sh ohs1
可以通过结束进程停止 Node Manager。
创建 /var/www/html/pi.php,其中包含:
<?php
phpinfo();
?>
在浏览器中加载 http://localhost:7890/pi.php。
将显示 PHP 配置:

要测试 Oracle 数据库脚本,创建一个新文件 /var/www/html/oci8.php,其中包含:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
$c = oci_connect("hr", "welcome", "localhost/XE");
if (!$c) {
$m = oci_error();
trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
}
$s = oci_parse($c, "select * from cat");
$r = oci_execute($s);
echo "<table border='1'>\n";
while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo "<tr>";
foreach ($row as $item) {
echo "<td>";
echo $item!==null?htmlspecialchars($item, ENT_QUOTES|ENT_SUBSTITUTE):" ";
echo "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
编辑用户凭证和连接字符串。在浏览器中加载 http://localhost:7890/oci8.php。显示可用模式对象列表:

PHP-FPM 很强大,可以轻松地将 PHP 和 Oracle 融合中间件结合使用。它允许广泛控制 PHP 拓扑,从而为高流量 Web 应用提供了极大的灵活性。与以 Apache 模块的形式安装 PHP 不同,PHP-FPM 仍然保持了 PHP 与 OHS 的默认 Oracle 库分离。这样,PHP OCI8 扩展就能干净利落地与最新 Instant Client 库或 PHP 应用要求的任何特定版本链接。
如果本文对您有帮助,您可能有兴趣阅读免费的《Underground PHP and Oracle Manual》,其中包含有关如何结合使用 PHP OCI8 和 Oracle 数据库的丰富信息。