Remote connect к Oracle'у с Linux (PHP) ?

ACR77

Новичок
Remote connect к Oracle'у с Linux (PHP) ?

Добрый день!

Есть такая ситуация:

1. Unix-сервер с Oracle'ом
2. Linux-сервер с Apache+PHP

Скрипт на PHP должен напрямую лазить в Oracle.

Как это лучше сделать: oci8 , odbc или что-то ещё ???
Возможно ли такое в принципе ?
 

tony2001

TeaM PHPClub
oci8.
для этого надо поставить на машину с Апачем клиент Оракла, прописать соотв-щие переменные среды и добавить записи в tnsnames.ora
enjoy
 

ACR77

Новичок
Да, всё получилось и работает!

Но возникла другая проблема - скорость, точнее её отсутствие.

При запросе, типа SELECT some FROM db - возвращаются 50 строк и это занимает около 6 сек. Основной тормоз идёт именно при OCIFetchInto.

Если я выбираю только первую запись, то время ~ 0.4 сек. и чем больше записей я выбираю, тем всё дольше это происходит.

Оба сервера имеют высокоскоростное подключение, да и трафик при моём запросе:
Bytes in: 19485
Bytes out: 29116

Может на клиенте или сервере есть какие-либо параметры, с помощью которых можно оптимизировать общение по TCP ?

Вообщем, подскажите хоть что-то ?
 

ACR77

Новичок
Огромное спасибо!
Всё заработало отлично, - 0.6 сек на всё.
 

tony2001

TeaM PHPClub
ACR77
видимо, трабл в том, что каждая строка фетчится отдельным обращением к ораклу.
соотв-но, за 50 строк, да при плохой связи накапливается потихоньку..
а ocisetprefetch говорит ему сколько сразу отдать.
 

ACR77

Новичок
Ещё один маленький вопрос:

Операция такая же, только вместо SQL я использую вызов процедуры, которая возвращает ref cursor: mycurs open SELECT some FROM db

На это уходит 11 сек. Ocisetprefetch никак уже на это не влияет.

Видимо, работу с курсором оптимизировать нельзя ?
 

tony2001

TeaM PHPClub
у вас Оракл где стоит? на Луне, что-ли?
11 секунд - это уже антирекорд какой-то...

попробуйте вот так:
создать курсор
прибиндить его к запросу
выполнить запрос (т.е. процедуру) и получить курсор
после этого сделать ocisetprefetch($cursor)
 

ACR77

Новичок
На выборку с курсором ничего не дейтсвует.

$this->result = @OCIParse($this->db,$query) or $this->Error(OCIError($this->db));
@OCIBindByName($this->result,"ref_cursor",&$this->cursor,-1,OCI_B_CURSOR) or $this->Error(array("message"=>"Error cursor binding ..."));

OCISetPreFetch($this->result,200);
OCISetPreFetch($this->cursor,200);

@OCIExecute($this->result) or $this->Error(OCIError($this->result));
@OCIExecute($this->cursor) or $this->Error(OCIError($this->cursor));

Куда бы я не переставлял OCISetPreFetch($this->cursor,200), ничего не меняется.
 

tony2001

TeaM PHPClub
ой.
зачем столько собак?
ociexecute делать курсору не надо, он уже и так представляет из себя результат выборки.
 

ACR77

Новичок
Если я не делаю курсору ociexecute, то получаю:

Error while trying to retrieve text for error ORA-24374
 

tony2001

TeaM PHPClub
а, да. я соврал, execute нужен.

а вот это:
Error while trying to retrieve text for error ORA-24374
означает, что у тебя проблемы с переменными среды окружения, похоже.
в phpinfo() есть ORACLE_HOME и он правильный?
 

ecto

Новичок
сохраняйте соединение с ораклом после
завершения работы скрипта
OCIPLogon()

--- это оптимизация и к проблемме предыдущего поста не относится
 

tony2001

TeaM PHPClub
>это оптимизация и к проблемме предыдущего поста не относится
тогда к чему лишний раз писать то, что описано в мануале и никак не относится к топику?
 

ACR77

Новичок
Есть Compile-time ORACLE_HOME = /oracle/oraHome ...

Ну курсор же работает, просто медленно.

Похоже, что просто ocisetprefetch не действует на stmt типа cursor.
 

tony2001

TeaM PHPClub
>Compile-time ORACLE_HOME = /oracle/oraHome ...
нет, это не то.
ORACLE_HOME должен быть еще в переменных среды.

>Похоже, что просто ocisetprefetch не действует на stmt типа cursor.
я пока такого в мане по OCI не нашел, поэтому с уверенностью говорить об этом не буду.
 
Сверху