Вызов неопределенной функции oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6

У меня есть простой скрипт PHP:

<?php
$db_user = 'myusername';
$db_pass = 'mypassword';
$db_sid = 'mysid';
$conn = oci_connect( $db_user, $db_pass, $db_sid );
?>

Когда я запускаю его (из браузера или из командной строки), я получаю сообщение об ошибке:

Call to undefined function oci_connect

Я использую php 5.6.6, который поставляется с php_oci8_12c.dll уже там.

я имею extension=php_oci8_12c.dll в моем php.ini

Я установил мгновенный клиент (12.1) — пробовал 32-битную версию и 64-битную версию

У меня есть переменные окружения ORACLE_HOME и TNS_ADMIN, указывающие на мгновенную папку клиента (C: \ instantclient_12_1).

У меня также есть C: \ instantclient_12_1 в моем пути

У меня есть tnsnames.ora в той же папке с соответствующей записью:

MYSID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = myhost.net)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = MYSERVICE)
)
)

Я также скачал SQLDeveloper от http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html

SQLDeveloper работает, распознает вышеупомянутый tnsnames.ora, подключается и успешно выполняет запрос к той же базе данных, к которой пытается обратиться мой php-скрипт.

Я провел несколько часов в течение нескольких дней, пробуя разные вещи безрезультатно.

Я использую:

php 5.6.6
windows 8.1
IIS (so no answers involving apache please)
cmd (run as administrator)
Oracle Database 11g Enterprise Edition 11.2.0.3.0

Некоторая другая информация, которая может оказаться полезной:

В идеале я хотел бы использовать oci 1.4.10 для соответствия производственному серверу, но пока не слишком беспокоюсь об этом.

pear install oci8-1.4.10.tgz

дает мне эту ошибку:

The DSP oci8.dsp does not exist

Я не могу найти объяснения этой ошибке, которая что-то значит для меня.

Чего мне не хватает — может кто-нибудь мне помочь

РЕДАКТИРОВАТЬ:

Я пробовал различные предложения в других сообщениях на stackoverflow, а именно:

extension=oci8.so с и без extension=php_oci8_12c.dll

У меня нет линии extension=php_oracle.dll в моем файле php.ini

РЕДАКТИРОВАТЬ:

phpinfo говорит мне, что я использую правильный файл php.ini:

Loaded Configuration File => C:\php5.6.6\php.ini

Эта строка из phpinfo также может быть полезна:

Configure Command => cscript /nologo configure.js  "--enable-snapshot-build" "--enable-debug-pack" "--disable-zts" "--disable-isapi" "--disable-nsapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-oci8-12c=c:\php-sdk\oracle\x86\instantclient_12_1\sdk,shared" "--with-enchant=shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet=shared" "--with-mcrypt=static" "--without-analyzer" "--with-pgo"

РЕДАКТИРОВАТЬ:

Кажется, что dsp-файлы — это файлы проекта VC ++. Сейчас я решаюсь узнать, как создать расширение php, и, надеюсь, когда я это сделаю, у меня будет достаточно знаний, чтобы скомпилировать исходный код oci8 1.4.10 в dll, который работает на Windows 8 — если кто-то не спасет меня с ответом на этот вопрос — похоже, это займет у меня некоторое время 🙂

РЕДАКТИРОВАТЬ:

Добавление display_startup_errors = On php.ini говорит мне, что oci dll не является допустимым приложением Win32

5

Решение

Редактировать: Хм. Попытка сделать это в Windows 8 приводит к той же ошибке, что и вы. Я сейчас расследую …

Моя ошибка (я включил неправильно extension_dir линия). Он работает в Win8 так же, как описано ниже.


Следующие шаги должны быть всем, что вам нужно для работы OCI с PHP (я только что проверил это на недавно установленной виртуальной машине Windows 2008 R2 Standard x64):

  • Скачайте и распакуйте PHP (я использовал C:\php от php-5.6.7-nts-Win32-VC11-x86.zip).
  • Скачайте и распакуйте InstantClient (я использовал C:\instantclient_12_1 от instantclient-basic-nt-12.1.0.2.0.zip).
  • Добавьте вышеуказанные пути к системному пути.
  • копия c:\php\php.ini-production в c:\php\php.ini,
  • в php.ini:
    • активированная линия extension_dir = "ext",
    • активированная линия extension=php_oci8_12c.dll,
  • Установите Microsoft Visual C ++ 2010 Runtime (x86). Это необходимо для расширения OCI8.
  • Установите Microsoft Visual C ++ 2012 Runtime (x86). Это необходимо для PHP.

На данный момент работает php --ri oci8 в командной строке показывает следующий вывод:

C:\>php --ri oci8

oci8

OCI8 Support => enabled
OCI8 DTrace Support => disabled
OCI8 Version => 2.0.9
Revision => $Id: f5a3ee1083d1ffa6adb5143efda6eafa210b8414 $
Oracle Run-time Client Library Version => 12.1.0.2.0
Oracle Compile-time Instant Client Version => 12.1

Directive => Local Value => Master Value
oci8.max_persistent => -1 => -1
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
oci8.default_prefetch => 100 => 100
oci8.old_oci_close_semantics => Off => Off
oci8.connection_class => no value => no value
oci8.events => Off => Off

Statistics =>
Active Persistent Connections => 0
Active Connections => 0

И проверка на oci_connect функция:

C:\>php -r "var_dump(function_exists('oci_connect'));"bool(true)
10

Другие решения

В дополнение к тому, что было сказано для решения проблемы, я хотел бы добавить PHP CLI сторона вещей, так как некоторые люди должны запускать приложения с поддержкой OCI в режиме CLI. В моем случае мне пришлось скопировать экземпляр oci.dll в wamp/bin/php/php<version>/ папка для php --ri oci8 показать, что oci8 был правильно загружен. Это не доказывает, что другие файлы не были необходимы для правильного запуска полноценного приложения (см. Мою техническую сноску).
Включение пути к дистрибутиву InstantClient 12 не поможет.

Технические примечания:
Моя среда: Windows 7 + WAMP3 (php 5.6.15, apache 2.4.17), после ряда экспериментов я смог сузить минимальный набор из трех файлов, которые нужно было скопировать в каталог bin (Apache’s для приложений, не относящихся к cli) из дистрибутива InstantClient 12, чтобы разрешить создание экземпляра адаптера Oracle в Zend Framework, выполнить запрос SQL и прочитать набор записей.

Этот набор: oci.dll, oraociei12.dll а также orans.dll,

В частности, просто копируя oci.dll не позволит приложению работать (исключение неизвестно)

2

По вопросам рекламы [email protected]