PHP MapScript Installation

Author:

Jeff McKenna

Contact:

jmckenna at gatewaygeomatics.com

Last Updated:

2020-01-17

Introduction

The PHP/MapScript module is a PHP dynamically loadable module that makes MapServer’s MapScript functions and classes available in a PHP environment.

The original version of MapScript (in Perl) uses SWIG, but at that time SWIG did not support the PHP language, so the PHP module had to be maintained separately and was not always in sync with other mapscripts. As of MapServer 7.4.0, PHP/MapScript is also available through the SWIG API.

The original PHP module was developed by DM Solutions Group and Mapgears and is currently maintained by GatewayGeo and other contributors.

This document assumes that you are already familiar with certain aspects of your operating system:

  • For Unix/Linux users, a familiarity with the build environment, notably make.

  • For Windows users, some compilation skills if you don’t have ready access to a pre-compiled installation and need to compile your own copy of MapServer with the PHP/MapScript module.

Which version of PHP is supported?

PHP MapScript was originally developed for PHP-3.0.14 but after MapServer 3.5 support for PHP3 was dropped. As of the last update of this document, PHP 5.6 or more recent was required, and PHP 7 is recommended.

The best combinations of MapScript and PHP versions are:

  • MapScript 7.4.0 with PHP 7.0 and up (through the new SWIG API)

  • MapScript 4.10 with PHP 5.2.1 and up

  • MapScript 4.10 with PHP 4.4.6 and up

Notitie

As of MapServer 7.4.0, PHP 7 is available through the SWIG API, and all existing MapServer users are encouraged to update their scripts for the new SWIG syntax; see the MapServer Migration Guide for example syntax.

How to Get More Information on the PHP/MapScript Module for MapServer

  • For a list of all classes, properties, and methods available in the module:

  • More information on the original PHP/MapScript module can be found on the PHP/MapScript page on MapTools.org.

  • The MapServer Wiki also has PHP/MapScript build and installation notes and some php code snippets.

  • As many users rely on MS4W for MapScript, you can also see user-contributed PHP 7 scripts through the SWIG API, on the MS4W wiki.

  • Questions regarding the module should be forwarded to the MapServer mailing list.

Obtaining, Compiling, and Installing PHP and the PHP/MapScript Module

Download PHP and PHP/MapScript

  • The PHP source or the Win32 binaries can be obtained from the PHP web site.

  • Once you have verified that PHP is installed and is running, you need to get the latest MapServer source and compile MapServer and the PHP module.

Setting Up PHP on Your Server

Unix

  • Check if you have PHP already installed (several Linux distributions have it built in).

  • If not, see the PHP manual’s “Installation on Unix systems” section.

Windows

Notitie

When setting up PHP on Windows, make sure that PHP is configured as a CGI and not as an Apache module because php_mapscript.dll is not thread-safe and does not work as an Apache module (See the Example Steps of a Full Windows Installation section of this document).

Build/Install the PHP/MapScript Module

Building on a Linux Box

NOTE: For UNIX users, see the README.CONFIGURE file in the MapServer source, or see the Compiling on Unix HowTo.

  • The main MapServer configure script will automatically setup the main makefile to compile php_mapscript.so if you pass the –WITH_PHP=ON argument to the configure script.

    Notitie

    As of MapServer 7.4.0, you can pass the –WITH_PHPNG=ON argument for the new PHP 7 support through the SWIG API.

  • Copy the php_mapscript.so library to your PHP extensions directory, and then use the dl() function to load the module at the beginning of your PHP scripts. See also the PHP function extension_loaded() to check whether an extension is already loaded.

    Notitie

    The dl() function was deprecated as of PHP 5.3.

  • The file mapscript/php/examples/phpinfo_mapscript.phtml will test that the php_mapscript module is properly installed and can be loaded.

  • If you get an error from PHP complaining that it cannot load the library, then make sure that you recompiled and reinstalled PHP with support for dynamic libraries. On RedHat 5.x and 6.x, this means adding “-rdynamic” to the CLDFLAGS in the main PHP3 Makefile after running ./configure Also make sure all directories in the path to the location of php_mapscript.so are at least r-x for the HTTPd user (usually ‘nobody’), otherwise dl() may complain that it cannot find the file even if it’s there.

Building on Windows

  • For Windows users, it is recommended to look for a precompiled binary for your PHP version on the MapServer download page or use the MS4W installer.

  • If for some reason you really need to compile your own Windows binary then see the README.WIN32 file in the MapServer source (good luck!).

