mirror of
https://github.com/php/php-src.git
synced 2024-11-24 18:34:21 +08:00
2769ae0444
oci_set_module_name oci_set_action oci_set_client_info oci_set_client_identifier These functions set values that are visible and used by the database. They aid tracing, authentication and auditing. 2. Introduce connection attribute function: oci_set_edition Oracle 11g R2 "editions" allow multiple versions of DB objects to exist at one time. By setting different editions, two different versions of an application can run concurrently, making upgrades or A/B testing easier. 3. Introduce OCI_NO_AUTO_COMMIT as an alias for the OCI_DEFAULT constant (which is not the default value) used by oci_execute(). 4. Allow the oci_set_prefetch value to be 0. This is important in some cases using REF CURSORS in Oracle 11gR2. 5. Set the DRIVER_NAME attribute of Oracle Database 11gR2 connections to aid application tracing. The value used is to "PHP OCI8" followed by the OCI8 version number. Note the version number may get truncated in DB views such as v$session_connect_info. 6. Generate an error if an invalid resource type is used in oci_bind_by_name [DOC] Documentation will be added for the changes
455 lines
15 KiB
Plaintext
455 lines
15 KiB
Plaintext
Installing OCI8
|
|
---------------
|
|
|
|
0. Overview
|
|
1. Common requirements
|
|
2. Installing as a shared extension
|
|
3. Installing as a statically compiled extension
|
|
4. Installing from PECL to an existing PHP
|
|
5. Testing OCI8
|
|
6. Oracle DRCP and FAN Support
|
|
|
|
|
|
0. Overview
|
|
-----------
|
|
|
|
The OCI8 extension allows you to access Oracle databases. It can be
|
|
built using Oracle 9.2, 10.2, 11.1 or 11.2 client libraries, and
|
|
allows Oracle's standard cross-version connectivity. This release can
|
|
be used with PHP versions 4.3.9 to 5.x.
|
|
|
|
The OCI8 extension is not related to, or used by, PDO_OCI, the PHP
|
|
Data Objects (PDO) extension for Oracle.
|
|
|
|
1. Common requirements
|
|
----------------------
|
|
|
|
This version of PHP OCI8:
|
|
|
|
- Will build with Oracle 9.2 (or more recent) client libraries. The
|
|
same (or more recent) version of Oracle libraries used when
|
|
building OCI8 must also be used at runtime.
|
|
|
|
- Can be used with PHP versions 4.3.9 to 5.x.
|
|
|
|
If you build PHP with the "ORACLE_HOME" Oracle database or full Oracle
|
|
client libraries:
|
|
|
|
- you MUST set at least the ORACLE_HOME environment variable and
|
|
make it visible for your web server BEFORE it starts.
|
|
|
|
- the Oracle software must be readable by the web server. With
|
|
Oracle 10.2, see the $ORACLE_HOME/install/changePerm.sh script
|
|
included in patch releases.
|
|
|
|
If you build PHP with Oracle Instant Client libraries from
|
|
http://www.oracle.com/technology/tech/oci/instantclient/index.html
|
|
|
|
- either the "basic" or "basic-lite" package is required.
|
|
|
|
- the "devel" package is required.
|
|
|
|
- you don't have to set ORACLE_HOME and many of the other
|
|
environment variables to build PHP with OCI8 support.
|
|
|
|
For both ORACLE_HOME and Instant Client installs you may have to set:
|
|
|
|
- LD_LIBRARY_PATH: it must include the $ORACLE_HOME/lib or Instant
|
|
Client library directory
|
|
|
|
- NLS_LANG: if you want to change the default encoding used during
|
|
interaction with Oracle servers
|
|
|
|
The most appropriate places to add the environment variables are:
|
|
|
|
/etc/profile
|
|
/etc/profile.local
|
|
/etc/profile.d
|
|
|
|
|
|
2. Installing as a shared extension
|
|
-----------------------------------
|
|
|
|
Configure OCI8 using one of the the following configure options:
|
|
|
|
a) if you use an Oracle server or Oracle Client installation:
|
|
|
|
./configure --with-oci8=shared,$ORACLE_HOME
|
|
|
|
b) with Oracle Instant Client:
|
|
|
|
./configure --with-oci8=shared,instantclient,/path/to/instant/client/lib
|
|
|
|
If you use an RPM-based installation of Oracle Instant Client,
|
|
your configure line will look like this:
|
|
|
|
./configure --with-oci8=shared,instantclient,/usr/lib/oracle/<version>/client/lib
|
|
|
|
Follow the usual building procedure, e.g. "make install". The OCI8
|
|
shared extension oci8.so will be created. It may need to be manually
|
|
moved to the PHP extension directory, specified by the extension_dir
|
|
option in your php.ini file.
|
|
|
|
Edit php.ini file and add the line:
|
|
|
|
extension=oci8.so
|
|
|
|
|
|
3. Installing as a statically compiled extension
|
|
------------------------------------------------
|
|
|
|
Configure OCI8 using one of the the following configure options:
|
|
|
|
a) with a common Oracle server or full Oracle client installation
|
|
|
|
./configure --with-oci8=$ORACLE_HOME
|
|
|
|
b) with Oracle Instant Client
|
|
|
|
./configure --with-oci8=instantclient,/path/to/instant/client/lib
|
|
|
|
Run "make install".
|
|
|
|
After successful compile, you do not need to add oci8.so to php.ini.
|
|
The module will be usable without any additional actions.
|
|
|
|
|
|
4. Installing from PECL to an existing PHP
|
|
------------------------------------------
|
|
|
|
The OCI8 extension is also available as a PECL module on
|
|
http://pecl.php.net/package/oci8.
|
|
|
|
Install using either (a) or (b) below.
|
|
|
|
a) Do an automated download and install:
|
|
|
|
Set PEARs proxy, if necessary:
|
|
|
|
pear config-set http_proxy http://my-proxy.example.com:80/
|
|
|
|
Run
|
|
|
|
pecl install oci8
|
|
|
|
When prompted, enter either the value of $ORACLE_HOME, or
|
|
"instantclient,/path/to/instant/client/lib" (without quotes).
|
|
|
|
b) Alternatively, manually download the PECL package, e.g. oci8-1.3.5.tgz
|
|
|
|
Extract the package:
|
|
|
|
tar -zxf oci8-1.3.5.tgz
|
|
cd oci8-1.3.5
|
|
|
|
Prepare the package:
|
|
|
|
phpize
|
|
|
|
Configure the package, either using $ORACLE_HOME or Instant Client
|
|
|
|
./configure -with-oci8=shared,$ORACLE_HOME
|
|
|
|
or
|
|
|
|
./configure -with-oci8=shared,instantclient,/path/to/instant/client/lib
|
|
|
|
Install the package:
|
|
|
|
make install
|
|
|
|
After either install, edit your php.ini file, e.g. /etc/php.ini, and
|
|
add the line:
|
|
|
|
extension=oci8.so
|
|
|
|
Make sure php.ini's "extension_dir" includes the directory that
|
|
oci8.so was installed in.
|
|
|
|
|
|
5. Testing OCI8
|
|
---------------
|
|
|
|
OCI8 tests are in ext/oci8/tests. When OCI8 tests are run this
|
|
directory will contain logs of any failures.
|
|
|
|
5.1. Running OCI8 tests on Linux
|
|
|
|
5.1.1. Edit ext/oci8/tests/details.inc
|
|
|
|
Set the username, password and connection string for the database.
|
|
Most tests have been developed using the SYSTEM account: some tests
|
|
might fail unless the user has permissions to create necessary
|
|
tables, views, procedures etc.
|
|
|
|
If the database is on the same machine as PHP, set
|
|
$oracle_on_localhost to TRUE.
|
|
|
|
If Oracle 11g Database Resident Connection Pooling is being tested,
|
|
set $test_drcp to TRUE and ensure the connection string uses an
|
|
appropriate pooled server (see section 6.2.2).
|
|
|
|
An alternative to editing details.inc is the set the environment
|
|
variables
|
|
|
|
PHP_OCI8_TEST_USER
|
|
PHP_OCI8_TEST_PASS
|
|
PHP_OCI8_TEST_DB
|
|
PHP_OCI8_TEST_DB_ON_LOCALHOST
|
|
PHP_OCI8_TEST_DRCP
|
|
|
|
for example:
|
|
|
|
$ export PHP_OCI8_TEST_USER=system
|
|
$ export PHP_OCI8_TEST_PASS=oracle
|
|
$ export PHP_OCI8_TEST_DB=localhost/XE
|
|
$ export PHP_OCI8_TEST_DB_ON_LOCALHOST=TRUE
|
|
$ export PHP_OCI8_TEST_DRCP=FALSE
|
|
|
|
5.1.2. Set any necessary environment variables for the Oracle
|
|
database. With Oracle 10g XE do:
|
|
|
|
$ . /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
|
|
|
|
For other versions of the Oracle database do:
|
|
|
|
$ . /usr/local/bin/oraenv
|
|
|
|
5.1.3. Check your php.ini has E in the variables_order parameter, for
|
|
example:
|
|
|
|
variables_order = "EGPCS"
|
|
|
|
5.1.4. Run the tests:
|
|
|
|
$ cd <your php src directory>
|
|
$ make test TESTS=ext/oci8
|
|
|
|
5.2. The tests execute rapidly. On fast machines with a local
|
|
database configured for light load (e.g. Oracle 10g XE) you might
|
|
see random tests fail with ORA-12516 or ORA-12520 errors. To
|
|
prevent this, increase the database PROCESSES parameter using the
|
|
following steps.
|
|
|
|
5.2.1. Connect as the oracle software owner:
|
|
|
|
$ su - oracle
|
|
|
|
5.2.2. Set the necessary environment variables as in 5.1.2.
|
|
|
|
5.2.3. Start the SQL*Plus command line tool and increase PROCESSES
|
|
|
|
$ sqlplus / as sysdba
|
|
SQL> alter system set processes=100 scope=spfile
|
|
|
|
5.2.4. Restart the database:
|
|
|
|
SQL> startup force
|
|
|
|
|
|
6. Oracle DRCP and FAN Support
|
|
------------------------------
|
|
|
|
The PHP OCI8 extension has support for the Oracle Database Resident
|
|
Connection Pool (DRCP) and Fast Application Notification (FAN).
|
|
|
|
Questions and issues can be raised on the Oracle OTN forum (free
|
|
registration required):
|
|
http://www.oracle.com/technology/forums/php.html
|
|
|
|
|
|
6.1. Oracle Version Compatibility
|
|
|
|
The OCI8 extension will compile with Oracle libraries from version
|
|
9iR2 onwards. However, full functionality (e.g. DRCP support) is only
|
|
available when Oracle 11g is used.
|
|
|
|
For general database functionality the version of the Oracle libraries
|
|
used by PHP does not necessarily have to match the version of the
|
|
database.
|
|
|
|
|
|
6.2. Database Resident Connection Pooling (DRCP)
|
|
|
|
DRCP allows more efficient use of database machine memory and provides
|
|
high scalability.
|
|
|
|
For DRCP to be available in OCI8, Oracle client libraries used by PHP
|
|
and the version of the Oracle Database must both be 11g.
|
|
|
|
Documentation on DRCP is found in several Oracle manuals. For example,
|
|
see "Configuring Database Resident Connection Pooling" in the Oracle
|
|
Database Administrator's Guide 11g Release 1 (11.1)
|
|
http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/manproc004.htm#CHDGIDBA
|
|
for usage information. A whitepaper
|
|
http://www.oracle.com/technology/tech/oci/pdf/oracledrcp11g.pdf
|
|
contains background information on DRCP.
|
|
|
|
After building PHP with the OCI8 extension and 11g libraries, follow
|
|
these steps:
|
|
|
|
6.2.0 Important: if Oracle Database 11.1.0.6 with DRCP connections is
|
|
used, then the Oracle database patch for bug 6474441 must be
|
|
applied (see section 6.5). Without this patch, "ORA-01000:
|
|
maximum open cursors exceeded", "ORA-01001 invalid cursor" or
|
|
"ORA-01002 fetch out of sequence" errors may occur.
|
|
|
|
If the Oracle 11.1.0.6 database patch cannot be applied, one of
|
|
the following three workarounds can be used to disable statement
|
|
caching instead:
|
|
|
|
(i) Connect using Oracle dedicated or shared servers instead of DRCP.
|
|
|
|
(ii) Set PHP's oci8.statement_cache_size to 0.
|
|
|
|
(iii) Set an event in the database initialization parameter file:
|
|
event="56699 trace name context forever, level 128".
|
|
|
|
|
|
6.2.1. As a privileged database administrator, use a program like
|
|
SQL*Plus to start the connection pool in the database:
|
|
|
|
SQL> execute dbms_connection_pool.start_pool;
|
|
|
|
Optional settings control the size and characteristics of the
|
|
pool.
|
|
|
|
6.2.2. For PHP applications that currently connect using a Network Alias
|
|
like:
|
|
|
|
$c = oci_pconnect("myuser", "mypassword", "MYDB");
|
|
|
|
Modify your tnsnames.ora file and add the "(SERVER=POOLED)"
|
|
clause, for example:
|
|
|
|
MYDB = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=myhost.dom.com)
|
|
(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales)
|
|
(SERVER=POOLED)))
|
|
|
|
Alternatively, modify the Easy Connect syntax in PHP and add
|
|
":POOLED" after the service name:
|
|
|
|
$c = oci_pconnect("myuser", "mypassword",
|
|
"myhost.dom.com:1521/sales:POOLED");
|
|
|
|
6.2.3. Edit php.ini and choose a connection class name. This name
|
|
indicates a logical division of the connection pool and can be
|
|
used to isolate pooling for separate applications. Any PHP
|
|
instance with the same connection class value will share
|
|
connections in the pool.
|
|
|
|
oci8.connection_class = "MY_APPLICATION_NAME"
|
|
|
|
6.2.4. Run your application, connecting to the 11g database.
|
|
|
|
|
|
6.3. Fast Application Notification (FAN) Support
|
|
|
|
FAN support gives fast connection failover, a high availability
|
|
feature. This allows PHP OCI8 scripts to be notified when a database
|
|
machine or database instance becomes unavailable. Without FAN, OCI8
|
|
can hang until a TCP timeout occurs and an error is returned, which
|
|
might be several minutes. Enabling FAN in OCI8 can allow your
|
|
applications to detect errors and re-connect to an available database
|
|
instance without the web user being aware of an outage.
|
|
|
|
FAN support is available when the Oracle client libraries that PHP
|
|
links with and the Oracle Database are either version 10gR2 or 11g.
|
|
|
|
FAN benefits users of Oracle's clustering technology (RAC) because
|
|
connections to surviving database instances can be immediately made.
|
|
Users of Oracle's Data Guard with a broker will see the FAN events
|
|
generated when the standby database goes online. Standalone databases
|
|
will send FAN events when the database restarts.
|
|
|
|
For active connections, when a machine or database instance becomes
|
|
unavailable, a connection failure error will be returned by the OCI8
|
|
extension function currently being called. On a subsequent PHP script
|
|
re-connect, a connection to a surviving database instance will be
|
|
established. The OCI8 extension also transparently cleans up any idle
|
|
connections affected by a database machine or instance failure so PHP
|
|
connect calls will establish a fresh connection without the script
|
|
being aware of any service disruption.
|
|
|
|
When oci8.events is On, it is suggested to set oci8.ping_interval to
|
|
-1 to disable pinging, since enabling FAN events provide pro-active
|
|
connection management of idle connections made invalid by a service
|
|
disruption.
|
|
|
|
To enable FAN support in PHP, after building PHP with Oracle 10gR2 or
|
|
11g libraries follow these steps:
|
|
|
|
6.3.1. As a privileged database administrator, use a program like
|
|
SQL*Plus to enable the database service to post FAN events, for
|
|
example:
|
|
|
|
SQL> execute dbms_service.modify_service(
|
|
SERVICE_NAME => 'sales',
|
|
AQ_HA_NOTIFICATIONS => TRUE);
|
|
|
|
6.3.2. Edit php.ini and add
|
|
|
|
oci8.events = On
|
|
|
|
6.3.3. If your application does not already handle OCI8 error
|
|
conditions, modify it to detect failures and take appropriate
|
|
action. This may include re-connecting and re-executing
|
|
statements.
|
|
|
|
6.3.4. Run your application, connecting to a 10gR2 or 11g database.
|
|
|
|
|
|
6.4. Recommendations and Known Limitations
|
|
|
|
6.4.1 Changing Password for DRCP connections
|
|
|
|
Changing a password over DRCP connections will fail with the error
|
|
"ORA-56609: Usage not supported with DRCP". This is an documented
|
|
restriction of Oracle Database 11g.
|
|
|
|
6.4.2 Closing Connections
|
|
|
|
With the PHP OCI8 extension, persistent connections can now be closed
|
|
by the user, allowing greater control over connection resource usage.
|
|
Persistent connections will now also be closed automatically when
|
|
there is no PHP variable referencing them, such as at the end of scope
|
|
of a PHP user function. This will rollback any uncommitted
|
|
transaction. These changes to persistent connections make them behave
|
|
similarly to non-persistent connections, simplifying the interface,
|
|
allowing for greater application consistency and predictability. Use
|
|
oci8.old_oci_close_semantics=1 to retain the historical behavior.
|
|
|
|
6.4.3 LOGON Triggers can be used to set session properties
|
|
|
|
The patch for Oracle Database 11.1.0.6 bug 6474441 (see section 6.5)
|
|
allows PHP applications with DRCP connection to use a database LOGON
|
|
trigger to set session properties at the time of session creation.
|
|
Examples of such settings are the NLS language and the date format.
|
|
|
|
If the Oracle 11.1.0.6 database patch cannot be applied, one of the
|
|
following workarounds can be used:
|
|
|
|
(i) After logon, explicitly set the session properties using PHP
|
|
application code.
|
|
|
|
(ii) Connect using Oracle dedicated or shared servers instead of DRCP.
|
|
|
|
With DRCP there is an connection management relationship between (i)
|
|
DRCP's automatic pool expansion and reduction, (ii) PHP's persistent
|
|
connection caching, (iii) with the way LOGON triggers fire with DRCP
|
|
authentication. Because of this interplay, LOGON triggers in PHP
|
|
(when DRCP is used) are only recommended for setting session
|
|
attributes and not for per-PHP connection events.
|
|
|
|
|
|
6.5. Patching Oracle Database 11g
|
|
|
|
The patch for bug 6474441 is available from Oracle Support's Metalink
|
|
system.
|
|
|
|
The bug is specific to Oracle 11.1.0.6 with DRCP connections. The
|
|
issues it fixes do not affect connections using Oracle's dedicated
|
|
(the default connection mode) or shared servers. They do not affect
|
|
earlier versions of Oracle. The bug is fixed in Oracle Database
|
|
11.1.0.7.
|