Authentication Services
Command Line Specific Extensions
Compression and Archive Extensions
Cryptography Extensions
Database Extensions
Date and Time Related Extensions
File System Related Extensions
Human Language and Character Encoding Support
Image Processing and Generation
Mail Related Extensions
Mathematical Extensions
Non-Text MIME Output
Process Control Extensions
Other Basic Extensions
Other Services
Search Engine Extensions
Server Specific Extensions
Session Extensions
Text Processing
Variable and Type Related Extensions
Web Services
Windows Only Extensions
XML Manipulation
GUI Extensions
Keyboard Shortcuts
?
This help
Next menu item
Previous menu item
Previous man page
Next man page
Scroll to bottom
Scroll to top
Goto homepage
Goto search
(current page)
Focus search box
Description
oci_pconnect
(
string
$username
,
string
$password
,
?
string
$connection_string
=
null
,
string
$encoding
= ""
,
int
$session_mode
=
OCI_DEFAULT
):
resource
|
false
Creates a persistent connection to an Oracle server and logs on.
Persistent connections are cached and re-used between requests, resulting in
reduced overhead on each page load; a typical PHP application will have a
single persistent connection open against an Oracle server per Apache child
process (or PHP FPM process). See the
OCI8
Connection Handling and Connection Pooling
section for more
information.
the
Oracle instance
to connect to. It can be
an
» Easy Connect
string
, or a Connect Name from
the
tnsnames.ora
file, or the name of a local
Oracle instance.
If not specified or
null
, PHP uses
environment variables such as
TWO_TASK
(on Linux)
or
LOCAL
(on Windows)
and
ORACLE_SID
to determine the
Oracle instance
to connect to.
To use the Easy Connect naming method, PHP must be linked with Oracle
10
g
or greater Client libraries. The Easy Connect string for Oracle
10
g
is of the form:
[//]host_name[:port][/service_name]
. From Oracle
11
g
, the syntax is:
[//]host_name[:port][/service_name][:server_type][/instance_name]
.
Further options were introduced with Oracle 19c, including timeout and keep-alive
settings. Refer to Oracle documentation. Service names can be found by running
the Oracle utility
lsnrctl status
on the database server
machine.
The
tnsnames.ora
file can be in the Oracle Net search path,
which
includes
/your/path/to/instantclient/network/admin
,
$ORACLE_HOME/network/admin
and
/etc
. Alternatively set
TNS_ADMIN
so that
$TNS_ADMIN/tnsnames.ora
is read. Make sure the web
daemon has read access to the file.
Determines
the character set used by the Oracle Client libraries. The character
set does not need to match the character set used by the database. If
it doesn't match, Oracle will do its best to convert data to and from
the database character set. Depending on the character sets this may
not give usable results. Conversion also adds some time overhead.
If not specified, the
Oracle Client libraries determine a character set from
the
NLS_LANG
environment variable.
Passing this parameter can
reduce the time taken to connect.
parameter is available since version PHP 5 (PECL OCI8 1.1) and accepts the
following values:
OCI_DEFAULT
,
OCI_SYSOPER
and
OCI_SYSDBA
.
If either
OCI_SYSOPER
or
OCI_SYSDBA
were specified, this function will try
to establish privileged connection using external credentials.
Privileged connections are disabled by default. To enable them you
need to set
oci8.privileged_connect
to
On
.
PHP 5.3 (PECL OCI8 1.3.4) introduced the
OCI_CRED_EXT
mode value. This tells Oracle to use
External or OS authentication, which must be configured in the
database. The
OCI_CRED_EXT
flag can only be used
with username of "/" and a empty password.
oci8.privileged_connect
may be
On
or
Off
.
OCI_CRED_EXT
may be combined with the
OCI_SYSOPER
or
OCI_SYSDBA
modes.
OCI_CRED_EXT
is not supported on Windows for
security reasons.
Example #1 Basic
oci_pconnect()
Example using Easy Connect syntax
<?php
// Connects to the XE service (i.e. database) on the "localhost" machine
$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"
;
?>
The lifetime and
maximum number of persistent Oracle connections per PHP process can be tuned by setting
the following configuration values:
oci8.persistent_timeout
,
oci8.ping_interval
and
oci8.max_persistent
.
php at jaggard dot org dot uk
¶
16 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
;
}
?>
gotankersley at NOSPAM dot com
¶
13 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)