PHP 8.6.0 Beta 1 is available for testing

oci_pconnect

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_pconnectУстанавливает постоянное соединение с сервером Oracle

Описание

function oci_pconnect(
string $username,
string $password,
? string $connection_string = null ,
string $encoding = "",
int $session_mode = OCI_DEFAULT
): resource |false

Создаёт постоянное соединение с сервером Oracle и выполняет аутентификацию.

Постоянные соединения кешируются и повторно используются при следующих запросах, в результате снижаются накладные расходы при каждой загрузке страницы; типичное приложение PHP имеет одно постоянное подключение к серверу PHP, реализованное дочерним процессом Apache (или процессом PHP FPM). Дополнительную информацию смотрите в разделе Работа с соединениями OCI8 и Connection Pooling.

Список параметров

username

Имя пользователя Oracle.

password

Пароль пользователя username.

connection_string
Содержит экземпляр Oracle для подключения. Это может быть » Easy Connect string, или Connect Name из файла tnsnames.ora, или имя локального экземпляра Oracle. Если не указано отдельно или null , PHP использует переменные окружения, такие как TWO_TASK (на Linux) или LOCAL (на Windows) и ORACLE_SID для определения экземпляра Oracle для соединения. Для использования метода Easy Connect, PHP должен быть слинкован с клиентскими библиотеками версии Oracle 10g или старше. Easy Connect string для Oracle 10g принимает следующую форму: [//]host_name[:port][/service_name]. Начиная с Oracle 11g синтаксис таков: [//]host_name[:port][/service_name][:server_type][/instance_name]. В Oracle 19c были введены дополнительные параметры, включая настройки времени ожидания и проверки активности. Обратитесь к документации Oracle. Названия служб могут быть определены с помощью запуска Oracle утилиты lsnrctl status на сервере базы данных. Файл tnsnames.ora может находиться в поисковом пути Oracle Net, который включает /your/path/to/instantclient/network/admin, $ORACLE_HOME/network/admin и /etc. В качестве альтернативного варианта можно установить TNS_ADMIN таким образом, чтобы путь $TNS_ADMIN/tnsnames.ora был читаемым. Убедитесь, что веб-сервер имеет доступ к этому файлу.
encoding
Определяет кодировку, которую будут использовать клиентские библиотеки Oracle. Кодировка не обязательно должна совпадать с кодировкой самой базы данных. Oracle сделает всё возможное, чтобы преобразовать данные из или в эту кодировку, если кодировка не совпадает. В зависимости от кодировок это не всегда даёт приемлемые результаты. Преобразование также занимает некоторое время. Клиентские библиотеки Oracle будут определять кодировку из переменной окружения NLS_LANG, если кодировку не указали. Передача аргумента часто уменьшает время, которое тратится на соединение.
session_mode
Параметр доступен с PHP 5 (PECL OCI8 1.1) и принимает следующие значения: OCI_DEFAULT , OCI_SYSOPER и OCI_SYSDBA . Если указали OCI_SYSOPER или OCI_SYSDBA , функция попытается установить привилегированное соединение через внешние данные авторизации. По умолчанию привилегированные соединения отключены. Чтобы их включить, устанавливают oci8.privileged_connect в On. В версии PHP 5.3 (PECL OCI8 1.3.4) появилась константа OCI_CRED_EXT как значение режима. Этот режим говорит Oracle использовать внешнюю аутентификацию или аутентификацию операционной системы, которую требуется настроить в базе данных. Флаг OCI_CRED_EXT разрешается использовать только с именем пользователя "/" и пустым паролем. Опиция oci8.privileged_connect принимает значение On или Off. Режим OCI_CRED_EXT разрешается объединять с режимами OCI_SYSOPER и OCI_SYSDBA . Режим OCI_CRED_EXT не поддерживается в Windows по соображениям безопасности.

Возвращаемые значения

Возвращает идентификатор подключения или false в случае возникновения ошибки.

Примеры

Пример #1 Простой пример для oci_pconnect() с использованием упрощённого синтаксиса подключения

<?php
// Подключение к XE сервису (т.е. базе данных) на локальной машине
$conn = oci_pconnect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
 $e = oci_error();
 trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
 echo "<tr>\n";
 foreach ($row as $item) {
 echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
 }
 echo "</tr>\n";
}
echo "</table>\n";
?>

Дополнительные примеры можно найти в описании функции oci_connect() .

Примечания

Замечание: Продолжительность и максимальное количество постоянных соединений к серверу Oracle на каждый процесс PHP может быть изменено в следующих директивах: oci8.persistent_timeout, oci8.ping_interval и oci8.max_persistent.

Смотрите также

  • oci_connect() - Устанавливает соединение с базой данных Oracle
  • oci_new_connect() - Устанавливает новое соединение с сервером Oracle

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 2 notes

up
2
php at jaggard dot org dot uk
17 years ago
[Editor's note: OCI8 1.3 should not experience the problem described in this user comment. The first use of such a connection will return an Oracle error which will trigger a cleanup in PHP. Subsequent persistent connection calls will then succeed. For high availability you might consider doing consecutive oci_pconnect calls in your script.]
If you connect using oci_pconnect and the connection has logged you off but is still valid, there seems to be no way to re-use that connection. The next time I try oci_pconnect and then perform an oci_execute operation, I get a "ORA-01012: not logged on" warning. This problem remains, even if I close the connection using oci_close. I ended up with the following (rather annoying) code.
<?php
 function getOracleConnection()
 {
 if (!function_exists('oci_pconnect'))
 return false;
 $toReturn = oci_pconnect('user', 'pass', 'db');
 if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
 if (@oci_execute($testRes))
 if (@oci_fetch_array($testRes))
 return $toReturn;
 oci_close($toReturn);
 if (!function_exists('oci_connect'))
 return false;
 $toReturn = oci_connect('user', 'pass', 'db');
 if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
 if (@oci_execute($testRes))
 if (@oci_fetch_array($testRes))
 return $toReturn;
 oci_close($toReturn);
 if (!function_exists('oci_new_connect'))
 return false;
 $toReturn = oci_new_connect('user', 'pass', 'db');
 if ($testRes = @oci_parse($toReturn, 'SELECT Count(group_type_code) FROM pvo.group_type'))
 if (@oci_execute($testRes))
 if (@oci_fetch_array($testRes))
 return $toReturn;
 oci_close($toReturn);
 return false;
 }
?>
up
0
gotankersley at NOSPAM dot com
14 years ago
Installed on CentOS 6.2, and had lots of trouble getting it to recognize tnsnames.ora. The fix for me was:
1. Make sure apache is getting the TNS_ADMIN env variable by putting it in the /etc/init.d/httpd file:
 TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin
 export PATH TNS_ADMIN
This can be debugging in PHP by <?php echo system('env'); ?> and by verifying that TNS_ADMIN is there.
2. Make sure to use the name at the beginning of the tnsnames.ora file - not the SID (although ideally they should match. However, if the name at the beginning is XXXX.world then pconnect will expect this - not the SID)
+Добавить

AltStyle によって変換されたページ (->オリジナル) /