在 Homestead 环境下为 PHP 添加 Oracle 数据库扩展(OCI)

个人学习、练手的项目需要连接Oracle数据库,但是homestead环境中php默认未添加Oracle数据库扩展,以下是OCI扩展安装操作过程记录。

1.参考资料

Homestead Oracle instant client (oci8, pdo_oci)
Ubuntu PHP7 安装PDO Oracle和OCI8

2. 软件版本

homestead v7.8.0
php 7.2.19

3. 操作过程

3.1.准备

ssh登录homestead

$ vagrant ssh
cd ~

apt安装必要软件包

sudo apt-get update
sudo apt-get install -y alien wget # 用于安装 rpm 格式软件包
sudo apt-get install php7.2-dev # 用于安装 phpize
sudo apt-get install php-pear
sudo apt-get install libaio1

下载oracle简易客户端

Oracle官网下载oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm和
oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm ,复制到 homestead~/下;

3.2.安装配置

安装oracle简易客户端,默认安装路径:/usr/lib/oracle/12.2/client64

sudo alien -i oracle-instantclient*-basic-*.rpm
sudo alien -i oracle-instantclient*-devel-*.rpm

配置oracle简易客户端

sudo sh -c 'echo "env[ORACLE_HOME] = /usr/lib/oracle/12.2/client64" >> /etc/php/7.2/fpm/pool.d/www.conf'
sudo sh -c 'echo "env[LD_LIBRARY_PATH] = /usr/lib/oracle/12.2/client64/lib" >> /etc/php/7.2/fpm/pool.d/www.conf'
sudo sh -c 'echo "/usr/lib/oracle/12.2/client64/lib" >> /etc/ld.so.conf.d/oracle.conf'
sudo ldconfig  # 更新动态链接器运行时绑定
sudo sh -c 'echo "export ORACLE_HOME=/usr/lib/oracle/12.2/client64/" >> /etc/profile'
sudo sh -c 'echo "export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64:\$LD_LIBRARY_PATH" >> /etc/profile'
sudo sh -c 'echo "export NLS_LANG=\"AMERICAN_AMERICA.AL32UTF8\"" >> /etc/profile'
source /etc/profile  # 启用 profile 文件

安装oci8

# 下载已安装 php7 版本对应的 oci8 包,详情见:https://pecl.php.net/package/oci8
sudo pecl download oci8-2.2.0.tgz 
sudo pecl install oci8-2.2.0.tgz

安装 pdo oci

wget -nv http://th1.php.net/distributions/php-7.2.19.tar.gz # 下载已安装 php 版本对应的 php 源码包
tar xzf php-7.2.19.tar.gz
cd php-7.2.19/ext/pdo_oci
sudo phpize
sudo ./configure --with-pdo-oci=instantclient,/usr/lib/oracle/12.2/client64/lib
sudo make 
sudo make install

添加 oci8.so、pdo oci 扩展到 php.ini’

sudo sh -c 'echo "extension=oci8.so" >> /etc/php/7.2/fpm/php.ini'
sudo sh -c 'echo "extension=pdo_oci.so" >> /etc/php/7.2/fpm/php.ini'
sudo touch /etc/php/7.2/fpm/conf.d/20-oci.ini
sudo sh -c 'echo "extension=oci8.so" >> /etc/php/7.2/fpm/conf.d/20-oci.ini'
sudo touch /etc/php/7.2/fpm/conf.d/20-pdo_oci.ini
sudo sh -c 'echo "extension=pdo_oci.so" >> /etc/php/7.2/fpm/conf.d/20-pdo_oci.ini'

4. 验证

重启homestead

检查oci8

ldd /usr/lib/php/20170718/oci8.so

以下显示表示oci8.so安装正确:

在 Homestead 环境下为 PHP 添加 Oracle 数据库扩展(OCI)

检查pdo_oci

ldd /usr/lib/php/20170718/pdo_oci.so

以下显示表示pdo_oci.so安装正确:
在 Homestead 环境下为 PHP 添加 Oracle 数据库扩展(OCI)

phpinfo()验证

在 Homestead 环境下为 PHP 添加 Oracle 数据库扩展(OCI)

在 Homestead 环境下为 PHP 添加 Oracle 数据库扩展(OCI)
代码验证

<?php

//pdo_oci
$serverHost = "127.0.0.1";
$serverPort = "1521";
$username = "username";
$password = "password";
$dbName = "dbName";
$dsn = "oci:dbname=$serverHost/$dbName;charset=UTF8";
try {
    $crmPdo = new PDO($dsn, $username, $password);
} catch (PDOException $e) {
    echo('Oracle数据库连接失败( pdo_oci ):' . $e->getMessage());
}

//oci8
$dbstr = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ORACLEIP)(PORT=1521))(CONNECT_DATA=(SID=ORACLESID)))";
if ($conn = oci_connect($username, $password, $dbstr)):
    print "CONNECTED OK!!";
else:
    print "'Oracle数据库连接失败( oci8 )";
endif;
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1

添加 oci8.so、pdo oci 扩展到 php.ini

sudo touch /etc/php/8.0/mods-available/oci8.ini
sudo sh -c 'echo "extension=oci8.so" >> /etc/php/8.0/mods-available/oci8.ini'
sudo ln -s /etc/php/8.0/mods-available/oci8.ini /etc/php/8.0/fpm/conf.d/20-oci8.ini
sudo ln -s /etc/php/8.0/mods-available/oci8.ini /etc/php/8.0/cli/conf.d/20-oci8.ini

sudo touch /etc/php/8.0/mods-available/pdo_oci.ini
sudo sh -c 'echo "extension=pdo_oci.so" >> /etc/php/8.0/mods-available/pdo_oci.ini'
sudo ln -s /etc/php/8.0/mods-available/pdo_oci.ini /etc/php/8.0/fpm/conf.d/20-pdo_oci.ini
sudo ln -s /etc/php/8.0/mods-available/pdo_oci.ini /etc/php/8.0/cli/conf.d/20-pdo_oci.ini

sudo service php8.0-fpm restart
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!