(原谅我是linux小白,之间在家里搭开发环境都是在windows下面,很方便,这次因为要跟单位里的linux环境相同,尝试着搭一个linux环境,结果折腾了一天一夜,技艺不精啊。)
Oracle是原来就安装好的,在windows7宿主机上。
然后windows7安装virtual box,然后安装了最新的64位CentOS7。
设置虚拟机的桥接网络就用了前半夜,后来不知道怎么就自己好了。
已经不记得是怎么弄的了,估计下次再装虚拟机再设桥接还是会有问题。
下半夜才开始部署php+apache开发环境。
CentOS选择了全部安装。所以装完之后apache(httpd)和php就有了。
修改一下DocumentRoot(etc/httpd/conf/httpd.conf),放一个phpinfo.php,直接能运行了。
(注意,httpd关于php的设置在这里:/etc/httpd/conf.d/php.conf)
当然,一开始用我的另外笔记本浏览,80端口不通;用root修改CentOS的防火墙设置。
设完后,80端口通了,但是打开html可以,但是打开php报403错误,研究了一下,是SELinux在捣鬼。
然后去Oracle下载了oracle12c的64位client
解压,按照docs.google.com上的官方文档进行安装。文档很长很详细,记不太住了,最主要是先建好oinstall组和oracle用户。
用图形界面安装,一开始还碰到oracle universal installer界面乱码问题,网上搜问题,找到一个方法:
在图形安装前export LC_CTYPE=en_US.iso88591
然后执行图形界面安装就不是乱码了。 安装过程跟在windows上是基本一致的。
一开始会检验到几个包没有,就用安装光盘挂载镜像,然后在package找到相应包直接安装。
全都安装完后,再次执行oracle client图形界面安装,顺利完成。
设置tns,sqlplus测试,到主机上的数据库连接成功。
接着,写个test.php,里面用oci_connect()测试一下,报函数不存在,看来是oci8包没有。
找到/etc/php.ini,有一段内容:
;;;;
; Note: packaged extension modules are now loaded via the .ini files
; found in the directory /etc/php.d; these are loaded by default.
;;;;
到/etc/php.d目录下,没有oci的ini,估计没有安装oci8的extension
按照网上的方法和《Underground PHP and Oracle Manual》这本书,我直接简单粗暴的用pecl install oci8命令在线安装了oci8
(虚拟机桥接后有自己的IP,通过家里的路由器上互联网)
安装时又报错,缺少phplevel什么的(不记得是不是这个名字了),然后再简单粗暴的用yum install安装phplevel
然后再pecl install oci8(过程中会要求你指定oracle_home,注意安装前先停止apache)
装完之后,在/etc/php.d中增加一个oci8.ini,里面写extension=oci8.so
完了,重启apache,网页打开test.php,报错:
Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories in/www/htdocs/test.php on line 5
Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804 in/www/htdocs/test.php on line 5
easy,不就是环境变量没设么,在/etc/profile里加一下export ORACLE_HOME=XXX export LD_LIBRARY_PATH=XXX
加完之后,root重新签到,重启apache,在命令行里用php test.php执行,显示连接数据库成功,然后浏览器打开test.php
然后是这个报错!
Warning: oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that ORACLE_HOME and LD_LIBRARY_PATH are set and point to the right directories in/www/htdocs/test.php on line 5
Warning: oci_connect(): Error while trying to retrieve text for error ORA-01804 in/www/htdocs/test.php on line 5
蛋疼啊。
整个下半夜都在网上搜这是什么问题。
先是改apache的用户,httpd.conf改User和Group,不行。
在httpd.conf加setenv,不行;按网上的说明用PassEnv,也不起作用。
网上找了好久好久都没找到解决方法,还有按照《Underground PHP and Oracle Manunal》的书,
在/etc/sysconfig/httpd增加:
export ORACLE_HOME=/oracle/product/12.1.0/client_1
export LD_LIBRARY_PATH=/oracle/product/12.1.0/client_1/lib:$LD_LIBRARY_PATH
还是解决不了问题。
凌晨3点了,先睡觉。
第二天(今天),再尝试一些方法,再搜索一些问题。
最后去看apache的error log,发现有这么两行:
[Sun Dec 21 14:54:17.506549 2014] [env:warn] [pid 23077] AH01506: PassEnv variable ORACLE_HOME was undefined
[Sun Dec 21 14:54:17.506566 2014] [env:warn] [pid 23077] AH01506: PassEnv variable LD_LIBRARY_PATH was undefined
PassEnv是我用在httpd.conf里的(
PassEnv ORACLE_HOME
PassEnv LD_LIBRARY_PATH
)
虽然知道了是apache没获取到ORACLE_HOME和LD_LIBRARY_PATH的环境变量值,但是注意到phpinfo显示的environment只有
Environment
Variable | Value |
---|---|
PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin |
LANG | C |
NOTIFY_SOCKET | @/org/freedesktop/systemd1/notify |
KRB5RCACHETYPE | none |
没有Oracle_home和LD。当然是没有的。
然后去查看apachectl的内容,发现一段:
if [ -r /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
说明/etc/sysconfig/httpd文件还是有用的。然后突然意识到environment里LANG的值C就是在/etc/sysconfig/httpd文件里设置的,
只不过设置方法是:LANG=C,没有export
然后我立马改了/etc/sysconfig/httpd文件,把ORACLE_HOME和LD前面的export去掉,
变成:
ORACLE_HOME=/oracle/product/12.1.0/client_1
LD_LIBRARY_PATH=/oracle/product/12.1.0/client_1/lib
重启apache,phpinfo的environment有了ORACLE_HOME和LD了:
Environment
Variable | Value |
---|---|
PATH | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin |
LANG | C |
NOTIFY_SOCKET | @/org/freedesktop/systemd1/notify |
ORACLE_HOME | /oracle/product/12.1.0/client_1 |
LD_LIBRARY_PATH | /oracle/product/12.1.0/client_1/lib |
KRB5RCACHETYPE | none |
浏览器刷新test.php,数据库连接成功!
泪崩了。。。。。
参考:http://idefs.com/record-centos-configure-apache2php-7-oci8.html