<?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 => 'ru',
  ),
  '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' => 'ru',
    '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">Сборка PHP совместно с OCI8</h2>
  <p class="para">
   Перед сборкой OCI8 изучите предыдущий раздел
   &quot;<a href="oci8.requirements.php" class="link">Требования</a>&quot;.
  </p>
  <p class="para">
   Перед стартом веб-сервера, OCI8 обычно требуется несколько переменных
   окружения Oracle (смотрите ниже) для обнаружения библиотек, конфигурационных
   файлов и установки некоторых базовых свойств, таких как кодировка,
   используемая библиотеками Oracle. Эти переменные должны быть установлены
   <em>перед</em> запуском любого PHP-процесса.
  </p>
  <p class="para">
   Бинарный файл PHP должен использовать ту же, или более свежую основную версию библиотек
   Oracle, чем ту, с которой он был собран. Например, если вы собрали
   OCI8 с библиотеками Oracle 19, то PHP также должен работать с
   библиотеками Oracle 19. Приложения PHP могут подключаться к
   другим версиям Oracle Database, так как Oracle имеет клиент-серверную совместимость разных версий.
  </p>
 </div>
 <div class="section">
  <h2 class="title">Установка OCI8 из PECL</h2>
  <p class="para">
   Модуль OCI8 может быть включён в текущую установку PHP как
   автоматически, так и вручную с помощью
   <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a>.
  </p>
  <p class="para">
   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Если ваш компьютер находится за файерволом, установите прокси для
      PEAR, например:
     </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>
     <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">$HOME</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 Dynamic Tracing</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">oci8.so</var> установлен в директорию,
     заданную в директиве <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a>
     файла <var class="filename">php.ini</var>.
    </p>
   </li>
  </ul>
  </p>
 </div>
 <div class="section">
  <h2 class="title">Установка OCI8 из PECL с помощью phpize</h2>
  <p class="para">
   Если по каким-то причинам нет возможности воспользоваться командой
   <code class="literal">pecl</code>, можно самостоятельно загрузить пакет
   с сайта <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a>.
   Например <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">
     or
    </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 Dynamic Tracing</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">oci8.so</var> установлен в директорию,
     заданную в директиве <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a>
     файла <var class="filename">php.ini</var>.
    </p>
   </li>
  </ul>
  </p>
 </div>
 <div class="section">
  <h2 class="title">Установка OCI8 в виде подгружаемого (shared) модуля во время сборки PHP</h2>
  <p class="para">
   Указание опции конфигурации <code class="literal">shared</code> позволяет собрать
   OCI8 в виде динамически подгружаемой библиотеки. Сборка в виде
   подгружаемого модуля позволяет легко обновлять OCI8 без пересборки
   всего PHP.
  </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,/путь/к/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">
      Если Oracle Instant Client был установлен с помощью RPM, команда
      конфигурации будет выглядеть так:
     </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">
     Убедитесь, что пользователь, под которым запущен веб-сервер,
     (<code class="literal">nobody</code>, <code class="literal">www</code>) имеет доступ
     к библиотекам, файлам инициализации и
     <var class="filename">tnsnames.ora</var> (если используется) в папке
     <code class="literal">$ORACLE_HOME</code>. При использовании 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>, после чего будет создано
  подгружаемая библиотека <var class="filename">oci8.so</var>. Возможно, вам
  потребуется вручную перенести её в папку модулей PHP, указанную
  опцией <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a> вашего
  <var class="filename">php.ini</var>.
 </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">Установка OCI8 в виде статически скомпилированного модуля</h2>
  <p class="para">
   Сборка PHP со статическим подключением OCI8, используя одну из следующих конфигурационных опций.
  </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,/путь/к/instant/client/lib
</pre></div>
       </div>
      </div>
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      При использовании базы данных Oracle или полной установке
      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">Установка OCI8 в Windows</h2>
  <p class="para">
   Модуль OCI8 можно добавить в PHP с помощью библиотек из репозитория
   <a href="https://pecl.php.net/package/oci8" class="link external">&raquo;&nbsp;PECL</a> или из
   директории <code class="literal">ext</code>, содержащейся в вашей инсталляции PHP.
  </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>. Единовременно можно использовать только
   одну из этих библиотек. Более новые библиотеки могут содержать более продвинутый
   функционал. Состав доступных библиотек может меняться в зависимости от версии PHP.
   Убедитесь, что <a href="ini.core.php#ini.extension-dir" class="link">extension_dir</a>
   указывает на директорию, содержащую библиотеки модулей PHP.
  </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">
   Перед использованием данного модуля, убедитесь, что
   переменные окружения Oracle правильно настроены для пользователя,
   под которым работает веб-сервер. Если ваш веб-сервер автоматически
   стартует при загрузке, то убедитесь, что окружение при загрузке
   также настроено корректно.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Не устанавливайте переменные окружения Oracle через
    <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> в PHP-скрипте, потому что библиотеки
    Oracle могут быть загружены и проинициализированы до запуска
    вашего скрипта. Переменные, установленные через
    <span class="function"><a href="function.putenv.php" class="function">putenv()</a></span> могут затем вызывать конфликты, падения
    и прочее непредсказуемое поведение. Некоторые функции могут работать,
    в то время как другие давать мелкие ошибки. Необходимо устанавливать
    эти переменные <em>до</em> запуска веб-сервера.
   </p>
  </p></blockquote>
  <p class="para">
   В Red Hat Linux и его вариантах, экспортируйте переменные в конце файла
   <var class="filename">/etc/sysconfig/httpd</var>. Другие системы с
   Apache 2 могут использовать скрипт <var class="filename">envvars</var>
   из папки <var class="filename">bin</var> в дистрибутиве Apache. Третьим вариантом
   является директива Apache <code class="literal">SetEnv</code> в файле
   <var class="filename">httpd.conf</var>, на каких-то системах она может работать,
   однако, известно, что на некоторых её недостаточно.
  </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>. Обратите внимание,
        что для ZIP архивов Instant Client в Linux более надёжно использовать
        <var class="filename">ldconfig</var>. Обратитесь к инструкции по установке
        Instant Client. Для RPM пакетов Instant Client 19 (и старше),
        <code class="literal">ldconfig</code>, будет запущен автоматически. Кто-то использует
        <code class="literal">LD_PRELOAD</code> вместо <code class="literal">LD_LIBRARY_PATH</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>Содержит папку, в которой хранятся конфигурационные файлы
        Oracle Net Services, такие как <var class="filename">tnsnames.ora</var>
        и <var class="filename">sqlnet.ora</var>. В ней нет необходимости, если
        строка соединения в функции <span class="function"><a href="function.oci-connect.php" class="function">oci_connect()</a></span>
        использует синтаксис Easy Connect, такой как, например,
        <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>

   Менее используемые переменные окружения Oracle включают в себя
   <code class="literal">TWO_TASK</code>, <code class="literal">ORA_TZFILE</code>, а также
   различные установки глобализации Oracle наподобие переменных
   <code class="literal">NLS*</code> и <code class="literal">ORA_NLS_*</code>.
  </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>. Ошибка может проявляться в
   виде ошибок PHP, например, <em>Call to undefined function
   oci_connect()</em>, ошибок Oracle, таких как ORA-12705,
   или даже крушения 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>Если веб-сервер не стартует или падает при старте</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); ?>