php_embed 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,10 @@
1
- #ifndef PHP_EMBED_CONVERT
2
- #define PHP_EMBED_CONVERT
1
+ #ifndef PHP_EMBED_CONVERT_HEADER
2
+ #define PHP_EMBED_CONVERT_HEADER
3
3
 
4
- #include <ruby.h>
5
- #include <php.h>
6
-
7
-
8
- VALUE zval_to_hash(zval* zv);
9
- VALUE zval_to_array(zval* zv);
4
+ VALUE zval_to_hash(zval *zv);
5
+ VALUE zval_to_array(zval *zv);
10
6
 
11
7
  VALUE convert_value_to_php_string(VALUE v);
12
- zval* value_to_zval(VALUE v);
8
+ zval *value_to_zval(VALUE v);
13
9
 
14
10
  #endif
@@ -1,10 +1,113 @@
1
- require "mkmf"
1
+ require 'mkmf'
2
+ require 'fileutils'
3
+ require 'pathname'
4
+ require 'open-uri'
5
+
6
+
7
+
8
+ PHP_VERSION = '5.4.10'
9
+ PHP_SRC_URL = "http://php.net/distributions/php-#{PHP_VERSION}.tar.bz2"
10
+
11
+ def download_src(destfile)
12
+ print "download php source\n"
13
+ FileUtils.copy_stream(open(PHP_SRC_URL), destfile)
14
+ end
15
+
16
+ def decompression(archive)
17
+ print "decompression php source\n"
18
+ `tar xf #{archive}`
19
+ abort 'tar failure' if $?.exitstatus != 0
20
+ end
21
+
22
+ def configure(prefix)
23
+ print "configure\n"
24
+
25
+ opts = %w(
26
+ --disable-cgi
27
+ --without-pear
28
+ --enable-sockets
29
+ --enable-ftp
30
+ --with-mysql=mysqlnd
31
+ --with-mysqli=mysqlnd
32
+ --with-pdo-mysql=mysqlnd
33
+ --enable-pcntl
34
+ --enable-mbstring
35
+ --disable-debug
36
+ --disable-libxml
37
+ --disable-dom
38
+ --disable-simplexml
39
+ --disable-xml
40
+ --disable-xmlreader
41
+ --disable-xmlwriter
42
+ --disable-phar
43
+ --enable-embed
44
+ ).join(' ')
45
+ opts += " --prefix=#{prefix}"
46
+ opts += " --with-libdir=lib64" if `uname -p`.chomp == 'x86_64'
47
+
48
+ `./configure #{opts}`
49
+ abort 'configure failure' if $?.exitstatus != 0
50
+ end
51
+
52
+ def make_and_install
53
+ print "make\n"
54
+ `make`
55
+ abort 'make failure' if $?.exitstatus != 0
56
+
57
+ print "make install\n"
58
+ `make install`
59
+ abort 'make install failure' if $?.exitstatus != 0
60
+ end
61
+
62
+ def prepare_compile_php(prefix)
63
+ abort 'need tar' unless find_executable 'tar'
64
+ abort 'need make' unless find_executable 'make'
65
+ end
66
+
67
+ def compile_php(prefix)
68
+ Dir.mkdir 'src' unless Dir.exists? 'src'
69
+ Dir.chdir('src') do
70
+ src_filename = "php-#{PHP_VERSION}.tar.bz2"
71
+ download_src(src_filename) unless File.exists? src_filename
72
+ decompression(src_filename)
73
+ end
74
+
75
+ src_dir = "src/php-#{PHP_VERSION}"
76
+ if !Dir.exists? src_dir
77
+ abort 'soruce directory not exists'
78
+ end
79
+
80
+ FileUtils.mkpath "#{prefix}/etc/conf.d"
81
+
82
+ Dir.chdir(src_dir) do
83
+ configure(prefix)
84
+ make_and_install
85
+ end
86
+
87
+ FileUtils.copy 'php.ini', "#{prefix}/lib/"
88
+ end
89
+
90
+
91
+
2
92
 
3
93
  dir_config('php')
