blob: fabd98975df5ff780f7212f7077d93f0cf8f01ea [file] [log] [blame]
Craig Tiller1a61b172015-02-16 11:53:47 -08001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Craig Tiller1a61b172015-02-16 11:53:47 -08004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Craig Tiller1a61b172015-02-16 11:53:47 -08008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Craig Tiller1a61b172015-02-16 11:53:47 -080010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Craig Tiller1a61b172015-02-16 11:53:47 -080016 *
17 */
18
thinkerou771c2052018-05-15 10:37:43 +080019#include "php_grpc.h"
20
mlumishb892a272014-12-09 16:28:23 -080021#include "call.h"
22#include "channel.h"
23#include "server.h"
mlumishb892a272014-12-09 16:28:23 -080024#include "timeval.h"
Stanley Cheung9c0b35e2015-10-21 17:07:56 -070025#include "channel_credentials.h"
Stanley Cheungaeea1022015-10-21 17:00:49 -070026#include "call_credentials.h"
mlumishb892a272014-12-09 16:28:23 -080027#include "server_credentials.h"
murgatroid99268acd52015-05-14 15:05:00 -070028#include "completion_queue.h"
mlumishb892a272014-12-09 16:28:23 -080029
Stanley Cheung5d559482017-08-22 13:15:01 -070030ZEND_DECLARE_MODULE_GLOBALS(grpc)
31static PHP_GINIT_FUNCTION(grpc);
ZhouyihaiDing5c770352018-04-09 13:20:31 -070032HashTable grpc_persistent_list;
ZhouyihaiDing9ef881e2018-04-12 16:43:33 -070033HashTable grpc_target_upper_bound_map;
mlumishb892a272014-12-09 16:28:23 -080034/* {{{ grpc_functions[]
35 *
36 * Every user visible function must have an entry in grpc_functions[].
37 */
38const zend_function_entry grpc_functions[] = {
Craig Tillerb5dcec52015-01-13 11:13:42 -080039 PHP_FE_END /* Must be the last line in grpc_functions[] */
mlumishb892a272014-12-09 16:28:23 -080040};
41/* }}} */
42
43/* {{{ grpc_module_entry
44 */
45zend_module_entry grpc_module_entry = {
thinkeroua3730b72016-07-20 16:59:54 +080046 STANDARD_MODULE_HEADER,
thinkeroua3730b72016-07-20 16:59:54 +080047 "grpc",
48 grpc_functions,
49 PHP_MINIT(grpc),
50 PHP_MSHUTDOWN(grpc),
Stanley Cheung5d559482017-08-22 13:15:01 -070051 PHP_RINIT(grpc),
thinkeroua3730b72016-07-20 16:59:54 +080052 NULL,
53 PHP_MINFO(grpc),
thinkeroua3730b72016-07-20 16:59:54 +080054 PHP_GRPC_VERSION,
Stanley Cheung5d559482017-08-22 13:15:01 -070055 PHP_MODULE_GLOBALS(grpc),
56 PHP_GINIT(grpc),
57 NULL,
58 NULL,
59 STANDARD_MODULE_PROPERTIES_EX};
mlumishb892a272014-12-09 16:28:23 -080060/* }}} */
61
62#ifdef COMPILE_DL_GRPC
63ZEND_GET_MODULE(grpc)
64#endif
65
66/* {{{ PHP_INI
67 */
68/* Remove comments and fill if you need to have entries in php.ini
thinkeroua3730b72016-07-20 16:59:54 +080069 PHP_INI_BEGIN()
70 STD_PHP_INI_ENTRY("grpc.global_value", "42", PHP_INI_ALL, OnUpdateLong,
71 global_value, zend_grpc_globals, grpc_globals)
72 STD_PHP_INI_ENTRY("grpc.global_string", "foobar", PHP_INI_ALL,
73 OnUpdateString, global_string, zend_grpc_globals,
74 grpc_globals)
75 PHP_INI_END()
mlumishb892a272014-12-09 16:28:23 -080076*/
77/* }}} */
78
79/* {{{ php_grpc_init_globals
80 */
81/* Uncomment this function if you have INI entries
thinkeroua3730b72016-07-20 16:59:54 +080082 static void php_grpc_init_globals(zend_grpc_globals *grpc_globals)
83 {
84 grpc_globals->global_value = 0;
85 grpc_globals->global_string = NULL;
86 }
mlumishb892a272014-12-09 16:28:23 -080087*/
88/* }}} */
89
90/* {{{ PHP_MINIT_FUNCTION
91 */
Craig Tillerb5dcec52015-01-13 11:13:42 -080092PHP_MINIT_FUNCTION(grpc) {
93 /* If you have INI entries, uncomment these lines
thinkeroua3730b72016-07-20 16:59:54 +080094 REGISTER_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -080095 */
96 /* Register call error constants */
Hannes Magnussonbd52ac42015-10-06 15:26:41 -070097 REGISTER_LONG_CONSTANT("Grpc\\CALL_OK", GRPC_CALL_OK,
98 CONST_CS | CONST_PERSISTENT);
99 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR", GRPC_CALL_ERROR,
100 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800101 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700102 GRPC_CALL_ERROR_NOT_ON_SERVER,
103 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800104 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700105 GRPC_CALL_ERROR_NOT_ON_CLIENT,
106 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800107 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_INVOKED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700108 GRPC_CALL_ERROR_ALREADY_INVOKED,
109 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800110 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_INVOKED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700111 GRPC_CALL_ERROR_NOT_INVOKED,
112 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800113 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_FINISHED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700114 GRPC_CALL_ERROR_ALREADY_FINISHED,
115 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800116 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_TOO_MANY_OPERATIONS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700117 GRPC_CALL_ERROR_TOO_MANY_OPERATIONS,
118 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800119 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_INVALID_FLAGS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700120 GRPC_CALL_ERROR_INVALID_FLAGS,
121 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800122
Craig Tillerb5dcec52015-01-13 11:13:42 -0800123 /* Register flag constants */
124 REGISTER_LONG_CONSTANT("Grpc\\WRITE_BUFFER_HINT", GRPC_WRITE_BUFFER_HINT,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700125 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800126 REGISTER_LONG_CONSTANT("Grpc\\WRITE_NO_COMPRESS", GRPC_WRITE_NO_COMPRESS,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700127 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800128
Craig Tillerb5dcec52015-01-13 11:13:42 -0800129 /* Register status constants */
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700130 REGISTER_LONG_CONSTANT("Grpc\\STATUS_OK", GRPC_STATUS_OK,
131 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800132 REGISTER_LONG_CONSTANT("Grpc\\STATUS_CANCELLED", GRPC_STATUS_CANCELLED,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700133 CONST_CS | CONST_PERSISTENT);
134 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNKNOWN", GRPC_STATUS_UNKNOWN,
135 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800136 REGISTER_LONG_CONSTANT("Grpc\\STATUS_INVALID_ARGUMENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700137 GRPC_STATUS_INVALID_ARGUMENT,
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700138 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800139 REGISTER_LONG_CONSTANT("Grpc\\STATUS_DEADLINE_EXCEEDED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700140 GRPC_STATUS_DEADLINE_EXCEEDED,
141 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800142 REGISTER_LONG_CONSTANT("Grpc\\STATUS_NOT_FOUND", GRPC_STATUS_NOT_FOUND,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700143 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800144 REGISTER_LONG_CONSTANT("Grpc\\STATUS_ALREADY_EXISTS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700145 GRPC_STATUS_ALREADY_EXISTS,
146 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800147 REGISTER_LONG_CONSTANT("Grpc\\STATUS_PERMISSION_DENIED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700148 GRPC_STATUS_PERMISSION_DENIED,
149 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800150 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAUTHENTICATED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700151 GRPC_STATUS_UNAUTHENTICATED,
152 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800153 REGISTER_LONG_CONSTANT("Grpc\\STATUS_RESOURCE_EXHAUSTED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700154 GRPC_STATUS_RESOURCE_EXHAUSTED,
155 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800156 REGISTER_LONG_CONSTANT("Grpc\\STATUS_FAILED_PRECONDITION",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700157 GRPC_STATUS_FAILED_PRECONDITION,
158 CONST_CS | CONST_PERSISTENT);
159 REGISTER_LONG_CONSTANT("Grpc\\STATUS_ABORTED", GRPC_STATUS_ABORTED,
160 CONST_CS | CONST_PERSISTENT);
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700161 REGISTER_LONG_CONSTANT("Grpc\\STATUS_OUT_OF_RANGE",
162 GRPC_STATUS_OUT_OF_RANGE,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700163 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800164 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNIMPLEMENTED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700165 GRPC_STATUS_UNIMPLEMENTED,
166 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800167 REGISTER_LONG_CONSTANT("Grpc\\STATUS_INTERNAL", GRPC_STATUS_INTERNAL,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700168 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800169 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAVAILABLE", GRPC_STATUS_UNAVAILABLE,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700170 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800171 REGISTER_LONG_CONSTANT("Grpc\\STATUS_DATA_LOSS", GRPC_STATUS_DATA_LOSS,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700172 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800173
murgatroid99afd541c2015-03-03 18:16:09 -0800174 /* Register op type constants */
175 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_INITIAL_METADATA",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700176 GRPC_OP_SEND_INITIAL_METADATA,
177 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800178 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_MESSAGE",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700179 GRPC_OP_SEND_MESSAGE,
180 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800181 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_CLOSE_FROM_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700182 GRPC_OP_SEND_CLOSE_FROM_CLIENT,
183 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800184 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_STATUS_FROM_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700185 GRPC_OP_SEND_STATUS_FROM_SERVER,
186 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800187 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_INITIAL_METADATA",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700188 GRPC_OP_RECV_INITIAL_METADATA,
189 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800190 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_MESSAGE",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700191 GRPC_OP_RECV_MESSAGE,
192 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800193 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_STATUS_ON_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700194 GRPC_OP_RECV_STATUS_ON_CLIENT,
195 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800196 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_CLOSE_ON_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700197 GRPC_OP_RECV_CLOSE_ON_SERVER,
198 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800199
Stanley Cheunge63354a2015-08-10 15:46:42 -0700200 /* Register connectivity state constants */
201 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_IDLE",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700202 GRPC_CHANNEL_IDLE,
203 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700204 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_CONNECTING",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700205 GRPC_CHANNEL_CONNECTING,
206 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700207 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_READY",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700208 GRPC_CHANNEL_READY,
209 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700210 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_TRANSIENT_FAILURE",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700211 GRPC_CHANNEL_TRANSIENT_FAILURE,
212 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700213 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_FATAL_FAILURE",
Craig Tiller48ed92e2016-06-02 11:07:12 -0700214 GRPC_CHANNEL_SHUTDOWN,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700215 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700216
Craig Tillerb5dcec52015-01-13 11:13:42 -0800217 grpc_init_call(TSRMLS_C);
Stanley Cheung5b3dc4a2017-08-03 18:00:25 -0700218 GRPC_STARTUP(channel);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800219 grpc_init_server(TSRMLS_C);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800220 grpc_init_timeval(TSRMLS_C);
Stanley Cheungaeea1022015-10-21 17:00:49 -0700221 grpc_init_channel_credentials(TSRMLS_C);
222 grpc_init_call_credentials(TSRMLS_C);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800223 grpc_init_server_credentials(TSRMLS_C);
224 return SUCCESS;
mlumishb892a272014-12-09 16:28:23 -0800225}
226/* }}} */
227
228/* {{{ PHP_MSHUTDOWN_FUNCTION
229 */
Craig Tillerb5dcec52015-01-13 11:13:42 -0800230PHP_MSHUTDOWN_FUNCTION(grpc) {
231 /* uncomment this line if you have INI entries
thinkeroua3730b72016-07-20 16:59:54 +0800232 UNREGISTER_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800233 */
Stanley Cheung8b249082016-06-29 15:13:06 -0700234 // WARNING: This function IS being called by PHP when the extension
235 // is unloaded but the logs were somehow suppressed.
Stanley Cheung5d559482017-08-22 13:15:01 -0700236 if (GRPC_G(initialized)) {
ZhouyihaiDing5c770352018-04-09 13:20:31 -0700237 zend_hash_clean(&grpc_persistent_list);
238 zend_hash_destroy(&grpc_persistent_list);
ZhouyihaiDing9ef881e2018-04-12 16:43:33 -0700239 zend_hash_clean(&grpc_target_upper_bound_map);
240 zend_hash_destroy(&grpc_target_upper_bound_map);
Stanley Cheung5d559482017-08-22 13:15:01 -0700241 grpc_shutdown_timeval(TSRMLS_C);
242 grpc_php_shutdown_completion_queue(TSRMLS_C);
243 grpc_shutdown();
244 GRPC_G(initialized) = 0;
245 }
Craig Tillerb5dcec52015-01-13 11:13:42 -0800246 return SUCCESS;
mlumishb892a272014-12-09 16:28:23 -0800247}
248/* }}} */
249
250/* {{{ PHP_MINFO_FUNCTION
251 */
Craig Tillerb5dcec52015-01-13 11:13:42 -0800252PHP_MINFO_FUNCTION(grpc) {
253 php_info_print_table_start();
ZhouyihaiDinge2af6d92017-12-08 09:49:55 -0800254 php_info_print_table_row(2, "grpc support", "enabled");
255 php_info_print_table_row(2, "grpc module version", PHP_GRPC_VERSION);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800256 php_info_print_table_end();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800257 /* Remove comments if you have entries in php.ini
thinkeroua3730b72016-07-20 16:59:54 +0800258 DISPLAY_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800259 */
mlumishb892a272014-12-09 16:28:23 -0800260}
261/* }}} */
Stanley Cheung5d559482017-08-22 13:15:01 -0700262
263/* {{{ PHP_RINIT_FUNCTION
264 */
265PHP_RINIT_FUNCTION(grpc) {
266 if (!GRPC_G(initialized)) {
267 grpc_init();
268 grpc_php_init_completion_queue(TSRMLS_C);
269 GRPC_G(initialized) = 1;
270 }
271 return SUCCESS;
272}
273/* }}} */
274
275/* {{{ PHP_GINIT_FUNCTION
276 */
277static PHP_GINIT_FUNCTION(grpc) {
278 grpc_globals->initialized = 0;
279}
280/* }}} */
281
mlumishb892a272014-12-09 16:28:23 -0800282/* The previous line is meant for vim and emacs, so it can correctly fold and
283 unfold functions in source code. See the corresponding marks just before
284 function definition, where the functions purpose is also documented. Please
285 follow this convention for the convenience of others editing your code.
286*/