Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : PHP / Java Integration

PHP / Java Integration

Introduction

There are two possible ways to bridge PHP and Java: you can either integrate PHP into a Java Servlet environment, which is the more stable and efficient solution, or integrate Java support into PHP. The former is provided by a SAPI module that interfaces with the Servlet server, the latter by this Java extension.

The Java extension provides a simple and effective means for creating and invoking methods on Java objects from PHP. The JVM is created using JNI, and everything runs in-process.

Warning:

This extension is EXPERIMENTAL. The behaviour of this extension -- including the names of its functions and anything else documented about this extension -- may change without notice in a future release of PHP. Use this extension at your own risk.

Requirements

You need a Java VM installed on your machine to use this extension.

Installation

This » PECL extension is not bundled with PHP.

In PHP 4 this PECL extensions source can be found in the ext/ directory within the PHP source or at the PECL link above. In order to use these functions you must compile PHP with Java support by using the --with-java[=DIR] where DIR points to the base install directory of your JDK. This extension can only be built as a shared extension. Additional build extensions can be found in php-src/ext/java/README.

Windows users will enable php_java.dll inside of php.ini in order to use these functions. In PHP 4 this DLL resides in the extensions/ directory within the PHP Windows binaries download. The DLL for this PECL extension may be downloaded from either the » PHP Downloads page or from » http://pecl4win.php.net/

Note:

In order to enable this module on a Windows environment with PHP <= 4.0.6, you must make jvm.dll available to your systems PATH. No additional DLL is needed for PHP versions > 4.0.6.

Runtime Configuration

The behaviour of these functions is affected by settings in php.ini.

Table 152. Java configuration options

Name Default Changeable Changelog
java.class.path NULL PHP_INI_ALL  
java.home NULL PHP_INI_ALL  
java.library.path NULL PHP_INI_ALL  
java.library JAVALIB PHP_INI_ALL  


For further details and definitions of the PHP_INI_* constants, see the Appendix I, php.ini directives.

Resource Types

This extension has no resource types defined.

Predefined Constants

This extension has no constants defined.

Examples

Example 1095. Java Example

<?php
// get instance of Java class java.lang.System in PHP
$system = new Java('java.lang.System');

// demonstrate property access
echo 'Java version=' . $system->getProperty('java.version') . '<br />';
echo
'Java vendor=' . $system->getProperty('java.vendor') . '<br />';
echo
'OS=' . $system->getProperty('os.name') . ' ' .
           
$system->getProperty('os.version') . ' on ' .
           
$system->getProperty('os.arch') . ' <br />';