4
- if !have_library('php5', 'php_embed_init')
5
- exit(1)
94
+ php_config = find_executable('php-config')
95
+ have_libphp = have_library('php5', 'php_embed_init')
96
+
97
+ if !php_config || !have_libphp
98
+ php_version = arg_config('--compile-php')
99
+ abort 'libphp5 or php-config not found: try --compile-php' unless php_version
100
+
101
+ prefix = Pathname.getwd.join('php')
102
+
103
+ prepare_compile_php(prefix.to_s)
104
+ compile_php(prefix.to_s)
105
+
106
+ php_config = prefix.join('bin', 'php-config').to_s
107
+ find_library('php5', 'php_embed_init', prefix.join('lib').to_s)
6
108
  end
7
109
 
8
- $CPPFLAGS = `php-config --includes`.chomp + ' ' + $CPPFLAGS
110
+ $CPPFLAGS = `#{php_config} --includes`.chomp + ' ' + $CPPFLAGS
9
111
 
10
112
  create_makefile("php_embed/php")
113
+
data/ext/php_embed/php.c CHANGED
@@ -1,12 +1,11 @@
1
1
  #include <stdio.h>
2
- #include <ruby.h>
3
2
  #include <sapi/embed/php_embed.h>
4
- #include "value.h"
5
- #include "convert.h"
3
+ #include "php_embed.h"
6
4
 
7
5
  static VALUE callback_output = Qnil;
8
6
  static VALUE callback_error = Qnil;
9
7
 
8
+ void ***tsrm_ls;
10
9
 
11
10
  VALUE mPhpEmbed;
12
11
 
@@ -16,19 +15,21 @@ VALUE rb_ePhpEmbedMissingError;
16
15
 
17
16
  static int php_ub_write(const char *str, unsigned int str_length TSRMLS_DC)
18
17
  {
19
- if (!NIL_P(callback_output)) {
20
- VALUE args = rb_ary_new();
21
- rb_ary_push(args, rb_str_new(str, str_length));
22
- rb_proc_call(callback_output, args);
23
- }
24
- return str_length;
18
+ if (!NIL_P(callback_output)) {
19
+ VALUE args = rb_ary_new();
20
+ rb_ary_push(args, rb_str_new(str, str_length));
21
+ rb_proc_call(callback_output, args);
22
+ }
23
+ return str_length;
25
24
  }
26
- static void php_log_message(char *message)
25
+
26
+ static void php_log_message(char *message TSRMLS_DC)
27
27
  {
28
- if (!NIL_P(callback_error)) {
29
- rb_proc_call(callback_error, rb_ary_new3(1, rb_str_new(message, strlen(message))));
30
- }
28
+ if (!NIL_P(callback_error)) {
29
+ rb_proc_call(callback_error, rb_ary_new3(1, rb_str_new(message, strlen(message))));
30
+ }
31
31
  }
32
+
32
33
  static void php_sapi_error(int type, const char *fmt, ...)
33
34
  {
34
35
  va_list va;
@@ -38,243 +39,232 @@ static void php_sapi_error(int type, const char *fmt, ...)
38
39
  va_end(va);
39
40
  }
40
41
 
