Quercus: Java and PHP integration
Resin 3.1

Documentation
Examples
Changes

Quercus
Database
Amber
EJB
SOA/ESB
IoC
JMS
Servlet
JMX
Hessian
Security

Hello World
Java Modules
JSON
PDO
Gettext
Hello World
Quercus
JSON

Adding PHP functions with a Java module.

Demo

Files in this tutorial

hello.phpThe PHP Hello, World
WEB-INF/classes/example/HelloModule.javaThe Java module definition
WEB-INF/resin-web.xmlweb.xml configuration
WEB-INF/classes/META-INF/services/com.caucho.quercus.QuercusModuleAdding the module

Introduction

This article shows how to use Quercus, Resin's PHP implementation, to create a module in Java callable from a PHP page.

For purposes of this article, I assume that you are working with Resin 3.0.17 and that the directory housing httpd.exe is /var/www/webapps/ROOT. I will call this directory $webApp.

Step 1: Create resin-web.xml and place it in $webApp/WEB-INF

resin-web.xml
<web-app xmlns="http://caucho.com/ns/resin">
   <servlet servlet-name="resin-php"
               servlet-class="com.caucho.quercus.servlet.QuercusServlet"/>
 
   <servlet-mapping url-pattern="*.php" servlet-name="resin-php"/>	   
</web-app>

Step 2: Create HelloModule.java and place it in $webApp/WEB-INF/classes/example

HelloModule.java
package example;
 
import com.caucho.quercus.module.AbstractQuercusModule;
 
public class HelloModule extends AbstractQuercusModule {
   /*
   ** Notice the careful use of the naming
   ** convention hello_test.  This is done
   ** in order to prevent name collisions
   ** among different libraries.
   */
   public String hello_test(String name)
   {
     return "Hello, " + name;
   }
}

Step 3: Create com.caucho.quercus.QuercusModule and place it in $webApp/WEB-INF/classes/META-INF/services

com.caucho.quercus.QuercusModule
example.HelloModule

Step 4: Create hello.php and place it in webapps/ROOT

hello.php
<?php echo hello_test("World") ?>

In your favorite browser, type:

 http://localhost:8080/hello.php

You should see:

 Hello, World

Advanced Users

The first argument of a Java function may be the Env. The Env provides access to Quercus resources like printing to the browser and retrieving a PHP ini value. For the API of Env, refer to the Quercus javadoc.


package example;

import com.caucho.quercus.env.Env;
import com.caucho.quercus.module.AbstractQuercusModule;
 
public class HelloModule extends AbstractQuercusModule {
   /*
   ** Notice the careful use of the naming
   ** convention hello_test.  This is done
   ** in order to prevent name collisions
   ** among different libraries.
   **
   ** @param env provides access to Quercus environment resources
   ** @param name
   */
   public String hello_test(Env env, String name)
   {
     env.println("inside HelloModule  hello_test()");
     return "Hello, " + name;
   }
}

Now hello_test will print "inside HelloModule hello_test()" to the browser before returning.

Java Function Arguments/Return Marshaling

Quercus does marshaling to and from Quercus Values and Java objects. If a Java function requires a String, Quercus will automatically convert the internal Quercus StringValue to a String. If a Java function returns an int, Quercus will create a Quercus LongValue for it.

For other Java Objects like java.util.Date that are returned to PHP, Quercus puts them into wrappers to expose their public methods and members to the PHP script. Java Collection, List, and Map instances have the additional ability to be used within a PHP script like any other PHP array.

For more information, see Java Interface.

Conclusion

It is fairly straight forward to create your own modules callable from within a Quercus/PHP page. The above tutorial takes through the steps to create the simple hello world application (without needing to "jar-up" your files).

If you want to change your module in any way, all you have to do is resave the ".java" file in the classes\example directory, and Resin will recompile it for you.

You do not need to restart your web app or Resin. It's just that simple.

Demo


Hello World
Quercus
JSON
Copyright © 1998-2006 Caucho Technology, Inc. All rights reserved.
Resin ® is a registered trademark, and Quercustm, Ambertm, and Hessiantm are trademarks of Caucho Technology.