MS RFC 117:通过swig支持php 7 mapscript

作者

杰夫麦克纳

联系

jmckenna@gatewaygeomatics.com

最后更新

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

PHP 7比较

资料来源:digitalOcean.com

MAPServer的几个MaScript(Java、Python、CpHARP)使用 SWIG 库(用于将代码转换为其他语言的包装库)自动生成必要的mapscript代码;但是现有的php mapscript扩展不使用swig,而是在当时自定义编写的。MapServer的项目指导委员会(PSC)也讨论了利用Swig来长期支持php-mapscript的可能性。

Swig团队最近在他们的开发沙盒中添加了对php 7的支持,它通过了Swig的所有测试套件,并得到了社区的好评。

2。建议的增强

mapscript.i.

2.2向后兼容性

此更改将自动支持php 5和7系列。在某种程度上,Swig团队将删除对php 5的支持(他们现在正在讨论这个问题),但它可能与 PHP 5.6 Security Support timeline (至2018年12月31日)。

在短期内处理任何可能的兼容性问题:

  1. 所有swig-php代码都将位于其自己的目录中:/mapscript/phpng/

  2. 模块将被命名 phpng_mapscript.so 或**phpng_mapscript.dl**

2.3性能影响

如上所述,这将大大提高性能。

2.4个局限性

  1. 依赖稳定版本的打包程序/包在官方的swig版本包含php 7之前不太可能包含swig dev。

    更新:2016-12-29最新的官方swig-3.0.11版本现在包含了php 7支持(请参见 announcement

  2. 在通过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
    
  3. mapscript.php

    <?php
    
      include("mapscript.php");
    
      $mapfile = "C:/ms4w/apps/gmap/map/swig.map";
      $oMap = new mapObj($mapfile);
    
  4. 在下游的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跟踪问题

3.3文件

  • 对现有函数或自定义函数的任何更改都将添加到现有函数中 SWIG API 文件

  • 现有的 PHP API 文档将包含一个注释,其中提到版本>=7.2已弃用

第四章。投票历史

TBD