Installing PHP/MapScript

Simply copy the file php_mapscript.dll to your PHP extensions directory (pathto/php/extensions)

Using phpinfo()

To verify that PHP and PHP/MapScript were installed properly, create a ‘.php’ file containing the following code and try to access it through your web server:

<HTML>
<BODY>

<?php
  if (PHP_OS == "WINNT" || PHP_OS == "WIN32")
  {
    dl("php_mapscript.dll");
  }
  else
  {
    dl("php_mapscript.so");
  }
  phpinfo();
?>

</BODY>
</HTML>

If PHP and PHP/MapScript were installed properly, several tables should be displayed on your page, and ‘MapScript’ should be listed in the ‘Extensions’ table.

Example Steps of a Full Windows Installation

Using MS4W (MapServer for Windows)

  1. Download the latest MS4W base package.

  2. Extract the files in the archive to the root of one of your drives (e.g. C:/ or D:/).

  3. Double-click the file /ms4w/apache-install.bat to install and start the Apache Web server.

  4. In a web browser goto http://127.0.0.1. You should see an MS4W opening page. You are now running PHP, PHP/MapScript, and Apache.

  5. You can now optionally install other applications that are pre-configured for MS4W, which are located on the MS4W download page.

Manual Installation Using Apache Server

  1. Download the Apache Web Server and extract it to the root of a directory (eg. D:/Apache).

  2. Download PHP and extract it to your Apache folder (eg. D:/Apache/PHP).

  3. Create a temp directory to store MapServer created GIFs. NOTE: This directory is specified in the IMAGEPATH parameter of the WEB Object in the Mapfile reference. For this example we will call the temp directory “ms_tmp” (eg. E:/tmp/ms_tmp).

  4. Locate the file httpd.conf in the conf directory of Apache, and open it in a text viewer (eg. TextPad, Emacs, Notepad).

    In the Alias section of this file, add aliases to the ms_tmp folder and any other folder you require (for this example we will use the msapps folder):

    Alias   /ms_tmp/   "path/to/ms_tmp/"
    Alias   /msapps/   "path/to/msapps/"
    

    In the ScriptAlias section of this file, add an alias for the PHP folder.

    ScriptAlias    /cgi-php/     "pathto/apache/php/"
    

    In the AddType section of this file, add a type for php files.

    AddType application/x-httpd-php   .php
    

    In the Action section of this file, add an action for the php.exe file.

    Action application/x-httpd-php    "/cgi-php/php.exe"
    
  5. Copy the file php.ini-dist located in your Apache/php directory and paste it into your WindowsNT folder (eg. c:/winnt), and then rename this file to php.ini in your WindowsNT folder.

  6. If you want specific extensions loaded by default, open the php.ini file in a text viewer and uncomment the appropriate extension.

  7. Place the file php_mapscript.dll into your Apache/php/extensions folder.

Installation Using Microsoft’s IIS

(please see the Running MapServer on IIS document for uptodate steps)

  1. Install IIS if required (see the IIS installation procedure).

  2. Install PHP and PHP/MapScript (see above).

  3. Open the Internet Service Manager (eg. C/WINNT/system32/inetsrv/inetmgr.exe).

  4. Select the Default web site and create a virtual directory (right click, select New/Virtual directory). For this example we will call the directory msapps.

  5. In the Alias field enter msapps and click Next.

  6. Enter the path to the root of your application (eg. “c:/msapps”) and click Next.

  7. Set the directory permissions and click Finish.

  8. Select the msapps virtual directory previously created and open the directory property sheets (by right clicking and selecting properties) and then click on the Virtual directory tab.

  9. Click on the Configuration button and then click the App Mapping tab.

  10. Click Add and in the Executable box type: path/to/php/php.exe %s %s. You MUST have the %s %s on the end, PHP will not function properly if you fail to do this. In the Extension box, type the file name extension to be associated with your PHP scripts. Usual extensions needed to be associated are phtml and php. You must repeat this step for each extension.

  11. Create a temp directory in Explorer to store MapServer created GIFs.

    Notitie

    This directory is specified in the IMAGEPATH parameter of the WEB Object in the Mapfile. For this example we will call the temp directory ms_tmp (eg. C:/tmp/ms_tmp).

  12. Open the Internet Service Manager again.

  13. Select the Default web site and create a virtual directory called ms_tmp (right click, select New/Virtual directory). Set the path to the ms_tmp directory (eg. C:/tmp/ms_tmp) . The directory permissions should at least be set to Read/Write Access.

