为 OTN 撰稿
为 Oracle 技术网撰写技术文章,提升技术技能。
了解更多信息
密切关注
OTN 架构师社区
OTN ArchBeat 博客 Facebook Twitter YouTube 随身播图标

在 Oracle HTTP Server 12c 上安装 PHP

作者:Christopher Jones

2014 年 4 月

下载
download-icon13-1Oracle HTTP Server

简介

本文介绍如何在 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

安装 Oracle Linux

本文使用 64 位 Oracle Linux 6,可从 http://public-yum.oracle.com/ 免费获取。

请按照该站点上的说明安装操作系统。

安装 Oracle HTTP Server

在本文中,OHS 安装为独立域,采用默认设置:

  1. 创建用户 oracle,主目录为 /home/oracle

  2. oracle.com 下载 Oracle HTTP Server 12.1.2 并解压缩:

    $ cd /home/oracle
    $ unzip ofm_ohs_linux_12.1.2.0.0_64_disk1_1of1.zip
    
  3. 运行安装程序

    $ ./ohs_121200_linux64.bin
    $ cd /home/oracle/Oracle/Middleware/Oracle_Home/common/bin
    $ ./config.sh
    

有关安装详细信息,请参见 OHS 文档

安装 Oracle Instant Client 12c

PHP OCI8 扩展需要免费的 Oracle Instant Client。

  1. OTN 下载 Instant Client“基本”RPM

    如果要从源代码构建 PHP,您还需要“devel”软件包。

  2. 以 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 软件包包括 PHP-FPM,也可以安装它们。也可以从源代码编译 PHP。

安装 PHP 软件包

https://oss.oracle.com/projects/php/ 上的 PHP 二进制文件可用在 64 位 Oracle Linux 6 或 RHEL 6 上进行测试。

  1. 在本文中,下载并安装 php55php55-cliphp55-commonphp55-fpmphp55-oci8-12cR1 RPM:

    # rpm -ivh php55*.rpm
    
  2. 运行命令行 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 源代码

如果包含 PHP-FPM 组件的 PHP 二进制文件不适用于您的系统,可以从源代码构建 PHP。下面是构建 PHP 并将其安装在 /opt 中的步骤。免费的《Underground PHP and Oracle Manual》中讨论了其他各种 PHP 安装方法。

  1. php.net 下载 PHP 5.5 并解压缩:

    # tar -jxf php-5.5.11.tar.bz2
    
  2. 配置包含 PHP-FPM 模块的 PHP:

    # cd php-5.5.11
    # ./configure --prefix=/opt/php55 --enable-fpm
    

    可以根据需要添加其他扩展。

  3. 构建和安装 PHP:

    # make
    # make install
    
  4. 创建 PHP 配置文件:

    # cp php.ini-development /opt/php55/lib/php.ini
    

    编辑 php.ini 并设置时区,例如:

    date.timezone = America/Los_Angeles
    
  5. 创建 PHP-FPM 配置文件。

    # cp /opt/php55/etc/php-fpm.conf.default /opt/php55/etc/php-fpm.conf
    

安装适用于 Oracle 数据库的最新 PHP OCI8 扩展

虽然构建 PHP 时可能已经配置了 PHP 源代码附带的 PHP OCI8 版本,PHP PECL 信息库始终有最新的副本。

  1. 如果您装有防火墙,请将 PHP 软件包管理器配置成可以穿过防火墙:

    # /opt/php55/bin/pear config-set http_proxy http://example.com:80/
    
  2. 安装 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
    
  3. 编辑 PHP 配置文件 /opt/php55/lib/php.ini,添加以下代码行:

    extension = oci8.so
    
  4. 运行命令行 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
    

配置 PHP-FPM

/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

最后一项配置是更新 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:9000php-fpm.conf 中的 PHP-FPM 默认值匹配。

启动 PHP-FPM

可以通过以下方式启动 PHP-FPM:

# /opt/php55/sbin/php-fpm

如果安装了 PHP 软件包,可以将 PHP-FPM 作为一个服务启动:

# service php-fpm start

要停止 PHP-FPM,可以结束其进程或者停止服务。

启动 OHS

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。

测试 PHP

显示 PHP 配置

创建 /var/www/html/pi.php,其中包含:

<?php
    phpinfo();
?>

在浏览器中加载 http://localhost:7890/pi.php

将显示 PHP 配置:

jones-php-ohs-fig01
图 1:phpinfo() 输出顶部显示系统详细信息、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):"&nbsp;";
        echo "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

?>

编辑用户凭证和连接字符串。在浏览器中加载 http://localhost:7890/oci8.php。显示可用模式对象列表:

jones-php-ohs-fig02
图 2:HR 模式对象名称和类型表

总结

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

关于作者

Christopher Jones 是 Oracle 的高级首席产品经理。
Twitter 博客 LinkedIn