// java.util.Date example
$formatter = new Java('java.text.SimpleDateFormat',
                     
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");

echo
$formatter->format(new Java('java.util.Date'));
?>


Example 1096. AWT Example

<?php
// This example is only intended to be run as a CGI.

$frame  = new Java('java.awt.Frame', 'PHP');
$button = new Java('java.awt.Button', 'Hello Java World!');

$frame->add('North', $button);
$frame->validate();
$frame->pack();
$frame->visible = True;

$thread = new Java('java.lang.Thread');
$thread->sleep(10000);

$frame->dispose();
?>


Notes:

  • new Java() will create an instance of a class if a suitable constructor is available. If no parameters are passed and the default constructor is useful as it provides access to classes like java.lang.System which expose most of their functionallity through static methods.
  • Accessing a member of an instance will first look for bean properties then public fields. In other words, print $date.time will first attempt to be resolved as $date.getTime(), then as $date.time.
  • Both static and instance members can be accessed on an object with the same syntax. Furthermore, if the java object is of type java.lang.Class, then static members of the class (fields and methods) can be accessed.
  • Exceptions raised result in PHP warnings, and NULL results. The warnings may be eliminated by prefixing the method call with an "@" sign. The following APIs may be used to retrieve and reset the last error:

  • Overload resolution is in general a hard problem given the differences in types between the two languages. The PHP Java extension employs a simple, but fairly effective, metric for determining which overload is the best match.

    Additionally, method names in PHP are not case sensitive, potentially increasing the number of overloads to select from.

    Once a method is selected, the parameters are coerced if necessary, possibly with a loss of data (example: double precision floating point numbers will be converted to boolean).

  • In the tradition of PHP, arrays and hashtables may pretty much be used interchangably. Note that hashtables in PHP may only be indexed by integers or strings; and that arrays of primitive types in Java can not be sparse. Also note that these constructs are passed by value, so may be expensive in terms of memory and time.

Java Servlet SAPI

The Java Servlet SAPI builds upon the mechanism defined by the Java extension to enable the entire PHP processor to be run as a servlet. The primary advantage of this from a PHP perspective is that web servers which support servlets typically take great care in pooling and reusing JVMs. Build instructions for the Servlet SAPI module can be found in php4/sapi/README. Notes:

  • While this code is intended to be able to run on any servlet engine, it has only been tested on Apache's Jakarta/tomcat to date. Bug reports, success stories and/or patches required to get this code to run on other engines would be appreciated.
  • PHP has a habit of changing the working directory. sapi/servlet will eventually change it back, but while PHP is running the servlet engine may not be able to load any classes from the CLASSPATH which are specified using a relative directory syntax, or find the work directory used for administration and JSP compilation tasks.

Table of Contents

java_last_exception_clear — Clear last Java exception
java_last_exception_get — Get last Java exception

Code Examples / Notes » ref.java

tobozo

Workaround for Win32 / Apache / PHP4 users that do not wish to switch from SAPI to CGI :
Java Bridge is a great project, and it's too bad I *have* to upgrade to php5 to see it working. One more reason not to use php5.
I have a production server running a few intranet applications and other php utilities, on a w2k platform with Apache-1.3.33 and php-4.3.10.
I need to have java working along with php on this production server, and I do not wish to upgrade all php applications to php5, nor do I wish to switch to Apache2 to get php4 and php5 running together.
So my choice went to ext/php_java. Of course I've had the usual issues  ...
"Fatal error: Unable to Create Java Virtual Machine"
Basically the workaround for this thread issue is to " use CGI instead of SAPI "
But CGI is slower than SAPI, what about performances for all my applications ?
Well there is a (clumsy) solution :  use both CGI and SAPI, keeping SAPI for the regular php work, and creating a new mime type and extension in the httpd.conf for the php files invoking java.
I chose to use the '.jhp' extension (yeah, sounds horrible but still, it's nicer than '.phava'), here's a copy of my settings :
my php.ini :
--------------
[Java]
extension=php_java.dll
java.class.path = C:\php4-Win32\extensions\php_java.jar
java.home = c:\jdk-1.5
java.library = c:\jdk-1.5\jre\bin\server\jvm.dll
my httpd.conf :
------------------
ScriptAlias /jhp/ "C:/php4-Win32/"
AddType application/x-httpd-jhp .jhp
Action application/x-httpd-jhp /jhp/php.exe
The Server :
--------------
Windows 2000 (fr) SP4
Apache/1.3.33 (Win32)
Php 4.3.10 (SAPI + CGI)
Java version=1.5.0_06


vikas kumar

wamp5_1.7.2.exe+jdk1.5.0_10 integration error
extension=php_java.dll
[java]
java.home="C:\Program Files\Java\jdk1.5.0_10; C:\Program Files\Java\jdk1.5.0_10\lib"
java.class.path="C:\wamp\php\ext\JavaBridge.jar; C:\Program Files\Java\jdk1.5.0_10\lib"
java.library.path="C:\wamp\php\ext; C:\Program Files\Java\jdk1.5.0_10\lib"
java.library="C:\Program Files\Java\jdk1.5.0_10\jre\bin\server\jvm.dll"


norman

This works fine on MacOS X (Panther). The one trick is, you need to symlink "java.so" in your php extensions directory to "libphp_java.jnilib".
Here's the relevant section from my php.ini file for anyone who needs it:
[Java]
java.class.path = "/usr/local/lib/java/php_java.jar"
java.home = "/System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Home"
java.library.path = "/usr/local/lib/php/extensions/no-debug-non-zts-20020429"
extension=java.so
You may have decided to put php_java.jar somewhere other than where I did.
For some reason, setting java.library in the ini file causes this to fail, so I left it out and things worked flawlessly without it. YMMV.


golob a with tail gimb little spot org

This module allows PHP to interact with some interesting pieces of software - for one, it allows PHP to convert XML FO files into PDF/PS/... with the use of Apache FOP processor.
Here's an example:
<?
$basedir = new Java("java.io.File", ".");
$outdir = new Java("java.io.File", "out");
$outdir->mkdirs();
$fofile = new Java("java.io.File", $basedir, "xml/fo/helloworld.fo");
$pdffile = new Java("java.io.File", $outdir, "ResultFO2PDF.pdf");
echo "Input: ".$fofile->toString()."\n";
echo "Output: ".$pdffile->toString()."\n";
$driver = new Java("org.apache.fop.apps.Driver");
$logger = new Java("org.apache.avalon.framework.logger.ConsoleLogger");
$driver->setLogger($logger);
$driver->setRenderer($driver->RENDER_PDF);
$out = new Java("java.io.FileOutputStream", $pdffile);
$driver->setOutputStream($out);
$in = new Java("java.io.FileInputStream", $fofile);
$driver->setInputSource(new Java("org.xml.sax.InputSource", $in));
$driver->run();
$in->close();
$out->close();
?>


frey_thom76

The previous note is very misleading:
Switching from the Apache- to the CGI SAPI doesn't solve the fundamental problem that PHP4's ext/php_java continously allocates a new VM until the machine runs out of resources ("Fatal error: Unable to Create Java Virtual Machine")
The mentioned JavaBridge works well with PHP 4 (I use it since one year now)
It is not necessary to switch to Apache 2 to run PHP 4 and PHP 5 side-by-side


jost2345

The PHP/Java bridge that has been posted some time ago is now available on sourceforge.net.  It contains several bugfixes and is meant to be used as a replacement for the expermental PHP4 java bridge.
 http://sourceforge.net/projects/php-java-bridge/
So please don't send me private e-mails anymore to obtain the sourcecode for the bridge.
PHP/5 users may want to wait for the official PHP/Java bridge, which I expect to appear in a few years when java contains the appropriate hooks.


beoran

The php-java-bridge mentioned below is indeed the way to go. It also works fine on a php 4.3.2 Linux web server. I think I can reccomend it.

stanley dot turnteen

The php-java-bridge from sourceforge works great - it's stable and fast. I'm using it with the Lucene full text indexing package (http://lucene.apache.org/java/docs/index.html).

a9702466

The Java Servlet SAPI works fine in a non-threading
environment. If you want to use threads (normal case) you
have to do several things to get it work:
- get the patched files from
 http://www.pelikan-it.com/download.html
- replace the sapi/servlet/servlet.java and
 sapi/servlet/servlet.c file by the patched files
- build the php like this
 ./configure --with-tsrm-pthreads \
   --with-servlet=/opt/resin --with-java=/opt/java \
   --prefix=/opt/php-4.3.4
The primary problem is, that the request and response
objects are stored as global instance-variables of the servlet
which will be overwritten by other threads invoking the
servlet (remember: just on servlet-object for all threads!) and
all crashes. I changed the servlet to pass the request and
response objects to the java- and native-methods (where
required) to prevent the problem.
Once you have solved this problem it works fine and needs
unlike the java-extension just one jvm.


thomas

The documentation is missing an important note:
The PHP/JAVA bridge only works on threaded http servers such as IIS, it does NOT work on http servers such as APACHE which fork off (sub-)processes.
The reason for this is that for each new request APACHE fork()'s off a new and independed copy of itself, initializes the java VM and eventually passes control over to VM until the request is finished.  If the request is  finished, the child with the java VM go to the apache pool.
That means that after a while hundreds (up to MAX-PROCESSES) of  java VM's are in the apache pool each of them eating away up to 64MB.  The machine may sooner or later crash because it ran out of memory. (If you have luck, the bridge will not run at all because apache was not statically linked to the pthreads library).
Although another PHP/Java bridge exists that does not have this problem (do a google search for "A new PHP/JAVA module"), the java binding (used by both bridges) has also problems one must be aware of. For example if one creates a Properties() object, one will receive a reference to it and may ask this reference for its values. However, if one invokes a method that returns a Properties() object, one will receive an array of values, not a reference to the Properties() object.
In short: If you want to use java from php in IIS, you can use this bridge. BUT if you want to use java from php in APACHE, you must use a socket approach (for an example see "A new PHP/JAVA module").


aruntheking

Something that i missed out in my above mentioned earlier note on the same
topic, Thanks to Pablo for reminding me the same
Important
-------------
After you have completed the above mentioned steps, open the httpd file in /etc/init.d and type the following lines
LD_LIBRARY_PATH=:/usr/local/j2sdk1.4.0_02/jre/lib/i386
:\/usr/local/j2sdk1.4.0_02/jre/lib/i386/server
else you will get an error stating libverify.so not found
Another process
---------------
Before compiling PHP complete the following steps:
edit your /etc/ld.so.conf file by adding the following two lines:
/usr/local/j2sdk1.4.0_02/jre/lib/i386
/usr/local/j2sdk1.4.0_02/jre/lib/i386/server
To make this change effect, type the following at the command prompt:
ldconfig
Now "cd" into /usr/local/j2sdk1.4.0_02/jre/lib/i386 directory and enter the following command:
ldd libjava.so
The response that you get back shouldn't contain any "not found" error messages. If you get any then you can add the path for
the "not found" file to /etc/ld.so.conf and redo the above mentioned steps till you don't get any error messages.
Now you can compile PHP in the process mentioned above and follow the rest of the steps.


ing dot ldf

Reading the other post... i can run java with php.
OS: Win 2000p
PHPDev 4.2
Java j2sdk1.4.2_01
my php.ini file is set like this:
[Java]
java.class.path = "C:\php\php\extensions\php_java.jar; C:\j2sdk1.4.2\jre\lib;C:\j2sdk1.4.2;"
java.home = "C:\j2sdk1.4.2_01\bin"
java.library = "C:\j2sdk1.4.2_01\jre\bin\server\jvm.dll"
java.library.path = "C:\php\php\extensions"
I have a great doubt about this..... JVM runs fine the first time, then broke.... and send a message like this:
Fatal error: Unable to create Java Virtual Machine in localhost\pag1.php on line 37


jason

ON Linux / Apache --with-apxs
Page cannot be displayed - Apache crapping out.
I spent a great deal of time getting this to work - but hey - I'm a newbie.  
One thing I did find was that I experienced an error I have not seen on this board or anywhere else in searches.  
If you try to run a test java .php page and you get a page cannot be displayed error, try adding the follwing to your apache startup script
export LD_LIBRARY_PATH=/usr/lib/j2sdk1.3/jre/lib/i386/server
:/usr/lib/j2sdk1.3/jre/lib/i386
And of course change to paths that mean something to you.


raggha

Just wanted to make available the solution I found posted on
  http://bugs.php.net/bug.php?id=18600
to solve the typical "Fatal error: Unable to Create Java Virtual Machine" trouble for Win32 users (thanks buddy):
[12 Dec 2002 9:19am] Alberto.Sarini@libero.it
Hi there,
I'm confirming Cédric's knowledge - java is running correctly from within PHP on Apache only when PHP is running as a CGI and not as a SAPI module. When running PHP as Apache SAPI Module after the restart Apache only fist access to php page using java is running OK, all next reloads of this page caused "Fatal error: Unable to create Java Virtual Machine
in ..." I think this could be still not solved bug.
Thanks
Alberto
BTW I'm running on:
OS:Win2000 Server SP2
Apache:1.3.27
PHP Version 4.3.0-dev (Build Date  Dec 12 2002 10:14:28)
Java version=1.4.1_01
Java vendor=Sun Microsystems Inc.


christian

JDK1.4 RC is out, here are my Windows settings that make the Java extension work:
extension=php_java.dll
[Java]
java.class.path = c:\php\java\php_java.jar
java.home = d:\jdk1.4\jre
java.library = d:\jdk1.4\jre\bin\server\jvm.dll
I have not tested (yet) whether installing just the JRE works; for servlet support w/ Tomcat you do need JDK since Tomcat needs tools.jar that is not part of JRE.


venuti

Invoking java servlet from PHP.
This might look silly, but I found many people on the net asking how to invoke a java servlet from php. Read these notes:
http://archives.neohapsis.com/archives/php/2001-03/0040.html
(look for the message about servlets).
Basically, it's like calling any other URL, so you can use the "file" function. Read also the online documentation about "file".
This solution is much easier than many others I have found around the net.


aruntheking

Installing PHP 4.2.3 on Red Hat Linux7.2
with Java Support-Arunoday
-------------------------------
PHP as CGI module
------------------
1. Download PHP from www.php.net
2. Copy the file in the folder you want to have it installed like
/usr/local
3. Unpack the file using the following commands
gunzip php-4.2.3.tar.gz
tar xvf php-4.2.3.ta
This will create a directory php-4.2.3.
4. cd into the above mentioned directory and type
./configure --with-java=<java directory>
You can add more options with
configure.
For a full list of options type ./configure --help | more
 
5. If configure doesn't through any error then type make
6. To test make you can type make test
7. To complete the installation type make install
In all probability the actual binary that this will create
by the name php will be in
the /usr/local/bin directory.
This file should then be copied to your
cgi-bin directory[the webservers cgi-bin]
in my system i issued the following command
cd /usr/local/bin/php /var/www/cgi-bin/php.cgi
8. Modify the php.ini with the following lines

[java]
java.class.path=/usr/local/lib/php/php_java.jar
java.library.path=/usr/local/lib/php
/extensions/no-debug-non-zts-20020429
java.home=/usr/local/j2sdk1.4.0_02
java.library=java.so
extensions_dir=/usr/local/lib/php/extensions/no-debug-non-zts-20020429
extension=java.so
in all probability the php.ini file will be
in the php4.2.3/pear/tests directory
- u will need to copy it to the
/usr/local/lib directory and add the above lines
You will also need to cd into the directory specified in java.library.path
above and type the following
ln -s java.so libphp_java.so
This will make a symbolic link to java.so file through libphp_java.so.
A call to any of your PHP file will have to be like the following:
http://<yourhostname>/cgi-bin/php.cgi?<yourfilename>.php
PHP as Dynamic Shared Object
----------------------------
Retrieve PHP binary as mentioned above.
The configiration process will be different and will be as follows:
./configure --with-apxs=/usr/sbin/apxs
--with-java=/usr/local/j2sdk1.4.0_02 --with postgresql
postgresql is optional - u can leave it out if you donot want to use it.
apxs is required as it gives the directive to configure php as a dynamic shared object with Apache.
Advantage, it runs in the same memory space as Apache
and hence accessing of data is faster.
Apart from this there is no need to call the php interpreter (php.cgi) with every call to a PHP file.
Add the following lines in the php.ini file - it should be in /usr/local/lib
[Java]
java.class.path=/usr/local/lib/php/php_java.jar
:/usr/share/pgsql/jdbc7.1-1.2.jar:/var/www/html
java.home=/usr/local/j2sdk1.4.0_02
java.library=/usr/local/j2sdk1.4.0_02/jre/lib/i386/libjava.so
extension_dir=/usr/local/lib/php/extensions/no-debug-non-zts-20020429
extension=java.so
You will also need to cd into the directory specified in java.library.path
above and type the following
ln -s java.so libphp_java.so
This will make a symbolic link to java.so file through libphp_java.so.
Note: the jdbc7.1-1.2.jar file mentioned in java.class.path
is the JDBC part for Postgresql.


not_contactable

Installation of PHP's Java module under Win32(Apache/IIS).
I install php in "C:\php", firstly I install with "php-4.1.1-installer.exe"(from http://www.php.net/downloads.php), and then unzip the "php-4.1.1-Win32.zip"(from http://www.php.net/downloads.php) to the C:\PHP.(because all the extension dll files are from this zip file, including php_java.dll)
I also install my Java v1.3 in "C:\jdk1.3"
And My Program require JDBC connection of the Java Program, so I did install also the JDBC driver for MySQL in "c:\JDBC4mysql\mm.mysql.jdbc-1.2c"(from http://www.mysql.com/Downloads/Contrib/mm.mysql.jdbc-1.2c.tar.gz).
About the PHP.ini:
1> You need to set the extension_dir="c:\php\extensions"(directory of all the extensions dll files)
2> Add those lines at the end of php.ini
======
[Java]
extension=php_java.dll
java.class.path="c:\php\java\php_java.jar;c:\wwwroot; c:\JDBC4mysql\mm.mysql.jdbc-1.2c"
java.home="c:\jdk1.3\bin"
java.library="c:\jdk1.3\jre\bin\hotspot\jvm.dll"
java.library.path="c:\php\extensions"
======
* extension: it is the DLL you wish to load in, here we want to load the java module.
* java.class.path: By default, you need to include the "C:\php\java\php_java.jar" for Java & PHP connection, AND those directories that contain the Java class files you wish to run. Here, my program Java classes are in "c:\wwwroot\", and ALSO the JDBC driver classes in "c:\JDBC4mysql\mm.mysql.jdbc-1.2c", because my Program need to import it.
* java.home: the bin directory (directory of java.exe)
* java.library: jvm.dll is supposed to be under JDK's jre\bin\hotspot, but sometimes it doesn't, try to Find(Start->Find) jvm.dll where it is.
* java.library.path: which is the same as the extensions directory.


rabisultan

If you get this error
Fatal error: Unable to create Java Virtual Machine in
it can be fixed by modifying your php.ini file, you will need to add in the path to the JRE's lib folder.
My php.ini file (php4/Apache2):
java.class.path= "e:\minerva\php\extensions\php_java.jar; c:\j2sdk1.4.2_08\jre\lib; C:\j2sdk1.4.2_08"
java.home = "c:\j2sdk1.4.2_08\bin; c:\j2sdk1.4.2_08\jre\lib"
java.library = "c:\j2sdk1.4.2_08\jre\bin\server\jvm.dll"
java.library.path= "e:\minerva\PHP\extensions; c:\j2sdk1.4.2_08\jre\lib"


georgedaswani

I was able to compile java support in no problem and got it working sun jdk 1.4.2_03 (linux)
make sure JAVA_HOME is set
make sure LD_LIBRARY_PATH has
$JAVA_HOME/jre/lib/i386
on php.ini
[Java]
java.home = "/opt/j2sdk1.4.2_03"
java.class.path = "/opt/php/lib/php/php_java.jar:/opt/php/java-packages"
java.library.path = "/opt/php/lib/php/extensions/no-debug-zts-20020429"
extension_dir= "/opt/php/lib/php/extensions/no-debug-zts-20020429"
extension = java.so
It's import to note that APACHE 2 needs to be compiled using "PREFORK" instead of a thread based else the java stuff will work for a minute, then stop working with the following error
"PHP Fatal error:  Unable to create Java Virtual Machine"
Seems that the extension is not thread safe.


fernando

I managed to get it working with IBM Java SDK 1.3.0 but it was not easy. Here's my php.init:
[Java]
extension = libphp_java.so
java.library.path = /usr/local/lib/php/extensions/no-debug-non-zts-20010901
java.class.path = /usr/local/lib/php/php_java.jar
java.home = /opt/IBMJava2-13
java.library = /opt/IBMJava2-13/jre/bin/classic/libjvm.so
Besides, I had to edit the httpd init.d script to include the statement:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/IBMJava2-13/jre/bin:\
/opt/IBMJava2-13/jre/bin/classic
I guess java.library.path should serve for this, but it didn't worked.


meaton53

I just wanted to post this for people that were having the same troubles that I was having.  I am running OES SuSe Linux 9-1.  I started this adventure because I needed to connect to a progress database via PHP.  And I couldn't use ODBC drivers because the progress ODBC drivers were simply to old for unixODBC and iODBC (progress 9.1c).  So I had to use JDBC with this wonderful PHP extension along with the PHP-Java Bridge found at:
http://sourceforge.net/projects/php-java-bridge
So Just for some notes, in the PHP.INI file I had to have:
extension=java.so
[java]
java.java_home=/usr/local/java
java.classpath=.:/usr/progress/dlc91c/java/progress.jar
:/usr/progress/dlc91c/java/jdbc.jar
java.libpath=.:/usr/progress/dlc91c/lib
:/usr/local/lib/php/extensions
And be careful because lots of sites tell you that the two varibles above are java.class.path, and java.library.path.
And also to be able to connect to a progress database from java in Linux you have to set your LD_ASSUME_KERNEL varible to 2.4.0 to do this simply add to you profile.local file:
export LD_ASSUME_KERNEL=2.4.0.  
If you want to know why please email me and I will tell you.


ywliu

Hello,
There are two more useful links on phpbuilder.com in the PHP&JAVA discussion. They are related to the PHP and Java integration on Unix/Linux.
My settings (see above) is like that in the 1st link.
http://www.phpbuilder.com/annotate/message.php3?id=1009175
http://www.phpbuilder.com/annotate/message.php3?id=1008864
Moreover, I have the path to java in my PATH env. variable, so MAYBE its why my libjava.so works.  I couldn't find the origin of libjava.so, but now looks there are libjava.so and libjvm.so two options.
I built my php from the source package, and libphp_java.so does exist, at least on my RH6.2 with Apache 1.3.19 and Sun JDK 1.3.1.  libphp_java.so should be found under php-4.1.1/ext/java/.libs .
If you want to find some more discussion about PHP & Java integration, you may try  www.phpbuilder.com and look for php&java. It's a good place to start with.
Yen-Wei Liu


gturner

Hello!  I have two tips about getting PHP Java to work, hopefully google will pick this up...
After you've followed the instructions (building PHP with Java enabled and hacking php.ini) and you get a message like:
 Fatal error: Cannot instantiate non-existent class: java in (file) on line (line)
That means PHP doesn't know what the 'Java' function is.  You can confirm that the Java extension isn't loaded by looking at 'phpinfo' and verifying that there is no section titled Java.   To fix this you need to edit php.ini and set the 'extensions_dir' and an 'extension' appropriately.  On our system it was 'extension_dir = /opt/php/lib/php/extensions/no-debug-non-zts-20020429' and an 'extension = java.so'.  All the documentation I found said the extension library should be called 'php_java.so', but our build produced 'java.so', I have no idea why, YMMV.
The next error message I ran into was:
 Fatal error: java.lang.UnsatisfiedLinkError: no php_java in java.library.path in (file) on line (line)
Yay! this confirms that the JVM is indeed loading (UnsatisfiedLinkError is totally on the Java side), so relax, you're almost done!  What's happening is that the Java class 'net.php.reflect' (a class in php_java.jar that is built by PHP) is trying to execute 'System.loadLibrary("php_java")' and the JVM is unable to find the file named 'libphp_java.so' (or maybe 'php_java.dll' on Windows?).  If you ever heard of LD_LIBRARY_PATH, java.library.path is the same thing.  The solution has two parts: First making sure the php.ini has a 'java.library.path' (in the '[java]' section) that's pointed at the same directory that 'extension_dir', specifically the directory containing the file 'java.so' (or maybe 'php_java.so' like everyone else).  Second, this part is bad IMHO, making a symbolic link from the ''java.so' file to 'libphp_java.so' so that Java's System.loadLibrary method can find what it's looking for (apparently Java prefixes the filename it looks for with "lib").  To make this symbolic link do 'cd' into the extensions directory and run 'ln -s java.so libphp_java.so'.
Hope somebody finds this useful!


m mokhtar

Getting PHP JavaBridge to work with PHP5 on windows server:
====================================
1- Install Java J2EE 1.5 + JDK 1.4 (which includes application server/deploy tool/etc...)
2- download pecl-5.0.5-Win32.zip and php-java-bridge_2.0.8.zip, which will include
extra dll(s)
- unpack pecl pkg to your extensions folder, in PHP5 its ext.
- unpack java-Bridge to root php folder, in my case its simply C:\PHP
Note: the java-Bridge inculdes new versions of certain files like php_java.dll
so, it would be wise to rename your old files that came with PECL pkg for example
file_old, to rollback at anytime.
In order to deploy/test Java-Bridge .war onto your java application server follow these steps
http://cvs.sourceforge.net/viewcvs.py/php-java-bridge/php-java-bridge/
INSTALL.WINDOWS?view=markup
Note: move JavaBridge.jar to your extensions folder. and in test.php file that came
with Java-Brdige package change line java_require("test/arrayToString.jar");
to java_require("tests.php4/arrayToString.jar");
Add the following to your php.ini file and restart server:-
java.classpath = "location of JavaBridge.jar file...i.e. to your PHP extensions folder\
JavaBridge.jar,also any other extra java files that you'll be instanciating using your php script"
java.java_home = "location of jdk\bin"
java.libpath = "location of php_java.dll file...i.e. also to your PHP extensions folder"
happy integration
Cheers!!


mike

For win32 users: I spent some time wondering why the php session couln't find my classes/packages saved in my own custom classpath. even though the correct paths were specified in java.class.path. The reasons was as simple as double quotes. e.g.
java.class.path = c:\php\extensions\php_java.jar; c:\java\packages\  - incorrect, the packages & classes in c:\java\packages will not be found
java.class.path = "c:\php\extensions\php_java.jar;c:\java\packages\" - will find all your classes and packages in c:\java\packages
Thanks to PHP for another stunning feature.
Mike


11-mar-2006 06:33

For those who want to run php with a recent tomcat version, you'll need the following patch:
http://wiki.apache.org/tomcat/UsingPhp


tom

For those who have had the same problems with the php-Java Bridge,
here's a tutorial how to use the well supported soap extension to call Java methods:
http://rwatsh.blogspot.com/2007/03/
                      integrating-java-and-php-web-services.html
Since PHP5 soap extension is part of the PHP, so this is much easier to set up
than this php to java bridge, which crashed regularly.
Tom


pablo-at-godel.com.ar

For those using Redhat 7.x and Sun JDK, you have to set in LD_LIBRARY_PATH the directory where libjava.so .
In my case it looks like:
LD_LIBRARY_PATH=:/usr/local/j2sdk1.4.0_02/jre/lib/i386:\
/usr/local/j2sdk1.4.0_02/jre/lib/i386/server
This solved my problem with libjava.so not finding libverify.so
Hopes this helps to save some time for others.. I spent a lot of time before figuring this one out...


okapi

As mentioned prior, Zend is working to be the first of an official servlet / scripting integration. I've been testing their reference implementation that's available on the JSR 223 site and it's working pretty good. Some minor issues around the edges, but been working with one of their developers to fix it. So far, pretty good.

magnus_naeslund

An _very_ important thing here is to remember that the apache must be linked with pthreads (do "LDFLAGS=-lpthread ./configure <options>", or like me, add it the the .spec file).
You can check if your apache is pthreaded with "ldd $(which httpd)" if you like.
I experianced a lot of hangs/errors due to this problem, it's a shame that it's not in the docs / README (i didn't find it).
Magnus


alexg

According to an Article posted at:
http://www.zend.com/zend/week/week91.php#Heading7
there might be some problems with getting php and jdk-1.4 to work toghether.. I`ve tried (php-4.2.2 and jdk-4.1) with no success....


drgroove

@ smc+phpman
Zend/PHP is likely awaiting the finalization of JSR223, which seeks to allow scripting languages a much clearer form of communication to/from Java.
http://jcp.org/en/jsr/detail?id=223
This is a joint effort between Sun & Zend, among others. PHP will be the first language supported out of this JSR effort, others (such as Perl) will follow.
- DrGroove
Moderator, Devshed.com PHP forum


07-nov-2003 06:00


amtd

--php.ini-------------------------
[Java]
java.class.path = .\extensions\php_java.jar
java.home = c:\java
java.library = C:\java\jre\bin\server\jvm.dll
java.library.path = c:\apache\php\extensions
--system---------------------------
Windows 2000 P + Apache + SUN jdk 1.4.0-beta3
--app path---------------------------
java(C:\java)
Apache(C:\apache)
PHP(C:\apache\php)
-----------------------------
success!


joey

***  Win32 Users & Using Command-line Interface ***
First of all, this is AWESOME!!!!  I think PHP just took a huge leap forward with this capability!
Here is what you need:
In the Php.in file:
;Windows Extensions
extension=php_java.dll
[Java]
java.class.path = "C:\php\java\php_java.jar"
java.home = "C:\J2SDK_Forte\jdk1.4.0\jre"
java.library = "C:\J2SDK_Forte\jdk1.4.0\jre\bin\client\jvm.dll"
java.library.path = "C:\php\extensions"
**** Don't forget the double-quotes in the values ! ****
Next, add the file type association for Windows 2000.
1) open Windows Explorer
2) Click the Tool Menu Item
3) Select "Folder Options"
4) Select "File Types" tab
5) Select "New"
6) Type in your file extension for php scripts, I suggest ".phx" without the double-quotes
7) Click "Ok"
8) Find that extension in the "File Types" list again.  You may have to back out and come back in to find it.  
9) Once you found that newly added php extension, select the "Advanced" button.  You can change the Icon here, but what you want to do is click the "New" button next to the "Actions" area.
10) For the "Action" value enter the value "open" without the quotes.
11) For the "Action used to perform this action:" value enter the value "C:\php\php-cli.exe -c C:\WINNT %1" without the quotes.
Lastly, add c:\php to you PATH Environment variable on your computer.
That should do it.  You can test it by creating a test.phx file and open a cmd (DOS) window and cd into that directory(eg. c:\junk) and just execute your test file like this: c:\junk test.phx
This should return you your results as expected.  If you don't know much about the php-cli.exe (cli = Command-Line Interface) go here http://www.php.net/manual/en/features.commandline.php.
I used the person's example at the top of this page and it worked.  
Now, if I can just figure out how to call my own custom classes that have their own packages.


neil

** Success with W2K Server, PHP 4.3.0 as IIS5 SAPI module and J2SDK1.4.1_01 **
After a bunch of annoyingly spurious "access violation" and "Unable to create Java Virtual Machine" errors
I changed the php.ini setting for java.library from:
"C:\j2sdk1.4.1_01\jre\bin\client\jvm.dll"
to:
"C:\j2sdk1.4.1_01\jre\bin\server\jvm.dll"
All above examples now work perfectly incuding my own classes and those at
http://www.onlamp.com/pub/a/php/2001/06/14/php_jav.html (thanks to emilebosch above on 18-Oct-2001 07:19).

I'd really like to know the difference between 'client' and 'server' JVM versions if anyone can illuminate us.
Notes:
1. Manual install of PHP 4.3.0 to C:\php with the following relevant extracts from php.ini:
extension=php_java.dll
[Java]
java.class.path = "C:\php\extensions\php_java.jar;C:\java\packages\"
java.home = "C:\j2sdk1.4.1_01\bin"
java.library = "C:\j2sdk1.4.1_01\jre\bin\server\jvm.dll"
java.library.path = "C:\php\extensions"
2. Default installation of latest Java SDK from Sun
3. Win2K Server SP2 with all(?) patches
4. My own classes are placed in C:\java\packages\
Hope this helps some people.
Regards
-Neil


08-may-2005 10:04

<quote> JVM runs fine the first time, then broke....  </quote>
The php4 java extension is simply broken, don't use it.  I am
using the "PHP Java Bridge" for PHP5 with great success on WinNT:
http://php-java-bridge.sourceforge.net


Change Language


Follow Navioo On Twitter
.NET Functions
Apache-specific Functions
Alternative PHP Cache
Advanced PHP debugger
Array Functions
Aspell functions [deprecated]
BBCode Functions
BCMath Arbitrary Precision Mathematics Functions
PHP bytecode Compiler
Bzip2 Compression Functions
Calendar Functions
CCVS API Functions [deprecated]
Class/Object Functions
Classkit Functions
ClibPDF Functions [deprecated]
COM and .Net (Windows)
Crack Functions
Character Type Functions
CURL
Cybercash Payment Functions
Credit Mutuel CyberMUT functions
Cyrus IMAP administration Functions
Date and Time Functions
DB++ Functions
Database (dbm-style) Abstraction Layer Functions
dBase Functions
DBM Functions [deprecated]
dbx Functions
Direct IO Functions
Directory Functions
DOM Functions
DOM XML Functions
enchant Functions
Error Handling and Logging Functions
Exif Functions
Expect Functions
File Alteration Monitor Functions
Forms Data Format Functions
Fileinfo Functions
filePro Functions
Filesystem Functions
Filter Functions
Firebird/InterBase Functions
Firebird/Interbase Functions (PDO_FIREBIRD)
FriBiDi Functions
FrontBase Functions
FTP Functions
Function Handling Functions
GeoIP Functions
Gettext Functions
GMP Functions
gnupg Functions
Net_Gopher
Haru PDF Functions
hash Functions
HTTP
Hyperwave Functions
Hyperwave API Functions
i18n Functions
IBM Functions (PDO_IBM)
IBM DB2
iconv Functions
ID3 Functions
IIS Administration Functions
Image Functions
Imagick Image Library
IMAP
Informix Functions
Informix Functions (PDO_INFORMIX)
Ingres II Functions
IRC Gateway Functions
PHP / Java Integration
JSON Functions
KADM5
LDAP Functions
libxml Functions
Lotus Notes Functions
LZF Functions
Mail Functions
Mailparse Functions
Mathematical Functions
MaxDB PHP Extension
MCAL Functions
Mcrypt Encryption Functions
MCVE (Monetra) Payment Functions
Memcache Functions
Mhash Functions
Mimetype Functions
Ming functions for Flash
Miscellaneous Functions
mnoGoSearch Functions
Microsoft SQL Server Functions
Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
Mohawk Software Session Handler Functions
mSQL Functions
Multibyte String Functions
muscat Functions
MySQL Functions
MySQL Functions (PDO_MYSQL)
MySQL Improved Extension
Ncurses Terminal Screen Control Functions
Network Functions
Newt Functions
NSAPI-specific Functions
Object Aggregation/Composition Functions
Object property and method call overloading
Oracle Functions
ODBC Functions (Unified)
ODBC and DB2 Functions (PDO_ODBC)
oggvorbis
OpenAL Audio Bindings
OpenSSL Functions
Oracle Functions [deprecated]
Oracle Functions (PDO_OCI)
Output Control Functions
Ovrimos SQL Functions
Paradox File Access
Parsekit Functions
Process Control Functions
Regular Expression Functions (Perl-Compatible)
PDF Functions
PDO Functions
Phar archive stream and classes
PHP Options&Information
POSIX Functions
Regular Expression Functions (POSIX Extended)
PostgreSQL Functions
PostgreSQL Functions (PDO_PGSQL)
Printer Functions
Program Execution Functions
PostScript document creation
Pspell Functions
qtdom Functions
Radius
Rar Functions
GNU Readline
GNU Recode Functions
RPM Header Reading Functions
runkit Functions
SAM - Simple Asynchronous Messaging
Satellite CORBA client extension [deprecated]
SCA Functions
SDO Functions
SDO XML Data Access Service Functions
SDO Relational Data Access Service Functions
Semaphore
SESAM Database Functions
PostgreSQL Session Save Handler
Session Handling Functions
Shared Memory Functions
SimpleXML functions
SNMP Functions
SOAP Functions
Socket Functions
Standard PHP Library (SPL) Functions
SQLite Functions
SQLite Functions (PDO_SQLITE)
Secure Shell2 Functions
Statistics Functions
Stream Functions
String Functions
Subversion Functions
Shockwave Flash Functions
Swish Functions
Sybase Functions
TCP Wrappers Functions
Tidy Functions
Tokenizer Functions
Unicode Functions
URL Functions
Variable Handling Functions
Verisign Payflow Pro Functions
vpopmail Functions
W32api Functions
WDDX Functions
win32ps Functions
win32service Functions
xattr Functions
xdiff Functions
XML Parser Functions
XML-RPC Functions
XMLReader functions
XMLWriter Functions
XSL functions
XSLT Functions
YAZ Functions
YP/NIS Functions
Zip File Functions
Zlib Compression Functions
eXTReMe Tracker