phpでOracle(XE)


## 序章
phpでOracleを使おうとした際にいろいろ詰まったりしたので、
構築手順を残しておきます。

## 環境
+ Mac OS X El Capitan 10.11.6
+ VirtualBox 5.0.8 for OS X hosts
+ Vagrant 1.7.4
+ CentOS release 6.5
+ Oracle Database Express Edition 11g Release 2 for Linux x64

## 第一章：Oracle(XE)インストール
```:Oracle(XE)パッケージダウンロード
http://www.oracle.com/technetwork/jp/database/database-technologies/express-edition/downloads/index.html
```

```bash:Oracle(XE)パッケージ転送
vagrant ssh-config > ssh.config
scp -F ssh.config oracle-xe-11.2.0-1.0.x86_64.rpm.zip vagrant@default:~/
```

```
vagrant ssh
```

Oracle(XE) 稼働条件：スワップ領域 2048MB
によりスワップ設定

```bash:スワップ設定
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile
sudo swapon /swapfile
sudo sh -c "echo '/swapfile swap swap defaults 0 0' >> /etc/fstab" # 再起動でも有効に
```

ホスト名は環境によって異なります。ここでは「vagrant-centos65.vagrantup.com」

```bash:Oracle(XE)用にホスト追加
sudo vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 vagrant-centos65.vagrantup.com
```

```bash:Oracle(XE)インストールに必要なものインストール
sudo yum -y install bc
```

```bash:作業ディレクトリ作成
mkdir oracle
mv oracle-xe-11.2.0-1.0.x86_64.rpm.zip oracle/
cd oracle
```

```bash:Oracle(XE)インストール
unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip 
cd Disk1
sudo rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
```

設定は任意、ここではデフォルト設定、パスワードは「p」で設定します。

```bash:Oracle(XE)環境設定
sudo /etc/init.d/oracle-xe configure

Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express 
Edition.  The following questions will determine whether the database should 
be starting upon system boot, the ports it will use, and the passwords that 
will be used for database accounts.  Press <Enter> to accept the defaults. 
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:   
Specify a port that will be used for the database listener [1521]:

Specify a password to be used for database accounts.  Note that the same
password will be used for SYS and SYSTEM.  Oracle recommends the use of 
different passwords for each database account.  This can be done after 
initial configuration:p
Confirm the password:p

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:y
```

Oracle(XE)パス設定等で「LC_CTYPE」「LC_MESSAGES」「LC_ALL」がないとエラーが出るので

```bash:locale設定
sudo localedef -f UTF-8 -i ja_JP ja_JP.utf8
```

Oracle(XE)パス設定等をログイン後有効にするため、「. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh」をbashrc設定

```bash:bashrc設定
vi ~/.bashrc 
```

```vim:bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and function

. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
```

```bash:現ログインでOracle(XE)パス設定等有効に
source ~/.bashrc
```

```bash:Oracleテストユーザ、テストデータ用意
sqlplus system/p@localhost
create user test identified by "test";       
grant dba to test;
exit;
sqlplus test/test@localhost
create table test (id integer, name varchar2(50));
insert into test values(1, 'test1');
insert into test values(2, 'test2');
exit;
```

## 第二章：oci8(PHPからOracle(XE)接続用モジュール)インストール
```bash:apache、phpインストール
sudo yum -y install httpd
sudo chkconfig httpd on # httpd自動起動
sudo yum -y install php
sudo yum -y install php-pear # pecl用
sudo yum -y install php-devel # phpize用
```

PHPバージョンから
https://pecl.php.net/package/oci8
に記載されているoci8バージョンをインストール
ここではPHP5.3.3により、oci8-1.4.10
また、Oracle Instant Clientではないので、ORACLE_HOMEのパスを設定します。ここでは「/u01/app/oracle/product/11.2.0/xe」

```bash:oci8インストール
export | grep 'ORACLE_HOME' # ORACLE_HOME確認
sudo pecl install oci8-1.4.10
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] : /u01/app/oracle/product/11.2.0/xe
```

phpでoci8が使えるよう「extension=oci8.so」追加設定


```bash:php.ini設定
sudo cp /etc/php.ini /etc/php.ini.org # 元設定バックアップ
sudo vi /etc/php.ini
```

```vim:php.ini
extension=oci8.so
```

apacheでOracle(XE)パス設定等を有効にするため、「. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh」をsysconfig設定

```bash:sysconfig設定
sudo vi /etc/sysconfig/httpd
```

```vim:sysconfig
. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh
```

oracle用に追加したホストをapacheのサーバー名に設定しておく(apache起動時に警告が出るから)

```bash:httpd.conf設定
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org # 元設定バックアップ
sudo vi /etc/httpd/conf/httpd.conf
```

```vim:httpd.conf
#ServerName www.example.com:80
ServerName vagrant-centos65.vagrantup.com:80
```

## 終章：Oracle(XE)接続確認
```
sudo service httpd start
```

```bash:Oracle(XE)接続確認用PHP作成
sudo vi /var/www/html/test.php
```

```php:Oracle(XE)接続確認用PHP
<?php

// "localhost" マシン上の XE サービス(例えばデータベース)に接続します。
$conn = oci_connect('test', 'test', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM test');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

?>
```

```
sudo chown -R apache:apache /var/www/html
```

これで下記にアクセスし、テストデータが表示されればOK
http://192.168.33.10/test.php

## 参考
[Varagnt 環境の CentOS 6.6 に Oracle XE(11g Release 2) を導入してみる](https://qiita.com/murachi1208/items/36a226c40fdb8436ec7a)
[vagrantで立てたvmにswapを設定する。](http://www.mogumagu.com/wp/wordpress/archives/1505)