41
- int eval_php_code(char* code) {
42
- int ret = 0;
42
+ int eval_php_code(char *code) {
43
+ int ret = 0;
43
44
 
44
- zend_try {
45
- ret = zend_eval_string(code, NULL, (char*)"" TSRMLS_CC);
46
- } zend_catch {
45
+ zend_try {
46
+ ret = zend_eval_string(code, NULL, (char *)"" TSRMLS_CC);
47
+ } zend_catch {
47
48
 
48
- } zend_end_try();
49
+ } zend_end_try();
49
50
 
50
- return FAILURE == ret;
51
+ return ret == FAILURE;
51
52
  }
52
53
 
53
- int eval_and_return_php_code(char* code, VALUE* return_value) {
54
- int err = 0;
55
- zval retval;
56
-
57
- zend_try {
58
- if (zend_eval_string(code, &retval, (char*)"" TSRMLS_CC) == FAILURE) {
59
- err = 1;
60
- } else {
61
- //*return_value = zval_to_value(&retval);
62
- *return_value = new_php_embed_value(&retval);
63
- zval_dtor(&retval);
64
- }
54
+ int eval_and_return_php_code(char *code, VALUE *return_value) {
55
+ int retval = SUCCESS;
56
+ zval evaluated;
65
57
 
66
- } zend_catch {
58
+ zend_try {
59
+ if (zend_eval_string(code, &evaluated, (char *)"" TSRMLS_CC) == FAILURE) {
60
+ retval = FAILURE;
61
+ } else {
62
+ *return_value = new_php_embed_value(&evaluated);
63
+ zval_dtor(&evaluated);
64
+ }
65
+ } zend_catch {
67
66
 
68
- } zend_end_try();
67
+ } zend_end_try();
69
68
 
70
- return err;
69
+ return retval;
71
70
  }
72
71
 
73
72
  VALUE php_eval(VALUE self, VALUE code) {
74
- if (eval_php_code(StringValuePtr(code))) {
75
- rb_raise(rb_ePhpEmbedSyntaxError, "invalid code");
76
- }
73
+ if (eval_php_code(StringValuePtr(code))) {
74
+ rb_raise(rb_ePhpEmbedSyntaxError, "invalid code");
75
+ }
77
76
 
78
- return Qnil;
77
+ return Qnil;
79
78
  }
80
79
 
81
80
 
82
- zend_function* php_find_function(char* name) {
83
- char* lcname;
84
- int name_len;
85
- int found;
86
- zend_function *func;
81
+ zend_function *php_find_function(char *name) {
82
+ char *lcname;
83
+ int name_len;
84
+ int found;
85
+ zend_function *func;
87
86
 
88
- name_len = strlen(name);
89
- lcname = zend_str_tolower_dup(name, name_len);
87
+ name_len = strlen(name);
88
+ lcname = zend_str_tolower_dup(name, name_len);
90
89
 
91
- name = lcname;
92
- if ('\\' == lcname[0]) {
93
- name = &lcname[1];
94
- name_len--;
95
- }
90
+ name = lcname;
91
+ if (lcname[0] == '\\') {
92
+ name = &lcname[1];
93
+ name_len--;
94
+ }
96
95
 
97
- found = (SUCCESS == zend_hash_find(EG(function_table), name, name_len+1, (void**)&func));
98
- efree(lcname);
96
+ found = (zend_hash_find(EG(function_table), name, name_len+1, (void**)&func) == SUCCESS);
97
+ efree(lcname);
99
98
 
100
- if (found) {
101
- return func;
102
- }
99
+ if (found) {
100
+ return func;
101
+ }
103
102
 
104
- return NULL;
103
+ return NULL;
105
104
  }
106
105
 
106
+ VALUE php_call(int argc, VALUE *argv, VALUE self) {
107
+ VALUE name, args, retval;
108
+ zend_function *func;
109
+ int call_result, i;
110
+ zval *retval_ptr;
111
+ zend_fcall_info fci;
112
+ zend_fcall_info_cache fcc;
113
+ zval ***call_args;
114
+ zval **zval_array;
115
+
116
+ rb_scan_args(argc, argv, "1*", &name, &args);
117
+
118
+ if (TYPE(name) == T_SYMBOL) {
119
+ name = rb_sym_to_s(name);
120
+ }
107
121
 
122
+ if (TYPE(name) != T_STRING) {
123
+ rb_raise(rb_eArgError, "invalid function name");
124
+ }
108
125
 
109
- VALUE php_call(int argc, VALUE *argv, VALUE self) {
110
- VALUE name, args, retval;
111
- zend_function* func;
112
- int call_result, i;
113
- zval *retval_ptr;
114
- zend_fcall_info fci;
115
- zend_fcall_info_cache fcc;
116
- zval ***call_args;
117
- zval **zval_array;
118
-
119
- rb_scan_args(argc, argv, "1*", &name, &args);
120
-
121
- if (T_SYMBOL == TYPE(name)) {
122
- name = rb_sym_to_s(name);
123
- }
124
-
125
- if (T_STRING != TYPE(name)) {
126
- rb_raise(rb_eArgError, "invalid function name");
127
- }
128
-
129
-
130
- func = php_find_function(StringValueCStr(name));
131
- if (!func) {
132
- rb_raise(rb_ePhpEmbedMissingError, "function not found");
133
- }
134
-
135
- zval_array = (zval**)malloc(sizeof(zval*) * argc-1);
136
- call_args = (zval***)malloc(sizeof(zval**) * argc-1);
137
- for(i=0; i<argc-1; ++i) {
138
- zval_array[i] = value_to_zval(RARRAY_PTR(args)[i]);
139
- call_args[i] = &zval_array[i];
140
- }
141
-
142
- fci.size = sizeof(fci);
143
- fci.function_table = NULL;
144
- fci.function_name = NULL;
145
- fci.symbol_table = NULL;
146
- fci.object_ptr = NULL;
147
- fci.retval_ptr_ptr = &retval_ptr;
148
- fci.param_count = argc-1;
149
- fci.params = call_args;
150
- fci.no_separation = 1;
151
-
152
- fcc.initialized = 1;
153
- fcc.function_handler = func;
154
- fcc.calling_scope = EG(scope);
155
- fcc.called_scope = NULL;
156
- fcc.object_ptr = NULL;
157
-
158
- call_result = zend_call_function(&fci, &fcc TSRMLS_CC);
159
- retval = new_php_embed_value(retval_ptr);
160
-
161
- free(call_args);
162
-
163
- for(i=0; i<argc-1; ++i) {
164
- zval_dtor(zval_array[i]);
165
- FREE_ZVAL(zval_array[i]);
166
- }
167
- free(zval_array);
168
-
169
- if (FAILURE == call_result) {
170
- rb_raise(rb_ePhpEmbedStanderdError, "function call fairure");
171
- }
172
-
173
- return retval;
126
+
127
+ func = php_find_function(StringValueCStr(name));
128
+ if (!func) {
129
+ rb_raise(rb_ePhpEmbedMissingError, "function not found");
130
+ }
131
+
132
+ zval_array = (zval **)malloc(sizeof(zval *) * argc-1);
133
+ call_args = (zval ***)malloc(sizeof(zval **) * argc-1);
134
+ for(i=0; i<argc-1; ++i) {
135
+ zval_array[i] = value_to_zval(RARRAY_PTR(args)[i]);
136
+ call_args[i] = &zval_array[i];
137
+ }
138
+
139
+ fci.size = sizeof(fci);
140
+ fci.function_table = NULL;
141
+ fci.function_name = NULL;
142
+ fci.symbol_table = NULL;
143
+ fci.object_ptr = NULL;
144
+ fci.retval_ptr_ptr = &retval_ptr;
145
+ fci.param_count = argc-1;
146
+ fci.params = call_args;
147
+ fci.no_separation = 1;
148
+
149
+ fcc.initialized = 1;
150
+ fcc.function_handler = func;
151
+ fcc.calling_scope = EG(scope);
152
+ fcc.called_scope = NULL;
153
+ fcc.object_ptr = NULL;
154
+
155
+ call_result = zend_call_function(&fci, &fcc TSRMLS_CC);
156
+ retval = new_php_embed_value(retval_ptr);
157
+
158
+ free(call_args);
159
+
160
+ for(i=0; i<argc-1; ++i) {
161
+ zval_dtor(zval_array[i]);
162
+ FREE_ZVAL(zval_array[i]);
163
+ }
164
+ free(zval_array);
165
+
166
+ if (call_result == FAILURE) {
167
+ rb_raise(rb_ePhpEmbedStanderdError, "function call fairure");
168
+ }
169
+
170
+ return retval;
174
171
  }
175
172
 
176
173
  VALUE php_require(VALUE self, VALUE file) {
177
- VALUE retval = Qtrue;
178
- zend_file_handle handle;
174
+ VALUE retval = Qtrue;
175
+ zend_file_handle handle;
179
176
 
180
- if (T_STRING != TYPE(file)) {
181
- rb_raise(rb_eArgError, "file must be string");
182
- return Qnil;
183
- }
184
-
185
- handle.type = ZEND_HANDLE_FILENAME;
186
- handle.filename = RSTRING_PTR(file);
187
- handle.opened_path = NULL;
188
- handle.free_filename = 0;
189
-
190
- zend_try {
191
- zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 1, &handle);
192
- } zend_catch {
193
- retval = Qfalse;
194
- } zend_end_try();
195
-
196
- return retval;
177
+ if (TYPE(file) == T_STRING) {
178
+ rb_raise(rb_eArgError, "file must be string");
179
+ return Qnil;
180
+ }
181
+
182
+ handle.type = ZEND_HANDLE_FILENAME;
183
+ handle.filename = RSTRING_PTR(file);
184
+ handle.opened_path = NULL;
185
+ handle.free_filename = 0;
186
+
187
+ zend_try {
188
+ zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 1, &handle);
189
+ } zend_catch {
190
+ retval = Qfalse;
191
+ } zend_end_try();
192
+
193
+ return retval;
197
194
  }
198
195
 
199
196
  VALUE php_fetch_variable(VALUE self, VALUE name) {
200
- zval *data = NULL;
201
- if (FAILURE == zend_hash_find(&EG(symbol_table), StringValuePtr(name), RSTRING_LEN(name), (void **)&data)) {
202
- /* Name not found in $GLOBALS */
203
- }
204
- if (data == NULL) {
205
- /* Value is NULL (not possible for symbol_table?) */
206
- }
207
-
208
- return Qnil;
197
+ zval *data = NULL;
198
+ if (zend_hash_find(&EG(symbol_table), StringValuePtr(name), RSTRING_LEN(name), (void **)&data) == FAILURE) {
199
+ /* Name not found in $GLOBALS */
200
+ }
201
+ if (data == NULL) {
202
+ /* Value is NULL (not possible for symbol_table?) */
203
+ }
204
+
205
+ return Qnil;
209
206
  }
210
207
 
211
208
  VALUE php_set_output_handler(VALUE self, VALUE callback) {
212
- if (rb_obj_is_proc(callback)) {
213
- callback_output = callback;
214
- } else {
215
- rb_raise(rb_eArgError, "callback must be proc");
216
- }
217
-
218
- return Qnil;
209
+ if (rb_obj_is_proc(callback)) {
210
+ callback_output = callback;
211
+ } else {
212
+ rb_raise(rb_eArgError, "callback must be proc");
213
+ }
214
+
215
+ return Qnil;
219
216
  }
220
217
 
221
218
  VALUE php_set_error_handler(VALUE self, VALUE callback) {
222
- if (rb_obj_is_proc(callback)) {
223
- callback_error = callback;
224
- } else {
225
- rb_raise(rb_eArgError, "callback must be proc");
226
- }
227
-
228
- return Qnil;
219
+ if (rb_obj_is_proc(callback)) {
220
+ callback_error = callback;
221
+ } else {
222
+ rb_raise(rb_eArgError, "callback must be proc");
223
+ }
224
+
225
+ return Qnil;
229
226
  }
230
227
 
231
228
  void initialize_php_embed() {
232
- const char *argv[2] = {"ruby", NULL};
233
- php_embed_init(1, (char**)argv);
234
- EG(bailout)=NULL;
229
+ const char *argv[2] = {"ruby", NULL};
230
+ php_embed_init(1, (char **)argv PTSRMLS_CC);
231
+ EG(bailout)=NULL;
235
232
  }
236
233
 
237
234
  void shutdown_php_embed() {
238
- php_embed_shutdown(TSRMLS_C);
235
+ php_embed_shutdown(TSRMLS_C);
239
236
  }
240
237
 
241
238
 
242
239
  Init_php() {
243
-
244
- mPhpEmbed = rb_define_module("PhpEmbed");
245
-
246
- init_php_value();
247
-
248
- //rb_define_const(mPhpEmbed, "VERSION", rb_ary_new3(3, INT2FIX(0), INT2FIX(0), INT2FIX(1)));
249
-
250
- rb_define_singleton_method(mPhpEmbed, "eval", php_eval, 1);
251
- rb_define_singleton_method(mPhpEmbed, "call", php_call, -1);
252
- rb_define_singleton_method(mPhpEmbed, "require", php_require, 1);
253
- rb_define_singleton_method(mPhpEmbed, "fetchVariable", php_fetch_variable, 1);
254
- rb_define_singleton_method(mPhpEmbed, "setOutputHandler", php_set_output_handler, 1);
255
- rb_define_singleton_method(mPhpEmbed, "setErrorHandler", php_set_error_handler, 1);
256
-
257
- php_embed_module.ub_write = php_ub_write;
258
- php_embed_module.log_message = php_log_message;
259
- php_embed_module.sapi_error = php_sapi_error;
260
-
261
- initialize_php_embed();
262
- atexit(shutdown_php_embed);
263
-
264
-
265
- rb_ePhpEmbedStanderdError = rb_define_class_under(mPhpEmbed, "StanderdError", rb_eException);
266
- rb_ePhpEmbedSyntaxError = rb_define_class_under(mPhpEmbed, "SyntaxError", rb_ePhpEmbedStanderdError);
267
- rb_ePhpEmbedMissingError = rb_define_class_under(mPhpEmbed, "MissingError", rb_ePhpEmbedStanderdError);
268
- /*
269
- zend_try {
270
- zend_alter_ini_entry((char*)"display_errors", sizeof("display_errors")
271
- , (char*)"0", sizeof("0")-1, PHP_INI_SYSTEM, PHP_INI_STAGE_RUNTIME);
272
- zend_alter_ini_entry((char*)"log_errors", sizeof("log_errors")
273
- , (char*)"1", sizeof("1")-1, PHP_INI_SYSTEM, PHP_INI_STAGE_RUNTIME);
274
- } zend_catch {
275
- } zend_end_try();
276
- */
240
+ mPhpEmbed = rb_define_module("PhpEmbed");
241
+ init_php_value();
242
+
243
+ rb_define_singleton_method(mPhpEmbed, "eval", php_eval, 1);
244
+ rb_define_singleton_method(mPhpEmbed, "call", php_call, -1);
245
+ rb_define_singleton_method(mPhpEmbed, "require", php_require, 1);
246
+ rb_define_singleton_method(mPhpEmbed, "fetchVariable", php_fetch_variable, 1);
247
+ rb_define_singleton_method(mPhpEmbed, "setOutputHandler", php_set_output_handler, 1);
248
+ rb_define_singleton_method(mPhpEmbed, "setErrorHandler", php_set_error_handler, 1);
249
+
250
+ php_embed_module.ub_write = php_ub_write;
251
+ php_embed_module.log_message = php_log_message;
252
+ php_embed_module.sapi_error = php_sapi_error;
253
+
254
+ initialize_php_embed();
255
+ atexit(shutdown_php_embed);
256
+
257
+
258
+ rb_ePhpEmbedStanderdError = rb_define_class_under(mPhpEmbed, "StanderdError", rb_eException);
259
+ rb_ePhpEmbedSyntaxError = rb_define_class_under(mPhpEmbed, "SyntaxError", rb_ePhpEmbedStanderdError);
260
+ rb_ePhpEmbedMissingError = rb_define_class_under(mPhpEmbed, "MissingError", rb_ePhpEmbedStanderdError);
261
+ /*
262
+ zend_try {
263
+ zend_alter_ini_entry((char*)"display_errors", sizeof("display_errors")
264
+ , (char*)"0", sizeof("0")-1, PHP_INI_SYSTEM, PHP_INI_STAGE_RUNTIME);
265
+ zend_alter_ini_entry((char*)"log_errors", sizeof("log_errors")
266
+ , (char*)"1", sizeof("1")-1, PHP_INI_SYSTEM, PHP_INI_STAGE_RUNTIME);
267
+ } zend_catch {
268
+ } zend_end_try();
269
+ */
277
270
  }
278
-
279
-
280
-