PHP-CPP extension, Unable to initialize module because Module and PHP are using different API versions

64 Views Asked by At

I am trying to run my PHP project on XAMPP server, and I am using PHP extensions written in C++, using PHP-CPP library.

This is the error I get when i run /opt/lampp/bin/php -m

PHP Warning:  PHP Startup: module_nametwo: Unable to initialize module
Module compiled with module API=20210902
PHP    compiled with module API=20220829

My system PHP version => 8.2.15

XAMPP PHP version => 8.2.12

My system version => 2.4.52

XAMPP Apache Apache version => 2.4.58

Update

After trying to upgrade and update the module, i got this error.

on XAMPP:

$ /opt/lampp/bin/php -m
PHP Warning:  PHP Startup: simple_two: Unable to initialize module
Module compiled with module API=20230831
PHP    compiled with module API=20220829

on my local PHP:

$ php -m
PHP Warning:  PHP Startup: simple_two: Unable to initialize module
Module compiled with module API=20230831
PHP    compiled with module API=20220829

So I uninstalled php8.3 by the command sudo apt remove php8.3*

So when i run

$ sudo update-alternatives --display php
php - auto mode
link best version is /usr/bin/php8.2
link currently points to /usr/bin/php8.2
link php is /usr/bin/php
slave php.1.gz is /usr/share/man/man1/php.1.gz
/usr/bin/php8.2 - priority 82
slave php.1.gz: /usr/share/man/man1/php8.2.1.gz.

This is the updated Makefile:


#   Makefile template
#
#   This is an example Makefile that can be used by anyone who is building
#   his or her own PHP extensions using the PHP-CPP library. 
#
#   In the top part of this file we have included variables that can be
#   altered to fit your configuration, near the bottom the instructions and
#   dependencies for the compiler are defined. The deeper you get into this
#   file, the less likely it is that you will have to change anything in it.
#


#
#   Name of your extension
#
#   This is the name of your extension. Based on this extension name, the
#   name of the library file (name.so) and the name of the config file (name.ini)
#   are automatically generated
#


NAME                =   simple_two




#
#   Php.ini directories
#
#   In the past, PHP used a single php.ini configuration file. Today, most
#   PHP installations use a conf.d directory that holds a set of config files,
#   one for each extension. Use this variable to specify this directory.
#


#INI_DIR             =   /etc/php/8.2/cli/conf.d




#
#   The extension dirs
#
#   This is normally a directory like /usr/lib/php5/20121221 (based on the 
#   PHP version that you use. We make use of the command line 'php-config' 
#   instruction to find out what the extension directory is, you can override
#   this with a different fixed directory
#


EXTENSION_DIR       =   $(shell  /opt/lampp/bin/php-config --extension-dir)




#
#   The name of the extension and the name of the .ini file
#
#   These two variables are based on the name of the extension. We simply add
#   a certain extension to them (.so or .ini)
#


EXTENSION           =   ${NAME}.so
INI                 =   ${NAME}.ini




#
#   Compiler
#
#   By default, the GNU C++ compiler is used. If you want to use a different
#   compiler, you can change that here. You can change this for both the 
#   compiler (the program that turns the c++ files into object files) and for
#   the linker (the program that links all object files into the single .so
#   library file. By default, g++ (the GNU C++ compiler) is used for both.
#


COMPILER            =   g++
LINKER              =   g++




#
#   Compiler and linker flags
#
#   This variable holds the flags that are passed to the compiler. By default, 
#   we include the -O2 flag. This flag tells the compiler to optimize the code, 
#   but it makes debugging more difficult. So if you're debugging your application, 
#   you probably want to remove this -O2 flag. At the same time, you can then 
#   add the -g flag to instruct the compiler to include debug information in
#   the library (but this will make the final libphpcpp.so file much bigger, so
#   you want to leave that flag out on production servers).
#
#   If your extension depends on other libraries (and it does at least depend on
#   one: the PHP-CPP library), you should update the LINKER_DEPENDENCIES variable
#   with a list of all flags that should be passed to the linker.
#


COMPILER_FLAGS      =   -Wall -c -O2 -std=c++11 -fpic -o
LINKER_FLAGS        =   -shared
LINKER_DEPENDENCIES =   -lphpcpp -L/usr/lib/php/20220829


#
#   Command to remove files, copy files and create directories.
#
#   I've never encountered a *nix environment in which these commands do not work. 
#   So you can probably leave this as it is
#


RM                  =   rm -f
CP                  =   cp -f
MKDIR               =   mkdir -p




#
#   All source files are simply all *.cpp files found in the current directory
#
#   A builtin Makefile macro is used to scan the current directory and find 
#   all source files. The object files are all compiled versions of the source
#   file, with the .cpp extension being replaced by .o.
#


SOURCES             =   $(wildcard *.cpp)
OBJECTS             =   $(SOURCES:%.cpp=%.o)




#
#   From here the build instructions start
#


all:                    ${OBJECTS} ${EXTENSION}


${EXTENSION}:           ${OBJECTS}
                       ${LINKER} ${LINKER_FLAGS} -o $@ ${OBJECTS} ${LINKER_DEPENDENCIES}


${OBJECTS}:
                       ${COMPILER} ${COMPILER_FLAGS} $@ ${@:%.o=%.cpp}


install:        
                       ${CP} ${EXTENSION} ${EXTENSION_DIR}
#                       ${CP} ${INI} ${INI_DIR}
               
clean:
                       ${RM} ${EXTENSION} ${OBJECTS}

I added the line extension=simple_two.so to this file -> /opt/lampp/etc/php.ini, manually

I copied simple_two.ini file to /etc/php/8.2/mods-available/ and created a link in /etc/php/8.2/cli/conf.d that points to the previous file

The simple_two.so file is under /opt/lampp/lib/php/no-debug-non-zts-20220829 the folder

but still the error is not fixed.

So maybe they error is about the PHP-CPP package that the extension utilize,

Maybe the error is with PHP-CPP library compilation?

1

There are 1 best solutions below

0
John Hanley On

API version 20200903 is PHP 8.1. API version 20220829 is PHP 8.2.

Your problem is caused by using one version of PHP and loading PHP extensions compiled for a different version.

module_nametwo is compiled for PHP 8.1. Either update the module to a PHP 8.2 compatible version or downgrade/switch to PHP 8.1.

You have shown a Makefile in your question. However, that alone does not specify the PHP development package that you are using for includes, libs, etc. The PHP development package must match the PHP version you are compiling for and running the module (extension) under.