summaryrefslogtreecommitdiffstats
path: root/cpp/sca/runtime/extensions/php/README
blob: ad96622516c26d8701914bdd216b16a9f68f0660 (plain)
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
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
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