FAQ / Common Problems

Questions Regarding Documentation

Q:

Is there any documentation available?

A:

The main reference document is the SWIG API (or the legacy PHP MapScript reference), which describes all of the current classes, properties and methods associated with the PHP/MapScript module.

To get a more complete description of each class and the meaning of their member variables, see the MapScript reference and the MapFile reference.

The MapServer Wiki also has PHP/MapScript build and installation notes and some php code snippets.


Q:

Where can I find sample scripts?

A:

Some examples are included in directory mapserver/mapscript/php/examples/ in the MapServer source distribution. A good one to get started is test_draw_map.phtml: it’s a very simple script that just draws a map, legend and scalebar in an HTML page.

A good intermediate example is the PHP MapScript By Example guide (note that this document was created for an earlier MapServer version but the code might be still useful).

As many users rely on MS4W for MapScript, you can also see user-contributed PHP 7 scripts through the SWIG API, on the MS4W wiki.

The original example is the “Gmap demo”, download the whole source and data files from the MapTools.org download page.

Questions About Installation

Q:

How can I tell that the module is properly installed on my server?

A:

Create a file called phpinfo.phtml with the following contents:

<?php  dl("php_mapscript.so");
       phpinfo();
?>

Make sure you replace the php_mapscript.so with the name under which you installed it, it could be php_mapscript_74.so on Unix, or php_mapscript_74.dll on Windows

You can then try the second test page mapserver/mapscript/php/examples/test_draw_map.phtml. This page simply opens a MapServer .map file and inserts its map, legend, and scalebar in an HTML page. Modify the page to access one of your own MapServer .map files, and if you get the expected result, then everything is probably working fine.


Q:

I try to display my .phtml or .php page in my browser but the page is shown as it would it Notepad.

A:

The problem is that your PHP installation does not recognize “.phtml” as a PHP file extension. Assuming you’re using PHP under Apache then you need to add the following line with the other PHP-related AddType lines in the httpd.conf:

AddType application/x-httpd-php .phtml

For a more detailed explanation, see the Example Steps of a Full Windows Installation section of this document.


Q:

I installed PROJ (formerly `PROJ.4`), GDAL, and other support libraries on my system, they are recognized by MapServer’s “configure” as a system lib but at runtime I get an error: “libproj.so.0: No such file or directory”.

A:

You are probably running a RedHat Linux system if this happened to you. This happens because the libraries install themselves under /usr/local/lib but this directory is not part of the runtime library path by default on your system.

(I’m still surprised that “configure” picked PROJ as a system lib since it’s not in the system’s lib path…probably something magic in autoconf that we’ll have to look into)

There are a couple of possible solutions:

  1. Add a “setenv LD_LIBRARY_PATH” to your httpd.conf to contain that directory

  2. Edit /etc/ld.so.conf to add /usr/local/lib, and then run “/sbin/ldconfig”. This will permanently add /usr/local/lib to your system’s runtime lib path.

  3. Configure MapServer with the following options:

    --with-proj=/usr/local --enable-runpath
    

    and the /usr/local/lib directory will be hardcoded in the exe and .so files

I (Daniel Morissette) personally prefer option #2 because it is permanent and applies to everything running on your system.


Q:

Does PHP/MapScript have to be setup as a CGI? If so, why?

A:

Yes, please see the PHP/MapScript CGI page in the MapServer Wiki for details.


Q:

I have compiled PHP as a CGI and when PHP tries to load the php_mapscript.so, I get an “undefined symbol: _register_list_destructors” error. What’s wrong?

A:

Your PHP CGI executable is probably not linked to support loading shared libraries. The MapServer configure script must have given you a message about a flag to add to the PHP Makefile to enable shared libs.

Edit the main PHP Makefile and add “-rdynamic” to the LDFLAGS at the top of the Makefile, then relink your PHP executable.

Note: The actual parameter to add to LDFLAGS may vary depending on the system you’re running on. On Linux it is “-rdynamic”, and on *BSD it is “-export-dynamic”.


Q:

What are the best combinations of MapScript and PHP versions?

A:

The best combinations are:

  • MapScript 7.4.0 with PHP 7.0 and up (through the new SWIG API)

  • MapScript 4.10 with PHP 5.2.1 and up

  • MapScript 4.10 with PHP 4.4.6 and up