PHP Extension for C++ SCA README ================================ Overview -------- The PHP extension for C++ SCA allows PHP scripts to be used to implement SCA components. This is achieved by using the C++ SCA extension API to drive script execution through the PHP embedding SAPI. In its current incarnation the PHP Extension requires that a full SCDL description is provided for each PHP component, i.e. we are not yet making use of the meta data provided by the annotations that can appear in PHP SCA components. There are various styles of PHP script that are supported. The examples here are taken from the PHPCalculator sample and if you look at the SCDL files provided with the sample you can see the component type and composite files that tie these components into the working system SCA Service ----------- /** * @service * @binding.ws */ class Divide { /** * @reference * @binding.tuscany cppDivideService */ public $another_divide; /** * Division * * @param float $num1 (the first number) * @param float $num2 (the second number) * @return float The result */ function div($num1, $num2) { return $this->another_divide->div($num1, $num2); } } PHP Class --------- class Multiply { function mul($num1, $num2) { $result = $num1 * $num2; $log_proxy = SCA::getService("log_service"); $log_proxy->log_message($result); return $result; } } PHP Function ------------ function sub($num1, $num2){ $result = $num1 - $num2; $log_proxy = SCA::getService("log_service"); $log_proxy->log_message($result); return $result; } PHP Script ---------- $num1 = $_REQUEST[0]; $num2 = $_REQUEST[1]; $result = $num1 + $num2; $log_proxy = SCA::getService("log_service"); $log_proxy->log_message($result); echo $result; TODO ---- * I struggled for a long time with a missing symbol problem loading sdo.so at runtime on linux. I got round this by creating a standalone Makefile for the CalculatorClient exe. All the shared objects that are loaded are compiled with the normal automake toolchain still but this solves the problem. I need to investigate in detail what's going on here. Having someone else try building with the full automake configuration would be insteresting * The problem from above does appear when running SCA behind axis hence I am unable to test with remote clients * The SCA_SDO build generates sdo.so and the Tuscany PHP Extension tries to load libsdo.so. One side needs fixing. For now I just copy the library * SDO passing in and out of components is coded but not tested * Returning values from plain PHP scripts (scripts without classes and functions) is not operating correctly * Error handling needs looking at. Many situations are not trapped and those that are may not be reported correctly * Reorganize the extension code so that Tuscany SCA can be loaded by PHP running in Apache and accessed through SCA references. This will play the same role as SCA running hosted in Axis2C and will open up the service bindings implemented in PHP SCA_SDO. * Implement meta data exchange between the PHP SCA implementation and the Tuscany C++ SCA implementations so that selected parts of the SCDL definition can be omitted. * There is a threading issue with the way that we are firing up the PHP embedding SAPI TSRM should solve it fails on the embedding initialization for some reason. Dependencies ------------ PHP5.2.0 source code - - (http://php.net/) The binary release of PHP doesn't ship with the header files required to build against the PHP embedding SAPI and runtime libraries. So go get the PHP source code and build PHP. PHP will need to be configured correctly in order to work properly when embedded in C++ SCA. Here are some sample configuration statements but they will need to be tailored for you specific environment: Winodws ------- cscript configure.js --with-extra-includes=win32build\include; libxml2-2.6.26.threads\include; iconv-1.9.1.win32\include; libcurl-7.15.4-nossl\include --with-extra-libs=win32build\lib; libxml2-2.6.26.threads\lib; iconv-1.9.1.win32\lib; libcurl-7.15.4-nossl\lib --enable-debug --enable-soap --enable-apache2handler=shared --enable-embed --with-curl=C:\simon\apps\libcurl-7.15.4-nossl Note. This configure line is artificially broken across sever lines to aid readability here. You will need to join it all back together on one line to run it. Linux ----- ./configure --enable-debug \ --enable-soap \ --enable-fastcgi \ --with-zlib \ --enable-embed \ --with-tsrm-pthreads \ --enable-maintainer-zts Note. debug, pthreads, maintainer-zts, fastcgi are not absolute requirements but just represent the environment I was testing with when I wrote this. SCA_SDO PECL extension AVOCET branch source code - (http://pecl.php.net/package/SCA_SDO) Provides the SCA framework for PHP and the necessary mediation code to translate between Tuscany SCA and PHP SCA. Go get the AVOCET branch from PECL cvs export CVSROOT=:pserver:cvsread@cvs.php.net/repository cvs export -r AVOCET pecl/sdo The process to build this code varies quite considerably between windows and Linux. Take a look at the instructions in the SCA_SDO manual, follow the documentation link from the projects PECL page (http://uk2.php.net/sdo/). Once built you will need to copy the library sdo.so to libsdo.so so that the Tuscany PHPExtension can load it given the makefile configuration as it stands. For example, on linux ln -s sdo.so libsdo.so Building on windows ------------------- The Visual C++ Express solution provided with C++ SCA includes a project to build the PHP extension. This project relies on being able to access the PHP include files from the source code directory and the PHP lib files from the binary install. Make sure your environment is set as follows before you start Visual C++ Express (if you do this after you start Visual C++ Express it will not pick up the changes) PHP_HOME = the root directory of the PHP 5.2.0 source code install PATH = ensure that the root directory of the PHP 5.2.0 binary install appears PHP_SCA_SDO_HOME = the directory in which the SCA_SDO pecl extension source is installed These changes come over and above the environment changes you need to make to build the core C++ SCA software. I have the following set in my environment but of course the details depend on where you have the various bits of software installed. AXIS2C_HOME=c:\axis2c-bin-0.96-win32 LIBXML2_HOME=c:\libxml2-2.6.26.ein32 ICONV_HOME=c:\iconv-1.9.2.win32 ZLIB_HOME=c:\zlib-1.2.3.win32 TUSCANY_SCACPP=c:\sca\deploy TUSCANY_SDOCPP=c:\sdo\deploy Now compile the PHP extension. Compiling with VC++ Express requires some care 1/ Ensure that the PHP include files are configured correctly for compiling against C++ SCA in Visual C++ express See - http://bugs.php.net/bug.php?id=39130 Comment out two lines in $(PHP_HOME)/main/config.w32.h: #define _USE_32BIT_TIME_T 1 #define HAVE_STDLIB_H 1 Building on Linux ----------------- The PHP extension comes with a set of automake files so that the PHP extension is built at the same time as all of the other extensions assuming that appropriate environment variables are set. The build.sh script that can be found under the top level sca directory checks whether the PHP_LIB and PHP_INCLUDE variables are set and if so enables compilation of the PHP extension automatically by adding --enable-php to the configure line. There are a number of environment variables that the build depends on. I find setting the following variables useful. # the location of libxm2 export LIBXML2_LIB=/usr/lib export LIBXML2_INCLUDE=/usr/include/libxml2 # the location of PHP export PHP_LIB=/usr/local/lib export PHP_INCLUDE=/usr/local/include/php # the location of the PHP SCA_SDO extension source # the lib location depends oh the configuration options used # when building PHP so beware export PHP_SCA_SDO_INCLUDE=where ever you install the SCA_SDO package source export PHP_SCA_SDO_LIB=$PHP_LIB/php/extensions/no-debug-zts-20060613/ # the location of axis2 export AXIS2C_HOME=/usr/local/axis2c-bin-0.96-linux # the install directories for the tuscany sca and sdo projects export TUSCANY_SDOCPP=/usr/local/tuscany/cpp/sdo/deploy export TUSCANY_SCACPP=/usr/local/tuscany/cpp/sca/deploy Once these are set running sca/build.sh should compile and install the PHP extension. Testing the PHP Extension ------------------------- In order to run the PHP extension successfully as an embedded component of the C++ SCA runtime the PHP environment must be configured correctly. This configuration is provided by the php.ini file. The location of this file depends on your installation of PHP but by default is as follows. /usr/local/bin - PHP executables /usr/local/lib/php.ini - the ini file that tell PHP where to look for scripts and extension libraries /usr/local/lib/php - PHP runtime installation, extension files and tests As is usually the case your milage may vary but wherever PHP is installed you will find a similar set of directories. To force PHP to look in the correct place use the following setting # tell PHP specifically where to find php.ini rather than relying on the default set PHPRC=/usr/local/lib The php.ini file must be configured to load the SCA_SDO extension so you would expect to see the following modifications to the file. ; around line 528 you need to set the variable that tells PHP where to ; load extension libraries from. This varies depending on how PHP has been ; compiled and installed, for example, extension_dir = "/usr/local/lib/php/extensions/no-debug-zts-20060613/" ; around line 512 you need to set the variable that tells PHP where to ; load included scripts from. There are windows and unix versions. Here ; is a Unix example include_path=".:/usr/local/lib/php:/usr/local/lib/php/PEAR:/usr/local/tuscany/cppsca/samples/PHPCalculator/deploy/sample.calculator" ; around line 673 you will find the end of the list of enabled extensions. We need to turn ; on SDO so add the following line. sdo.so should be found in "extension_dir". extension=sdo.so