Writing php extensions in golang

Preview:

Citation preview

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.

Recommended