<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/oci8.setup.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'oci8.installation.php',
    1 => 'インストール手順',
    2 => 'インストール手順',
  ),
  'up' => 
  array (
    0 => 'oci8.setup.php',
    1 => 'インストール/設定',
  ),
  'prev' => 
  array (
    0 => 'oci8.requirements.php',
    1 => '要件',
  ),
  'next' => 
  array (
    0 => 'oci8.test.php',
    1 => 'テスト',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/oci8/configure.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="oci8.installation" class="section">
 <h2 class="title">インストール手順</h2>


<div class="section" id="oci8.configure">
<h2 class="title">OCI8 とともに PHP を構成する</h2>
 <p class="para">
  OCI8 を構成する前に前述の <a href="oci8.requirements.php" class="link">要件</a> 節に
  目を通してください。 
 </p>
 <p class="para">
  Web サーバーを開始する前に、一般的に OCI8 はいくつかの Oracle 環境変数（下記参照）が必要です。
  それらはライブラリの場所を指定したり、構成ファイルを指示したり、
  Oracle ライブラリで使用する文字セットのような基本的ないくつかのプロパティを設定します。
  あらゆる PHP プロセスが開始される <em>前に</em>それらの変数を設定しなければいけません。
 </p>
 <p class="para">
  PHP を構成したのと同じか、またはより最新の Oracle ライブラリのメジャー・バージョンとともに PHP バイナリをリンクしなければいけません。
  例えば Oracle 19 ライブラリで OCI8 をビルドするなら、
  PHP も Oracle 19 ライブラリとともにデプロイして実行すべきです。
  PHP のアプリケーションは、それ以外のバージョンの Oracle データベースにも接続できます。
  Oracle のクライアントとサーバーの間には、異なるバージョン間での互換性があるからです。
 </p>
</div>
<div class="section">
 <h2 class="title">OCI8 を PECL から(pecl コマンド経由で) インストールする</h2>
 <p class="para">
  OCI8 拡張モジュールは、
  <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a> リポジトリを使えば
  既存の PHP のインストールに追加できます。
 </p>
 <p class="para">
  以下の手順で、自動インストールを行えます
 </p>
 <p class="para">
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     ファイアウォールの後ろにいる場合、以下のようにしてプロキシを設定します:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
pear config-set http_proxy http://my-proxy.example.com:80/
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     以下を実行します。
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
pecl install oci8
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
     PHP 7 以降では、<code class="literal">pecl install oci8-2.2.0</code> とします。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     プロンプトが出たら、
     <code class="literal">$ORACLE_HOME</code> または、
     <code class="literal">instantclient,/path/to/instant/client/lib</code> を入力して下さい。
    </p>
    <p class="para">
       注意: <code class="literal">$ORACLE_HOME</code> という値を入力しないで下さい。
       <code class="literal">pecl</code> はそれを展開しないからです。
       代わりに、展開済みのパスを入力するようにして下さい。
       たとえば、<code class="literal">/opt/oracle/product/19c/dbhome_1</code>
       や <code class="literal">instantclient,/Users/myname/Downloads/instantclient_19_8</code> のようなものです。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <code class="literal">oci8_dtrace_gen.h: No such file or directory</code> というエラーが発生した場合、
     PHP が <a href="features.dtrace.php" class="link">DTrace</a> を有効にしてビルドされているということです。
     この場合、以下のようにしてインストールして下さい:
    </p>
   <p class="para">
    <div class="informalexample">
     <div class="example-contents screen">
<div class="cdata"><pre>
$ export PHP_DTRACE=yes
$ pecl install oci8
</pre></div>
     </div>
    </div>
   </p>    
   </li>   
   <li class="listitem">
    <p class="para">
      <var class="filename">php.ini</var> ファイルを編集し、以下の一行を追加して下さい。
    </p>
    <p class="para">
      <div class="informalexample">
        <div class="example-contents screen">
          <div class="cdata"><pre>
extension=oci8.so
</pre></div>
        </div>
      </div>
    </p>
    <p class="para">
      <var class="filename">php.ini</var> のディレクティブ
      <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> が
      <var class="filename">oci8.so</var> をインストールしたディレクトリを差しているかを確認して下さい。
    </p>
   </li>
  </ul>
 </p>
</div>
<div class="section">
 <h2 class="title">OCI8 を PECL から(phpize 経由で) インストールする</h2>
 <p class="para">
  <code class="literal">pecl</code> コマンドが利用できない場合に、
  OCI8 を既存の PHP のインストールに追加するには、
  <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a> OCI8 パッケージを手動でダウンロードして下さい。
  たとえば、<var class="filename">oci8-3.0.0.tgz</var> をダウンロードします。
 </p>
 <p class="para">
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     パッケージを展開します:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
tar -zxf oci8-3.0.0.tgz
cd oci8-3.0.0
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     パッケージを準備します:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
phpize
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <code class="literal">$ORACLE_HOME</code> または
     Instant Client を使ってパッケージを設定します。
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure -with-oci8=shared,$ORACLE_HOME
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
      または
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure -with-oci8=shared,instantclient,/path/to/instant/client/lib
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     パッケージをインストールします:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
make install
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <code class="literal">oci8_dtrace_gen.h: No such file or directory</code> というエラーが発生した場合、
     PHP が <a href="features.dtrace.php" class="link">DTrace</a> を有効にしてビルドされているということです。
     この場合、以下のようにして環境変数を設定してから、
     <code class="literal">configure</code> と <code class="literal">make</code> を再実行して下さい。
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
$ export PHP_DTRACE=yes
</pre></div>
     </div>
    </div>
   </p>    
   </li>
   <li class="listitem">
    <p class="para">
      <var class="filename">php.ini</var> ファイルを編集し、以下の一行を追加して下さい。
    </p>
    <p class="para">
      <div class="informalexample">
        <div class="example-contents screen">
<div class="cdata"><pre>
extension=oci8.so
</pre></div>
        </div>
      </div>
    </p>
    <p class="para">
      <var class="filename">php.ini</var> のディレクティブ
      <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> が
      <var class="filename">oci8.so</var> をインストールしたディレクトリを差しているかを確認して下さい。
    </p>
   </li>
  </ul>
 </p>
</div>
<div class="section">
 <h2 class="title">PHP をビルドする際に、OCI8 を共有ライブラリとしてインストールする</h2>
 <p class="para">
  PHP をソースコードからビルドしている場合、
  OCI8 を共有ライブラリとしてビルドするために
  <code class="literal">shared</code> オプションが使えます。
  これを使うと、PHP に動的にライブラリを読み込ませることが出来ます。
  共有ライブありとしてビルドすると、
  PHP の本体に影響を与えることなく、OCI8 をアップグレードできます。
 </p>
 <p class="para">
  以下のオプションを使って、OCI8 を設定できます。
 </p>
 <p class="para">
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     無料の <a href="https://www.oracle.com/database/technologies/instant-client.html" class="link external">&raquo;&nbsp;Oracle Instant
     Client</a> ライブラリを使っている場合は、以下のようにします:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure --with-oci8=shared,instantclient,/path/to/instant/client/lib
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
     Instant Client 12.2 (または前のバージョン)
     が ZIP ファイルからインストールされている場合、
     ライブラリへのシンボリックリンクが作られていることをまず確認して下さい。
     たとえば
     <code class="literal">ln -s
     libclntsh.so.12.1 libclntsh.so</code> のようにします。
    </p>
    <p class="para">
     RPM を使って Oracle Instant Client をインストールしている場合、
     configure コマンドは、以下のようになるでしょう:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure --with-oci8=shared,instantclient,/usr/lib/oracle/&lt;version&gt;/client/lib
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
     <strong class="option configure">--with-oci8=shared,instantclient,/usr/lib/oracle/19.9/client/lib</strong> のようにして、オプションを指定します。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Oracle Database を使っているか、
     Oracle Client が完全にインストールされている場合は、以下のようにします:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure --with-oci8=shared,$ORACLE_HOME
</pre></div>
      </div>
     </div>
    </p>
    <p class="para">
     Webサーバーのユーザ 
     (<code class="literal">nobody</code>, <code class="literal">www</code>)
     が、ライブラリへのアクセス権を持っていることを確認して下さい。
     <code class="literal">$ORACLE_HOME</code> 内にある初期化ファイルと
     (もし使っていれば) <var class="filename">tnsnames.ora</var> です。
     Oracle 10<em>g</em>R2 を使っている場合、
     ディレクトリアクセスを与えるために
     <var class="filename">$ORACLE_HOME/install/changePerm.sh</var>
     を実行する必要があるかもしれません。
    </p>
   </li>
  </ul>
 </p>
 <p class="para">
  設定が終わった後は、いつもの PHP のビルドの手続きに従って下さい。
  たとえば <em>make install</em> コマンドの実行です。
  OCI8 の共有ライブラリ <var class="filename">oci8.so</var> が作成されます。
  このファイルは、PHP の extension
  ディレクトリに手動で移動する必要があるかもしれません。
  このディレクトリは、<var class="filename">php.ini</var> の
  <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> で指定します。
 </p>
 <p class="para">
  OCI8 のインストールを完了するには、
  <var class="filename">php.ini</var> を編集し、以下の一行を追加します。
 </p>
 <p class="para">
  <div class="informalexample">
   <div class="example-contents screen">
<div class="cdata"><pre>
extension=oci8.so
</pre></div>
   </div>
  </div>
 </p>
</div>
<div class="section">
 <h2 class="title">PHP をビルドする際、OCI8 を静的リンクしてインストールする</h2>
 <p class="para">
  PHP をソースコードからビルドしている場合、
  以下の configure オプションを使って、
  OCI8 を静的ライブラリとして PHP に含めることが出来ます。
 </p>
 <p class="para">
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Oracle Instant Client を使っている場合、以下のようにします:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure --with-oci8=instantclient,/path/to/instant/client/lib
</pre></div>
      </div>
     </div>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Oracle Database を使っているか、
     Oracle Client が完全にインストールされている場合は、以下のようにします:
    </p>
    <p class="para">
     <div class="informalexample">
      <div class="example-contents screen">
<div class="cdata"><pre>
./configure --with-oci8=$ORACLE_HOME
</pre></div>
      </div>
     </div>
    </p>
   </li>
  </ul>
 </p>
 <p class="para">
  設定が終わった後は、いつもの PHP のビルドの手続きに従って下さい。
  たとえば <em>make install</em> コマンドの実行です。
  コンパイルが終わった後は、
  <var class="filename">oci8.so</var> を <var class="filename">php.ini</var> に追加する必要はありません。
  追加のビルドステップも不要です。
 </p>
</div>
<div class="section">
 <h2 class="title">Windows で OCI8 をインストールする</h2>
 <p class="para">
  OCI8 拡張モジュールは、
  <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a> リポジトリのDLLや、
  インストールされた PHP の <code class="literal">ext</code> ディレクトリにあるライブラリを使うことで追加出来ます。
 </p>
 <p class="para">
  Oracle 12<em>c</em> (以降) のライブラリを使う場合、
  <var class="filename">php.ini</var> の
  <code class="literal">extension=php_oci8_12c.dll</code>,
  <code class="literal">extension=php_oci8_11g.dll</code>,
  <code class="literal">extension=php_oci8.dll</code> のいずれかをコメントアウトして下さい。
  これらの DLL のうち、ひとつだけを1度に有効にできます。
  バージョンが上のDLLには、より多くの機能が含まれています。
  必ずしも全てのDLLが、全てのバージョンのPHPで利用できるとは限りません。
  <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> 
  が、PHP の拡張モジュールの DLL を含んだディレクトリを指していることを確認して下さい。
 </p>
 <p class="para">
  もし Instant Client を使用する場合、システムの <var class="envar">PATH</var>
  環境変数を Oracle ライブラリ・ディレクトリに設定します。
 </p>
</div>
<div class="section">
 <h2 class="title">Oracle の実行環境を設定する</h2>
 <p class="para">
  この拡張モジュールを使用する前に、 Web デーモンのユーザーのために Oracle の環境変数が
  適切に設定されたか確認してください。
  もし Web サーバーがブート時に自動起動される場合は、ブート時の環境も正しく設定されていることを
  確認してください。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   PHP スクリプトで <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> を使って Oracle の環境変数を
   設定しないでください。それは、スクリプトが実行される前に Oracle のライブラリがロードされて
   初期化されるかもしれないからです。
   <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> で変数を設定すると、コンフリクト、クラッシュ、
   または予測出来ない動作の原因となるかもしれません。
   ある関数は動作し、他の関数は捉えがたいエラーを示すかもしれません。
   Web サーバー開始<em>前</em>に変数を設定するべきです。
  </p>
 </p></blockquote>
 <p class="para">
  Red Hat Linux と変種では、 <var class="filename">/etc/sysconfig/httpd</var>
  の最後で変数を export してください。 Apache 2 を伴う他のシステムでは
  Apache <var class="filename">bin</var> ディレクトリーで <var class="filename">envvars</var>
  スクリプトを使用するかもしれません。 ３番目のオプション、 <var class="filename">httpd.conf</var>
  の Apache <code class="literal">SetEnv</code> ディレクティブは、一部のシステムでは
  動作するかもしれませんが、他のシステムでは不適切であることが知られています。
 </p>
 <p class="para">
  環境変数が正しく設定されたかチェックするには、 <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span> を使って
  <em>Environment</em> セクション (<em>Apache Environment</em>
  ではありません) に期待される変数が含まれるかどうかチェックしてください。
 </p>
 <p class="para">
  必要かもしれない変数が下記の表に含まれます。
  どんな変数が使えるのかについての詳細は Oracle ドキュメントを参照ください。
  <table class="doctable table">
   <caption><strong>一般的な Oracle 環境変数</strong></caption>
   
    <thead>
     <tr>
      <th>名前</th>
      <th>目的</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>ORACLE_HOME</td>
      <td>フルの Oracle データベース・ソフトウェアのディレクトリを含みます。
      Oracle Instant Client を使用する際は、これを設定しないでください。
      設定することは余計なことで、インストール時に問題を引き起こすかもしれませんので。
      </td>
     </tr>

     <tr>
      <td>ORACLE_SID</td>
      <td>ローカルマシン上の、接続されるデータベース名を含みます。
      Oracle Instant Client を使用するか、または <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
      に常に接続パラメータを渡す場合は、この設定は不要です。
      </td>
     </tr>

     <tr>
      <td>LD_LIBRARY_PATH</td>
      <td>
       この値(プラットフォームによっては、
       <code class="literal">LIBPATH</code> や <code class="literal">SHLIB_PATH</code>
       の場合があります) を Oracle ライブラリが入っている場所に設定します。
       たとえば <var class="filename">$ORACLE_HOME/lib</var>
       や <var class="filename">/usr/lib/oracle/18.5/client/lib</var> などです。
       Linux 用の Instant Client 19 の ZIP ファイルについては、
       <var class="filename">ldconfig</var> を代わりに使うことで、
       さらに信頼性があがるよになっています。詳細は Instant Client の
       インストール手順書を参照ください。
       Instant Client 19 (またはそれ以降) の RPM ファイルでは、 
       <code class="literal">ldconfig</code> が自動で実行されるようになっています。
       ユーザーによっては、<code class="literal">LD_LIBRARY_PATH</code> のかわりに
       <code class="literal">LD_PRELOAD</code> を使うかもしれません。
      </td>
     </tr>

     <tr>
      <td>NLS_LANG</td>
      <td>これは Oracle ライブラリで使用される文字セットや
      国際化情報を設定するためのプライマリ変数です。</td>
     </tr>

     <tr>
      <td>ORA_SDTZ</td>
      <td>Oracle セッションのタイムゾーンを設定します。</td>
     </tr>

     <tr>
      <td>TNS_ADMIN</td>
      <td>
      <var class="filename">tnsnames.ora</var> や
      <var class="filename">sqlnet.ora</var> のような
      Oracle Net Service の設定ファイルが置かれたディレクトリを指定します。
      <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span> に指定する接続文字列が、
      <code class="literal">localhost/XE</code> のような
      簡易接続の名前付けの文法を使っている場合、この設定は不要です。
      また、ネットワーク設定ファイルがデフォルトの位置に置かれている場合も不要です。
      たとえば、
      <var class="filename">/usr/lib/oracle/VERSION/client/lib/network/admin</var>,
      <var class="filename">$ORACLE_HOME/network/admin</var>,
      または <var class="filename">/etc</var> に置かれている場合です。
      </td>
     </tr>

    </tbody>
   
  </table>

   頻度は高くありませんが、
   <code class="literal">TWO_TASK</code> 、 <code class="literal">ORA_TZFILE</code> 、及び
   <code class="literal">NLS*</code> や <code class="literal">ORA_NLS_*</code> 変数のような
   様々な Oracle 国際化設定値を含む Oracle 環境変数が使用されます。
 </p>
</div>
<div class="section">
 <h2 class="title">トラブルシューティング</h2>
 <p class="para">
  OCI8 をインストールする際に最も一般的な問題は、 Oracle 環境が
  正しく設定されないことです。通常、これは <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
  や <span class="function"><a href="function.oci-pconnect.php" class="function">oci_pconnect()</a></span> 使用上の問題として現れます。
  このエラーは <em>Call to undefined function oci_connect()</em>
  のような PHP エラーや、 ORA-12705 のような Oracle エラー、さらには
  Apache のクラッシュになるかもしれません。
  この問題を解決するために、起動時のエラーについて Apache のログファイルをチェックして、
  上記のセクションをご覧下さい。
 </p>
 <p class="para">
  ORA-12154 または ORA-12514 のようなネットワークエラーは
  Oracle のネットワーク・ネーミングまたは構成の問題を示唆する反面、
  根本の原因は、 PHP 環境が誤って設定されたことや、 Oracle ライブラリが
  <var class="filename">tnsnames.ora</var> 構成ファイルの場所を指定できないためかもしれません。
 </p>
 <p class="para">
  Windows では、一つのマシン上に Oracle の複数のバージョンを持つと、
  PHP が Oracle の正しいバージョンだけを使用することを確認するために注意を払わない限り、
  すぐにライブラリのクラッシュを引き起こします。
 </p>
 <p class="para">
  特に Windows 上では、どのライブラリが検索されてロードされるか調べるユーティリティは、
  欠けていたりクラッシュしているライブラリの問題の解決に役立ちます。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <strong>Web サーバーが開始しないか、または起動時にクラッシュする場合</strong><br />
  <p class="para">
   Apache が pthread ライブラリとリンクされていることをチェックします。
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
# ldd /www/apache/bin/httpd
  libpthread.so.0 =&gt; /lib/libpthread.so.0 (0x4001c000)
  libm.so.6 =&gt; /lib/libm.so.6 (0x4002f000)
  libcrypt.so.1 =&gt; /lib/libcrypt.so.1 (0x4004c000)
  libdl.so.2 =&gt; /lib/libdl.so.2 (0x4007a000)
  libc.so.6 =&gt; /lib/libc.so.6 (0x4007e000)
  /lib/ld-linux.so.2 =&gt; /lib/ld-linux.so.2 (0x40000000)
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   libpthread が一覧に表示されなければ、 Apache を再インストールします。
  </p>
  <p class="para">
   <div class="informalexample">
    <div class="example-contents screen">
<div class="cdata"><pre>
# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install
</pre></div>
    </div>
   </div>
  </p>
  <p class="para">
   UnixWare のような一部のシステムでは、それは
   libpthread の代わりに libthread であることに注意してください。
   PHP 及び Apache を EXTRA_LIBS=-lthread とともに構成しなければいけません。
  </p>
 </p></blockquote>
</div>


</div><?php manual_footer($setup); ?>