MS RFC 117:通过swig支持php 7 mapscript¶
- 作者
Jeff McKenna
- 联系方式
- 最后更新
2017-02-02
- 版本
MAPServer 7.2
- 状态
草稿
1。动机¶
2015年12月发布的php 7.0.0是后端结构的重大变化,并导致了mapserver的php mapscript扩展的完整版本中断。打包程序、站点管理员、开发人员和服务提供商都在焦急地等待着支持php 7 mapscript的mapserver的发布。
php 7包含一个全新的Zend引擎(称为“phpng”,或php下一代),旨在加速php应用程序;php 7比php 5.6有很多改进,包括:
性能(自夸“比php 5.6快两倍”)
显著减少内存使用
一致的64位支持
许多致命错误已转换为异常
新组合比较(宇宙飞船)运算符<=>
新的空合并运算符??
匿名类别
更多信息,请参见 PHP 7 Migration Guide

资料来源:digitalOcean.com¶
MAPServer的几个MaScript(Java、Python、CpHARP)使用 SWIG 库(用于将代码转换为其他语言的包装库)自动生成必要的mapscript代码;但是现有的php mapscript扩展不使用swig,而是在当时自定义编写的。MapServer的项目指导委员会(PSC)也讨论了利用Swig来长期支持php-mapscript的可能性。
Swig团队最近在他们的开发沙盒中添加了对php 7的支持,它通过了Swig的所有测试套件,并得到了社区的好评。
2。建议的增强¶
从mapserver中删除php的自定义扩展代码,并通过将最新的swig开发版本与mapserver的包装“mapscript.i”一起使用,启用swig来生成php mapscript扩展。Swig将自动生成一个包含MapServer的大部分常量、对象和方法的PHP扩展。与mapserver的其他基于swig的语言类似,任何自定义的php类或函数都将在新文件`/mapscript/php/phpextend.i中定义。`
2.2向后兼容性¶
此更改将自动支持php 5和7系列。在某种程度上,Swig团队将删除对php 5的支持(他们现在正在讨论这个问题),但它可能与 PHP 5.6 Security Support timeline (至2018年12月31日)。
在短期内处理任何可能的兼容性问题:
所有swig-php代码都将位于其自己的目录中:/mapscript/phpng/
模块将被命名 phpng_mapscript.so 或**phpng_mapscript.dl**
2.3性能影响¶
如上所述,这将大大提高性能。
2.4个局限性¶
依赖稳定版本的打包程序/包在官方的swig版本包含php 7之前不太可能包含swig dev。
更新:2016-12-29最新的官方swig-3.0.11版本现在包含了php 7支持(请参见 announcement )
在通过swig dev编译php mapscript扩展期间,对于几个mapserver对象,swig会自动将php为函数“empty()”和“clone()”保留的关键字重命名为“c_empty()”和“c_clone()”,如下所示:
..\..\mapserver.h(920) : Warning 314: 'empty' is a PHP keyword, renaming to 'c_empty' ..\swiginc\map.i(64) : Warning 314: 'clone' is a PHP keyword, renaming to 'c_clone' ..\swiginc\layer.i(128) : Warning 314: 'clone' is a PHP keyword, renaming to 'c_clone' ..\swiginc\class.i(122) : Warning 314: 'clone' is a PHP keyword, renaming to 'c_clone' ..\swiginc\style.i(122) : Warning 314: 'clone' is a PHP keyword, renaming to 'c_clone' ..\swiginc\shape.i(110) : Warning 314: 'clone' is a PHP keyword, renaming to 'c_clone'
这需要讨论如何处理(在用于PHP的swig api中记录这些更改,或更改mapserver源中的基础函数名)
更新:关于“CalOne()”关键字,JavaMaScript也面临这个问题,并通过重新定义函数,如“CaleMeNeP()”或“C克隆()”来解决它。
#ifdef SWIGJAVA %newobject cloneMap; mapObj *cloneMap() #else %newobject clone; mapObj *clone() #endif
在下游PHP脚本中,用户必须在调用任何mapscript对象之前包含swig生成的文件“mapscript.php”,因为此文件包含各种常量和类:
<?php include("mapscript.php"); $mapfile = "C:/ms4w/apps/gmap/map/swig.map"; $oMap = new mapObj($mapfile);
在下游的PHP脚本中,用户必须修改其用于声明新对象的语法,例如:
来自:
<?php $oMap = ms_newMapObj(MAPFILE);
到:
<?php include("mapscript.php"); $oMap = new mapObj(MAPFILE);
三。实施细节¶
3.1受影响的文件¶
mapscript.i:添加对'phpextend.i的引用`
phpextend.i:可以包含所需的自定义对象和方法,例如:
将mapscript信息添加到phpinfo()调用中
PHP_MINFO_FUNCTION
正确初始化和关闭资源:
PHP_MINIT_FUNCTION
PHP_MSHUTDOWN_FUNCTION
PHP_RINIT_FUNCTION
PHP_RSHUTDOWN_FUNCTION
处理imageobj到stdout的输出(当前仅扩展到python和csharp)
imageobj->write()。
其他??
3.2跟踪问题¶
当前状态:
扩展信息通过phpinfo()正确显示
可以使用php 7.0.14脚本生成地图图像,该脚本只需在Windows上加载 Mapfile 并保存图像文件。
todo:
为cmake修改Windows生成脚本
将所有更改推送到沙盒
代码:https://github.com/jmckenna/mapserver/tree/phpmapscript-swig
测试:需要在/msautotest/php中更新所有现有的php测试/
第四章。投票历史¶
TBD