Post on 07-Jan-2017
transcript
2015/11/24 PHP BLTdo_aki
Writingphp
extensions in golang
@do_aki
@do_aki
http://do-aki.net/
https://speakerdeck.com/naruse/writing-extension-libraries-in-go
In case of PHP……?
golang buildmode• -buildmode=c-shared• build the main package (main function is dummy)
• export symbol by “//export”
https://golang.org/s/execmodes
cgo(call C function)package main/* #include <stdlib.h>*/import “C”
func Random() int {return int(C.random())
}
cgo(export)
package mainimport “C”
//export go_funcfunc go_func() int {
return 1}
php extension loading process
1.load shared library (.so / .dll)
2.fetch “get_module” or “_get_module” symbol
3.call fetched function and get pointer to zend_module_entry structure
4.register module using the zend_module_entry
ref:php_load_extension in ext/standard/dl.c
export get_modulepackage main/*#include “php.h”*/import “C”
var gophp_module_entry C.zend_module_entry
//export get_modulefunc get_module() *C.zend_module_entry { gophp_module_entry.name = C.Cstring(“gophp”) gophp_module_entry.functions = … // fill member in gophp_module_entry return gophp_module_entry;}
export get_modulepackage main/*#include “php.h”*/import “C”
var gophp_module_entry C.zend_module_entry
//export get_modulefunc get_module() *C.zend_module_entry { gophp_module_entry.name = C.Cstring(“gophp”) gophp_module_entry.functions = … // fill member in gophp_module_entry return gophp_module_entry;}
FAILE
D
constraints of c in go
function-like macro
Access union member
Difficul
t
separate export function and function definition
• err: multiple definition of ` xxx'
• write definition in non_export.go (not include //export)
• write declarations in export.go (include //export)
• go build non_export.go export.go
github.com/do-aki/gophp_sample
but,but,but• segmentation fault in shutdown process sometimes……
Program received signal SIGSEGV, Segmentation fault.[Switching to Thread 0x7fffee4c2700 (LWP 8943)]0x00007ffff04d6821 in ?? ()(gdb) backtrace#0 0x00007ffff04d6821 in ?? ()#1 0x00007ffff04a6213 in ?? ()#2 0x000000c82002ce90 in ?? ()#3 0x0000000000000000 in ?? ()
in go runtime? Umm…
fin.