Overview
PHP (recursive acronym for "PHP:
Hypertext Preprocessor") is a widely-used Open Source general-purpose scripting language
that is especially suited for Web development and can be embedded into
HTML.
With PHP you are not limited to output HTML. PHP's abilities
includes outputting images and PDF files generated on the fly. You can also output easily
any text, such as XHTML and any other XML file.
One of the strongest and most significant features in PHP is its
support for a wide range of databases. Writing a database-enabled web page is incredibly
simple. In this article we extend and test the material found in the original
article.
Software Components tested in this Article
|
|
GENTOO Linux 2004.1 |
Our Platform for
Development |
Apache 2.0.52 |
The PHP community still recommends
Apache 1.3, specially for security reasons. |
PHP-4.3.10 |
The latest PHP Release is
5.0.3. |
Oracle 10.1.0.3 for Linux
x86 |
Oracle Database 10g Release 1
(10.1.0.3) for Linux x86.
The Installation of Oracle 10.1.0.3 is not shown in this article. |
Instant
Client Package - Basic |
Needed to run OCI, OCCI, and JDBC-OCI
applications |
Instant
Client Package - SDK |
Additional
header files and an example makefile for developing Oracle applications with Instant
Client. |
OCI8 Patch
for PHP from Oracle |
If you are using PHP 4.3.10 you can
save the patch to a file, e.g. php_oci8ic_buildpatch |
Installing Apache-2.0.52
The installation and configuration of Apache is not
explained in detail here, see original documentation. Download the sources, unpack and install them as follows:
./configure --prefix=/usr/local/apache \
--enable-mods-shared=most \
--enable-ssl=shared \
--enable-mime-magic \
--enable-cern-meta \
--enable-proxy \
--enable-proxy-connect \
--enable-proxy-ftp \
--enable-proxy-http \
--enable-usertrack \
--enable-unique-id \
--enable-deflate
Edit the apache configuation file httpd.conf and add:
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
Installing PHP-4.3.10 with the OCI8 Extension
To add Oracle connectivity on Linux, PHP
needs to be recompiled with the OCI8 Patch.
- Download PHP-4.3.10 and unpack it.
- Download the Basic and the SDK Instant Client packages from the
Instant Client page on OTN.
Collectively the two RPMs are about 30MB in size.
- Install rpm utility (GENTOO
Linux has usually no rpm installed). Probably you will
encounter blocking problems.
emerge rpm
Calculating dependencies ...done!
!!! Error: the dev-libs/libelf package conflicts with another package.
!!! both can't be installed on the same system together.
!!! Please use 'emerge --pretend' to determine blockers.
Okay,
here is the problem: we can't emerge rpm because there is a conflict with the
libelf (installed) package. Let's try to resolve the conflict.
emerge -p rpm
Calculating dependencies ...done!
[blocks B ] dev-libs/libelf (from pkg dev-libs/elfutils-0.84)
[ebuild N ] dev-lang/python-2.2.3-r5
[ebuild N ] dev-libs/elfutils-0.84
[ebuild N ] app-arch/rpm-4.2_pre069
As you can see libelf is blocking rpm as [blocks B ]
points.
From emerge man pages:
Blockers are defined when two packages will clobber each others files, or
otherwise
cause some form of breakage in your system. However, blockers usually do not
need
to be simultaneously emerged because they usually provide the same functionality.
So to resolve the conflict proceed as follows:
emerge unmerge libelf
And there should be no blocking package now...
emerge -p rpm
Calculating dependencies ...done!
[ebuild N ] dev-lang/python-2.2.3-r5
[ebuild N ] dev-libs/elfutils-0.84
[ebuild N ] app-arch/rpm-4.2_pre069
Now proceed as usual...
emerge xfree
- Install the RPMs as the root user. On GENTOO Linux, rpm is
usually not there and can be in installed as follows.
rpm -Uvh oracle-instantclient-basic-10.1.0.3-1.i386.rpm
rpm -Uvh oracle-instantclient-devel-10.1.0.3-1.i386.rpm
The first RPM puts the Oracle libraries in /usr/lib/oracle/10.1.0.3/client/lib and the second creates headers
in /usr/include/oracle/10.1.0.3/client
cd /usr/lib/oracle/10.1.0.3/client/lib
ls -l
-r--r--r-- 1 root root 1461081 Dec 2 21:03
classes12.jar
lrwxrwxrwx 1 root root 17 Jan 17 11:35 libclntsh.so
-> libclntsh.so.10.1*
-rwxr-xr-x 1 root root 13495923 Dec 2 21:03 libclntsh.so.10.1*
-r-xr-xr-x 1 root root 2121849 Dec 2 21:03 libnnz10.so*
lrwxrwxrwx 1 root root 15 Jan 17 11:35 libocci.so
-> libocci.so.10.1*
-rwxr-xr-x 1 root root 913575 Dec 2 21:03 libocci.so.10.1*
-rwxr-xr-x 1 root root 66159152 Dec 2 21:03 libociei.so*
-rwxr-xr-x 1 root root 96517 Dec 2 21:03 libocijdbc10.so*
-r--r--r-- 1 root root 1397543 Dec 2 21:03 ojdbc14.jar
cd /usr/include/oracle/10.1.0.3/client
ls -l
-r--r--r-- 1 root
root 32137 Dec 2 21:03 nzerror.h
-r--r--r-- 1 root
root 84539 Dec 2 21:03 nzt.h
-r--r--r-- 1 root
root 11587 Dec 2 21:03 occiAQ.h
-r--r--r-- 1 root
root 36750 Dec 2 21:03 occiCommon.h
-r--r--r-- 1 root
root 70671 Dec 2 21:03
occiControl.h
-r--r--r-- 1 root
root 33996 Dec 2 21:03 occiData.h
-r--r--r-- 1 root
root 2115 Dec 2 21:03 occi.h
-r--r--r-- 1 root
root 29156 Dec 2 21:03
occiObjects.h
-r-xr-xr-x 1 root
root 7155 Dec 2 21:03 oci1.h*
-r--r--r-- 1 root
root 10228 Dec 2 21:03 oci8dp.h
-r--r--r-- 1 root
root 404315 Dec 2 21:03 ociap.h
-r-xr-xr-x 1 root
root 6055 Dec 2 21:03
ociapr.h*
-r--r--r-- 1 root
root 43225 Dec 2 21:03 ocidef.h
-r-xr-xr-x 1 root
root 4014 Dec 2 21:03
ocidem.h*
-r--r--r-- 1 root
root 11331 Dec 2 21:03 ocidfn.h
-r--r--r-- 1 root
root 8954 Dec 2 21:03
ociextp.h
-r--r--r-- 1 root
root 132242 Dec 2 21:03 oci.h
-r-xr-xr-x 1 root
root 6638 Dec 2 21:03
ocikpr.h*
-r--r--r-- 1 root
root 4464 Dec 2 21:03
ocixmldb.h
-r--r--r-- 1 root
root 19099 Dec 2 21:03 odci.h
-r--r--r-- 1 root
root 6605 Dec 2 21:03
oratypes.h
-r--r--r-- 1 root
root 15031 Dec 2 21:03 orid.h
-r--r--r-- 1 root
root 102726 Dec 2 21:03 ori.h
-r--r--r-- 1 root
root 157674 Dec 2 21:03 orl.h
-r--r--r-- 1 root
root 42626 Dec 2 21:03 oro.h
-r--r--r-- 1 root
root 116591 Dec 2 21:03 ort.h
-r-xr-xr-x 1 root
root 9520 Dec 2 21:03 xa.h*
- Patch PHP-4.3.10
Apply the patch to PHP's ext/oci8/config.m4. The
patch line numbers are based on PHP 4.3.9.
If you are using PHP 4.3.10 you can save the patch to a file, e.g. php_oci8ic_buildpatch, and install it using:
cd php-4.3.10/ext/oci8
patch -u config.m4 php_oci8ic_buildpatch
The patch creates a new PHP configuration parameter: --with-oci8-instant-client[=DIR]. On Linux, by default, it uses
the latest version of the Instant Client installed from the RPMs. A directory to the
Oracle libraries can be specified to use a different version. In either case, the
correct SDK headers will automatically be used. The new parameter is mutally exclusive
with the existing --with-oci8 parameter.
- Rebuild the configure script in
the top-level PHP directory.
cd php-4.3.10
rm -rf config.cache
./buildconf --force
- Rebuild PHP
./configure \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-oci8-instant-client \
--enable-sigchild
make
make install
cp php.ini-dist /usr/local/lib/php.ini
Note, that a new PHP4 module was created in /usr/local/apache/modules
cd /usr/local/apache/modules
ls -l libphp4.so
-rwxr-xr-x 1 root root 6113514 Jan 17 12:01 libphp4.so
- Set LD_LIBRARY_PATH to /usr/lib/oracle/10.1.0.3/client/lib and restart Apache.
If a tnsnames.ora file is used to define Oracle Net
service names, set TNS_ADMIN to the directory containing the file.
It is important to set all Oracle environment variables before starting Apache. A
script helps do that:
cd /etc/init.d
cat apache2
#!/sbin/runscript
ORACLE_HOME=/opt/oracle/product/10.1.0; export ORACLE_HOME
ORACLE_SID=AKI1; export ORACLE_SID
TNS_ADMIN=/home/oracle/config/10.1.0 export TNS_ADMIN
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1; export NLS_LANG
LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib; export LD_LIBRARY_PATH
opts="${opts} reload"
depend() {
need net
use dns logger netmount
after sshd
}
start() {
ebegin "Starting apache2"
[ -f /var/log/apache2/ssl_scache ]
&& rm /var/log/apache2/ssl_scache
env -i PATH=$PATH /sbin/start-stop-daemon
--quiet \
--start --startas /usr/local/apache2/bin/httpd \
--pidfile /var/run/apache2.pid -- -k start ${APACHE2_OPTS}
eend $?
}
stop() {
ebegin "Stopping apache2"
/usr/local/apache/bin/apachectl stop
>/dev/null
start-stop-daemon -o --quiet --stop
--pidfile /var/run/apache2.pid
eend $?
}
reload() {
ebegin "Gracefully restarting apache2"
/usr/local/apache2/bin/httpd -t
${APACHE2_OPTS} &>/dev/null
if [ "$?" = "0" ]
then
if [ -f /var/run/apache2.pid ]
then
kill -USR1 $(</var/run/apache2.pid)
eend $?
else
svc_start
eend $?
fi
else
if [ -f /var/run/apache2.pid ]
then
svc_stop
fi
/usr/local/apache2/bin/httpd -t ${APACHE2_OPTS}
eend 1
fi
}
./apache2 stop
./apache2 start
To confirm the extension is configured, create a simple PHP script
test.php where the web server can read it.
<?php
phpinfo();
?> Load the script into a browser using a URL similar to "http://localhost/test.php".
The browser page should contain an "oci8" section saying "OCI8 Support enabled".
Connecting to Oracle
Oracle connection information is passed to OCILogon() to create a connection. Tools linked with Instant
Client are always "remote" from any database server and an Oracle Net connection
identifier must be used along with a username and password. The connection information
is likely to be well known for established Oracle databases. With new systems the
information is given by the Oracle installation program when the database is set up.
The installer should have configured Oracle Net and created a service name.
Here is a simple PHP script: oci-test.php
<?php
// Set Oracle Environment
PutEnv("ORACLE_SID=AKI1");
PutEnv("ORACLE_HOME=/opt/oracle/product/10.1.0");
PutEnv("TNS_ADMIN=/home/oracle/config/10.1.0");
PutEnv("LD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib");
// Try to connect to Oracle
if ($conn = OCILogon("system", "manager", "AKI1")) {
// Prepare the Query
$query = "SELECT osuser,machine,program FROM v\$session ORDER BY osuser,
machine";
$stid = OCIParse($conn, $query);
// Fetch the Rows
if (OCIExecute($stid)) {
$numcols = OCINumCols($stid);
echo "<table border=\"1\" cellpadding=\"3\"
bgcolor=\"#F0F0F0\">\n";
echo
"<caption>".OCIServerVersion($conn)."</caption>\n";
echo
"<tr><th>".OCIColumnname($stid,1)."<br>".OCIColumnType($stid,1)."</th>";
echo
"<th>".OCIColumnname($stid,2)."<br>".OCIColumnType($stid,2)."</th>";
echo
"<th>".OCIColumnname($stid,3)."<br>".OCIColumnType($stid,3)."</th></tr>\n";
while (OCIFetchInto($stid, &$result, OCI_ASSOC))
{
echo "<tr><td>";
echo $result['OSUSER'];
echo
"</td><td>";
echo $result['MACHINE'];
echo
"</td><td>";
echo $result['PROGRAM'];
echo
"</td></tr>\n";
}
echo "</tr></table>\n";
echo "<p>\n";
}
OCIFreeStatement($stid);
OCILogoff($conn);
} else {
$err = OCIError();
echo "Oracle Connect Error " . $err[text];
exit;
}
?>
Load the script into a browser using a URL similar to
"http://localhost/oci-test.php".
Conclusion
PHP has built in support for OCI8 - but to make it work smoothly,
PHP4 must be patched as shown in this article.
|