zend.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package zend
  2. // 用go封装Zend的C API函数。
  3. import (
  4. "errors"
  5. // "fmt"
  6. )
  7. /*
  8. // #cgo CFLAGS: -I/usr/include/php -I/usr/include/php/Zend -I/usr/include/php/TSRM
  9. // #cgo LDFLAGS: -L/home/dev/php5/lib -lphp5
  10. #cgo CFLAGS: -g -O2 -std=c99 -D_GNU_SOURCE
  11. // #cgo LDFLAGS: -lphp5
  12. #cgo linux LDFLAGS: -Wl,--warn-unresolved-symbols -Wl,--unresolved-symbols=ignore-all
  13. #cgo darwin LDFLAGS: -undefined dynamic_lookup
  14. #include <stdlib.h>
  15. #include "sztypes.h"
  16. #include "szend.h"
  17. */
  18. import "C"
  19. import "unsafe"
  20. import "fmt"
  21. const (
  22. ZEND_ENGINE_3 = 3
  23. ZEND_ENGINE_2 = 2
  24. )
  25. var ZEND_ENGINE = int(C.gozend_zend_version_no())
  26. ////export call_user_function_string
  27. func Call_user_function_string(func_name string, arg string) (string, error) {
  28. cfname := C.CString(func_name)
  29. carg := C.CString(arg)
  30. defer C.free(unsafe.Pointer(cfname))
  31. defer C.free(unsafe.Pointer(carg))
  32. ret := C.gozend_call_user_function_string(cfname, carg)
  33. if ret == nil {
  34. return "", errors.New("call error")
  35. }
  36. fmt.Printf("retp: %p\n", ret)
  37. fmt.Println("ret:", C.GoString(ret))
  38. defer C.gozend_efree(unsafe.Pointer(ret))
  39. return C.GoString(ret), nil
  40. }
  41. func Call_user_function(func_name string, args ...interface{}) {
  42. argc := len(args)
  43. if argc > 0 {
  44. }
  45. // TODO args to zval**
  46. }
  47. func Eval_string(code string) bool {
  48. ccode := C.CString(code)
  49. defer C.free(unsafe.Pointer(ccode))
  50. ret := C.gozend_eval_string(ccode)
  51. return ret == 1
  52. }