Добрый день, All! Как можно сделать соединение с Oracle, чтобы не открывалось их несколько одновременно? Что-то вроде - постоянно активно одно соединение, а скрипт PHP уже подключается к нему, а не создает новое. Если можно примеры где посмотреть, буду благодарен. ЗЫ. Разбираться только начал.
Наверное я не очень точно выразился, но попробую еще раз. 1000 юзеров в своих браузерах обращаются к серверу, сервер выполняет скрипт php в котором он обращается к базе oracle => создается 1000 соединений с базой? Или я чего-то не понимаю? Например сейчас на ASP и vbscript у нас работает так, есть один скрипт, который создает соединение и recorset- "sub application_onStart on error resume next set cn = Server.CreateObject("ADODB.Connection") cn.Open "***", "***", "***" set application("myOracleConnection") = cn end sub"... " sub session_onStart on error resume next set rs = Server.CreateObject("ADODB.Recordset") set session("myOracleRecordset") = rs set rs1 = Server.CreateObject("ADODB.Recordset") set session("myRecordset1") = rs1 end sub" " , а потом (это другой скрипт) " on error resume next set cn = application("myOracleConnection") set rs = session("myOracleRecordset") rs.Open "select *** from *** where *** from *** where *** and *** is not null)", cn rs.Close" Вот можно что-то подобное сделать на PHP?
2olo: Да, точно - то, что надо. Вот только под windows нету... А может можно как-то стандартными средствами php такое-же сделать? Например : после $c=OCILogon("***", "***", "***"); не закрывать соединение, и определить $c как глобальную переменную и потом войти в бесконечный цикл?
Стандартными способами не получится передавать дескрипторы файлов/процессов между скриптами. Т.е. такой вещи как "Application" в РНР по умолчанию нет Можно поискать аналоги этого компонента под винды, или же подойти к вопросу с другой стороны и попробовать сконфигурить Оракл чтобы он не обрубал соединения а складывал их в пул или както так
Ну даже если Oracle будет складывать их в пул, то срипту понадобиться дескриптор процесса, а кто ему его даст? Или я опять чего-то не понимаю? А вообще какие методы используются для повышения надежности и производительности php+oracle(...)? Что, у всех запускается одновременно сотни соединений с базой? Может есть другие механизмы?
да. все так и происходит. скрипт запускается, создается соединение. скрипт завершается. соединение закрывается. именно так и работают веб-приложения.
Почему этот вопрос важен. Есть рабочая база, которая используется нашей конторой с большим кол-вом соединений одновременно. Если к этой-же базе будет доступ через вэб, то потенциально кривой скрипт может повесить работу всей конторы, а это полный "П". С одним контролируемым соед. все проще - отрубил только его и продолжай работать.Может быть не все так плохо как кажется?
Karandash заведи спец. юзера, который будет из под веб коннектиться. даже если подвесит, что врят ли, то обрубишь все коннекты с этим юзером. и еще. скрипты не умеют держать постоянное соединение. это основы технологии.
Vlad не, а ты думаешь, что mysql_pconnect себя ведет по другому при завершении скрипта? 8))) после завершения уничтожаются все ресурсы.
Vlad ну дай то бог ... но когда будет новое mysql_connect() какое будет использовано? правильно: новое ...
Всем привет! Manual- "oci_connect (PHP 5) oci_connect -- Устанавливает соединение с сервером Oracle Описание resource oci_connect ( string username, string password [, string db [, string charset]] ) oci_connect() возвращает идентификатор соединения, который используется большинством функций данного модуля. Необязательный третий параметр может содержать имя локального экземпляра Oracle или имя одной из записей в файле tnsnames.ora. Если третий параметр не указан, PHP использует переменные окружения ORACLE_SID и TWO_TASK, которые используются для определения имени локального экземпляра Oracle и местонахождения файла tnsnames.ora соответственно. Замечание: oci_connect() не устанавливает соединение повторно, если соединение с такими параметрами (логин, пароль, имя сервера) уже было установлено. Вместо этого, oci_connect() вернет идентификатор уже открытого соединения. Это означает, что вам не следует использовать oci_connect() для разделения нескольких транзакций. Если вы уверены, что хотите установить соединение с теми же параметрами заново, то вам следует использовать oci_new_connect(). Если вы используете сервер Oracle версии 9.2 и выше, то вы можете указать кодировку, которая будет использована в новом соединении. Кодировка указывается в параметре charset. Если же вы используете версии сервера Oracle младше 9.2, то этот параметр будет проигнорирован, а вместо него будет использована переменная окружения NLS_LANG. " Но у меня 4 версия PHP - поэтому только OCI_Logon...