1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
|
What is PHP4 ext/java?
PHP4 ext/java 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.
Two examples are provided, jver and jawt, to illustrate usage of this
extension. A few things to note:
1) 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.
2) 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";
3) 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.
4) 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:
java_last_exception_get()
java_last_exception_clear()
5) 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 cooerced if necessary,
possibly with a loss of data (example: double precision floating point
numbers will be converted to boolean).
6) 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.
Build and execution instructions:
Given the number of platforms and providers of JVMs, no single set of
instructions will be able to cover all cases. So in place of hard and
fast instructions, below are a working examples for a number of free and
commercial implementations and platforms. Please adjust the paths to
suit your installation. Also, if you happen to get this to work on
another JVM/platform combination, please let me know, particularly if
a unique build or execution setup was required.
Note for Windows users: semi-colons (";") mark the beginning of
comments in php.ini files, so if you wish to add to the classpath,
make sure that the entire string is in quotes. See the JDK 1.1.8
instructions below for an example.
This function has been tested in both CGI and Apache (apxs) modes. As
the current design requires shared libraries, this support can not be
linked statically into Apache.
With ext/java, no Java Virtual Machines are created until the first
Java call is made. This not only eliminates unnecessary overhead if
the extension is never used, it also provides error messages directly
back to the user instead of being burried in a log some place.
For people interested in robustness, performance, and more complete
integration with Java, consider using the sapi/servlet interface which
is built upon the Java extension. Running PHP as a servlet enables PHP
to utilize the existing JVM and threads from the servlet engine, and
provides direct access to the servlet request and response objects.
Finally, the bottom of this readme contains some guidance for how to
approach situations in which these instructions don't work on your
machine.
========================================================================
=== JVM=Kaffe 1.0.4 (as delivered with OS), OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.library.path=/usr/lib/kaffe:/home/rubys/php4/modules
java.class.path=/usr/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Kaffe 1.0.5 (built from source), OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.library.path=/usr/local/lib/kaffe:/home/rubys/php4/modules
java.class.path=/usr/local/share/kaffe/Klasses.jar:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=IBM 1.1.8, OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/jdk118/lib/classes.zip:/home/rubys/php4/modules/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Blackdown 1.2.2 RC4, OS=Redhat Linux 6.1 ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/rubys/php4/lib/php_java.jar
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Sun JDK 1.2.2, OS=Linux ===
========================================================================
build instructions:
./configure --with-java
php.ini:
[java]
java.class.path=/home/rubys/php4/lib/php_java.jar
java.library.path=/home/rubys/php4/modules
extension_dir=/home/rubys/php4/modules
extension=java.so
========================================================================
=== JVM=Sun JDK 1.1.8, OS=Windows NT 4 ===
========================================================================
build instructions:
SET JAVA_HOME=D:\jdk1.1.8
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
php.ini:
[java]
java.class.path="D:\jdk1.1.8\lib\classes.zip;F:\PHP4\Debug_TS\php_java.jar"
extension=php_java.dll
========================================================================
=== JVM=Sun JDK 1.2.2, OS=Windows NT 4 ===
========================================================================
build instructions:
SET JAVA_HOME=D:\jdk1.2.2
msdev ext\java\java.dsp /MAKE "java - Win32 Debug_TS"
php.ini:
[java]
java.class.path=F:\PHP4\Debug_TS\php_java.jar
extension=php_java.dll
=========================================================================
Guidance for when these instructions don't work.
JDK vendors don't typically document their internal workings, and are
typically very reliant on code inside of the JAVA main program and the
installation directory structure. For this reason, running PHP as a
servlet is typically much easier to get working. But if for some reason
this is not appropriate for you, and the instructions above don't work,
then read on.
The first thing to realize is that the directory structure of the JDK is
very important. Some users (particularly on Windows) get a message about
a DLL or shared library not being available and proceed to find that file
and copy it into a system directory. This typically just gets you to the
next problem - for example, it appears that many JDKs attempt to locate
the runtime Java classes (rt.jar) in a directory relative to these system
libraries. So unless you are inclined to copy your entire Java
installation, you are much better adjusting your PATHs.
Not documented above, but useful for many JDK's is ability to specify the
library path via java.library.path in the php.ini. On many Unix machines,
determining the initial value for this can be done by changing directory
to where you find a shared library that can't be loaded (example:
libjava.so), and executing "ld libjava.so". If you see some modules
listed as "not found", add the necessary directories to LD_LIBRARY_PATH
and repeat until successful. On my system, I require the following
two directories.
/home/jdk1.2.2/jre/lib/i386/native_threads
/home/jdk1.2.2/jre/lib/i386/classic
Note: this only determines the statically loaded libraries. Additional
libraries (such as libzip.so) may be loaded dynamically. On my system,
libzip.so is located in
/home/jdk1.2.2/jre/lib/i386
Another php.ini variable which may be helpful is java.home.
If java.library.path doesn't work for you (it won't on any JDK 1.1
implementations, for example), then try setting the system PATH or the
LD_LIBRARY_PATH before starting your web server. For Apache on Linux
systems, this can be accomplished by editing the Root's .bashrc and
adding the necessary export LD_LIBRARY_PATH statement.
If that doesn't work, try dividing an (hopefully) conquering by temporarily
eliminating items such as Apache from the process by adjusting the
arguments passed to the ./configure command (i.e., removing --with-apxs).
If all else fails, "man dlopen" on Unix systems will give more insight on
what the system is trying to do internally.
There have been some issues where users need to create a symbolic link
from java.so to libphp_java.so. If you notice a large number of unexplained
crashes in your webserver log file, try doing this.
|