Skip to content

Instantly share code, notes, and snippets.

@mcharytoniuk
Last active March 28, 2024 22:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mcharytoniuk/8af7a1c1663c85f3ddb86ae7653bd1db to your computer and use it in GitHub Desktop.
Save mcharytoniuk/8af7a1c1663c85f3ddb86ae7653bd1db to your computer and use it in GitHub Desktop.
php extension in zig

To build it:

  1. zig build
  2. phpize
  3. ./configure
  4. make

To test it:

php -d extension=./modules/my_php_extension.so -r "echo hello_world();"

Should output:

Hello from ZIG!

const std = @import("std");
pub fn build(b: *std.Build) void {
const optimize = b.standardOptimizeOption(.{});
const target = b.standardTargetOptions(.{});
const library = b.addStaticLibrary(.{
.name = "my_php_extension",
.root_source_file = .{
.path = "hello.zig",
},
.target = target,
.optimize = optimize,
});
library.addIncludePath(.{
.path = "/usr/include/php/20220829"
});
library.addIncludePath(.{
.path = "/usr/include/php/20220829/main"
});
library.addIncludePath(.{
.path = "/usr/include/php/20220829/TSRM"
});
library.addIncludePath(.{
.path = "/usr/include/php/20220829/Zend"
});
library.addIncludePath(.{
.path = "/usr/include"
});
library.addIncludePath(.{
.path = "/usr/include/x86_64-linux-gnu"
});
b.installArtifact(library);
}
// php-config --includes
PHP_ARG_ENABLE(my_php_extension, whether to enable My PHP Extension,
[ --enable-my-php_extension Enable My PHP Extension support])
if test "$PHP_MY_PHP_EXTENSION" != "no"; then
PHP_REQUIRE_CXX()
PHP_ADD_LIBRARY(stdc++, 1, MY_PHP_EXTENSION_SHARED_LIBADD)
PHP_SUBST(MY_PHP_EXTENSION_SHARED_LIBADD)
PHP_ADD_LIBRARY_WITH_PATH(my_php_extension, $(pwd)/zig-out/lib, MY_PHP_EXTENSION_SHARED_LIBADD)
PHP_NEW_EXTENSION(my_php_extension, hello.c, $ext_shared)
fi
#include "hello.h"
PHP_MINIT_FUNCTION(my_php_extension) {
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(my_php_extension) {
return SUCCESS;
}
PHP_RINIT_FUNCTION(my_php_extension) {
return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(my_php_extension) {
return SUCCESS;
}
PHP_MINFO_FUNCTION(my_php_extension) {
php_info_print_table_start();
php_info_print_table_header(2, "My PHP Extension", "enabled");
php_info_print_table_end();
}
zend_module_entry my_php_extension_module_entry = {
STANDARD_MODULE_HEADER,
"my_php_extension",
myextension_functions,
PHP_MINIT(my_php_extension),
PHP_MSHUTDOWN(my_php_extension),
PHP_RINIT(my_php_extension),
PHP_RSHUTDOWN(my_php_extension),
PHP_MINFO(my_php_extension),
PHP_MY_PHP_EXTENSION_VERSION,
STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(my_php_extension)
#ifndef MYEXTENSION_H
#define MYEXTENSION_H
#define PHP_MY_PHP_EXTENSION_VERSION "1.0.0"
#include "php.h"
extern zend_function_entry myextension_functions[];
#endif // MYEXTENSION_H
const std = @import("std");
const php = @cImport({
@cInclude("php.h");
});
export fn hello_world(execute_data: ?*php.zend_execute_data, return_value: ?*php.zval) void {
_ = execute_data;
_ = return_value;
_ = php.php_printf("Hello from ZIG!\n");
}
const arg_info = [_]php.zend_internal_arg_info{
.{
.name = null,
.type = .{
.type_mask = php.MAY_BE_NULL,
.ptr = null,
},
},
};
export const myextension_functions = [_]php.zend_function_entry{
php.zend_function_entry{
.fname = "hello_world",
.handler = hello_world,
.arg_info = &arg_info,
.num_args = 0,
.flags = 0,
},
php.zend_function_entry{
.fname = null,
.handler = null,
.arg_info = null,
.num_args = 0,
.flags = 0,
},
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment