[gdal-dev] Re: PHP bindings

Even Rouault even.rouault at mines-paris.org
Tue Mar 1 13:59:48 EST 2011


Mike,

> Hello again,
> 
> I think I stumbled upon the part that was tripping up the methods I was
> using with the php_osr.so library.  Posted at http://pastebin.com/SXKKfe6v
> is a patch that should work on both 1.8.0, and the trunk svn.  It adds the
> missing CSL typemap, and corrects the OGRErr related typemaps to ensure
> that it only returns results for non-zero error responses.
> 

I'm not sure if/when someone will act on this, but you should perhaps open a 
GDAL Trac ticket and attach your patch there so it is kept in a safer place 
than a pastebin that will be lost in a few days/weeks.

> The patch also includes changes to the GNUmakefile in the swig/php folder
> to make sure that the gdal libs are linked, and that all of the php
> modules are compiles instead of just php_gdal.so (not sure if this is
> fully necessary, but I was having trouble with linking before).
> 
> In addition to this, I had to substitute all instances of
> 'zend_error_noreturn' that swig inserts into the *_wrap.cpp files with
> 'zend_error'...I don't know if this is just specific to my environment, but
> the best I could determine from searching online is that more recent
> versions of PHP no longer define zend_error_noreturn, yet swig still uses
> it.  It seems that zend_error is a sufficient substitute (without this, I
> would find that when the module raised errors, it would cause a segfault
> instead of actually producing a descriptive error in Apache/PHP).

Perhaps something to share with the swig mailing list ?

> 
> If this patch is applied and gdal is configured/compiled with the
> '--with-php' option, then when swig/php/php_osr.so is installed and loaded
> into the PHP environment, the following PHP script will work as expected:
> 
> <?php
> include("/path/to/gdal/swig/php/osr.php");
> $sr = new SpatialReference();
> $sr->ImportFromProj4('+init=epsg:4326');
> echo $sr->ExportToProj4();
> ?>
> 
> This is about as far as I can get for now - looking through typemaps_php.i,
> I think I see plenty of stuff that still needs fixing/updating.  There are
> also function name conflicts if I try to load php_gdal.so and/or
> php_ogr.so.  I think that's out of my league, however.  Hopefully this is
> enough to peak the interest of someone who has a little more familarity
> with c/swig/php, and we could get a more fully-supported set of PHP
> bindings.
> 
> Best regards,
> Mike
> 
> On Thursday, February 24, 2011 19:45:16 Mike Leahy wrote:
> > Hello all,
> > 
> > To keep this topic somewhat alive, I might note that I can identify that
> > at the very least, php_osr.so works in some ways, but not how I would
> > expect compared with the same bindings in other languages.
> > 
> > I also found that at least one typemap was needed in typemaps_php.i:
> > 
> > /* Almost same as %typemap(out) char **options */
> > /* but we CSLDestroy the char** pointer at the end */
> > %typemap(out) char **CSL
> > {
> > 
> >   /* %typemap(out) char ** -> ( string ) */
> >   char **stringarray = $1;
> >   if ( stringarray == NULL ) {
> >   
> >     RETVAL_NULL();
> >   
> >   }
> >   else {
> >   
> >     int len = CSLCount( stringarray );
> >     array_init($result);
> >     for ( int i = 0; i < len; ++i, ++stringarray ) {
> >     
> >       add_next_index_string( $result, *stringarray, 1 );
> >     
> >     }
> >   
> >   }
> >   CSLDestroy($1);
> > 
> > }
> > 
> > This seems to have removed the warnings about that being missing when I
> > compile the osr library (I'm continuing to focus just on this binding as
> > a simple case).
> > 
> > In terms of actually using php_osr.so, I can successfully import a proj4
> > string, and export that to WKT using the '__str__' method:
> > 
> > <?php
> > $sr = new_SpatialReference();
> > SpatialReference_ImportFromProj4($sr,'+init=epsg:4326');
> > echo SpatialReference___str__($sr);
> > ?>
> > 
> > I would expect that the last line would be equivalent to
> > "SpatialReference_ExportToWkt($sr);", but that isn't the case...I'm still
> > getting zero, which I think stems from the fact that the data type for
> > the ExportToWkt (and similar functions) in osr.i is of the type
> > 'OGRErr', and this is what is getting returned in PHP instead of the
> > desired wkt output.
> > 
> > I'm guessing that there's a difference in how swig interprets these
> > functions when compiling in PHP versus the other languages.  In osr.i, I
> > added an extra declaration that mimics how the __str__ function works,
> > but returns proj4 strings.  It looks like this:
> > 
> > %newobject ExportToProj4Test;
> > 
> >   char *ExportToProj4Test() {
> >   
> >     char *buf = 0;
> >     OSRExportToProj4( self, &buf );
> >     return buf;
> >   
> >   }
> > 
> > After compiling that, the following code will successfully return a Proj4
> > string:
> > 
> > <?php
> > $sr = new_SpatialReference();
> > SpatialReference_ImportFromProj4($sr,'+init=epsg:4326');
> > echo SpatialReference_ExportToProj4Test($sr);
> > ?>
> > 
> > So...with this in mind, does this suggest that PHP will essentially need
> > an entirely rewritten list of functions?  I would hope that there's a
> > more effective way to go about it this, and that I'm just looking at
> > this with my relatively novice perspective.
> > 
> > Best regards,
> > Mike


More information about the gdal-dev mailing list