| |||
|
作者: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 数据库的丰富信息。