blob: 5971babc00e0d1a21edd7178c30843d7902052aa [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
mlumishb892a272014-12-09 16:28:23 -080019#include "call.h"
20#include "channel.h"
21#include "server.h"
mlumishb892a272014-12-09 16:28:23 -080022#include "timeval.h"
Stanley Cheung9c0b35e2015-10-21 17:07:56 -070023#include "channel_credentials.h"
Stanley Cheungaeea1022015-10-21 17:00:49 -070024#include "call_credentials.h"
mlumishb892a272014-12-09 16:28:23 -080025#include "server_credentials.h"
murgatroid99268acd52015-05-14 15:05:00 -070026#include "completion_queue.h"
mlumishb892a272014-12-09 16:28:23 -080027
28#ifdef HAVE_CONFIG_H
29#include "config.h"
30#endif
31
murgatroid998242ba72015-04-01 15:29:44 -070032#include <php.h>
33#include <php_ini.h>
34#include <ext/standard/info.h>
mlumishb892a272014-12-09 16:28:23 -080035#include "php_grpc.h"
36
Stanley Cheung5d559482017-08-22 13:15:01 -070037ZEND_DECLARE_MODULE_GLOBALS(grpc)
38static PHP_GINIT_FUNCTION(grpc);
mlumishb892a272014-12-09 16:28:23 -080039
40/* {{{ grpc_functions[]
41 *
42 * Every user visible function must have an entry in grpc_functions[].
43 */
44const zend_function_entry grpc_functions[] = {
Craig Tillerb5dcec52015-01-13 11:13:42 -080045 PHP_FE_END /* Must be the last line in grpc_functions[] */
mlumishb892a272014-12-09 16:28:23 -080046};
47/* }}} */
48
49/* {{{ grpc_module_entry
50 */
51zend_module_entry grpc_module_entry = {
thinkeroua3730b72016-07-20 16:59:54 +080052 STANDARD_MODULE_HEADER,
thinkeroua3730b72016-07-20 16:59:54 +080053 "grpc",
54 grpc_functions,
55 PHP_MINIT(grpc),
56 PHP_MSHUTDOWN(grpc),
Stanley Cheung5d559482017-08-22 13:15:01 -070057 PHP_RINIT(grpc),
thinkeroua3730b72016-07-20 16:59:54 +080058 NULL,
59 PHP_MINFO(grpc),
thinkeroua3730b72016-07-20 16:59:54 +080060 PHP_GRPC_VERSION,
Stanley Cheung5d559482017-08-22 13:15:01 -070061 PHP_MODULE_GLOBALS(grpc),
62 PHP_GINIT(grpc),
63 NULL,
64 NULL,
65 STANDARD_MODULE_PROPERTIES_EX};
mlumishb892a272014-12-09 16:28:23 -080066/* }}} */
67
68#ifdef COMPILE_DL_GRPC
69ZEND_GET_MODULE(grpc)
70#endif
71
72/* {{{ PHP_INI
73 */
74/* Remove comments and fill if you need to have entries in php.ini
thinkeroua3730b72016-07-20 16:59:54 +080075 PHP_INI_BEGIN()
76 STD_PHP_INI_ENTRY("grpc.global_value", "42", PHP_INI_ALL, OnUpdateLong,
77 global_value, zend_grpc_globals, grpc_globals)
78 STD_PHP_INI_ENTRY("grpc.global_string", "foobar", PHP_INI_ALL,
79 OnUpdateString, global_string, zend_grpc_globals,
80 grpc_globals)
81 PHP_INI_END()
mlumishb892a272014-12-09 16:28:23 -080082*/
83/* }}} */
84
85/* {{{ php_grpc_init_globals
86 */
87/* Uncomment this function if you have INI entries
thinkeroua3730b72016-07-20 16:59:54 +080088 static void php_grpc_init_globals(zend_grpc_globals *grpc_globals)
89 {
90 grpc_globals->global_value = 0;
91 grpc_globals->global_string = NULL;
92 }
mlumishb892a272014-12-09 16:28:23 -080093*/
94/* }}} */
95
96/* {{{ PHP_MINIT_FUNCTION
97 */
Craig Tillerb5dcec52015-01-13 11:13:42 -080098PHP_MINIT_FUNCTION(grpc) {
99 /* If you have INI entries, uncomment these lines
thinkeroua3730b72016-07-20 16:59:54 +0800100 REGISTER_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800101 */
102 /* Register call error constants */
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700103 REGISTER_LONG_CONSTANT("Grpc\\CALL_OK", GRPC_CALL_OK,
104 CONST_CS | CONST_PERSISTENT);
105 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR", GRPC_CALL_ERROR,
106 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800107 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700108 GRPC_CALL_ERROR_NOT_ON_SERVER,
109 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800110 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_ON_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700111 GRPC_CALL_ERROR_NOT_ON_CLIENT,
112 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800113 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_INVOKED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700114 GRPC_CALL_ERROR_ALREADY_INVOKED,
115 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800116 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_NOT_INVOKED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700117 GRPC_CALL_ERROR_NOT_INVOKED,
118 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800119 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_ALREADY_FINISHED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700120 GRPC_CALL_ERROR_ALREADY_FINISHED,
121 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800122 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_TOO_MANY_OPERATIONS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700123 GRPC_CALL_ERROR_TOO_MANY_OPERATIONS,
124 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800125 REGISTER_LONG_CONSTANT("Grpc\\CALL_ERROR_INVALID_FLAGS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700126 GRPC_CALL_ERROR_INVALID_FLAGS,
127 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800128
Craig Tillerb5dcec52015-01-13 11:13:42 -0800129 /* Register flag constants */
130 REGISTER_LONG_CONSTANT("Grpc\\WRITE_BUFFER_HINT", GRPC_WRITE_BUFFER_HINT,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700131 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800132 REGISTER_LONG_CONSTANT("Grpc\\WRITE_NO_COMPRESS", GRPC_WRITE_NO_COMPRESS,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700133 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800134
Craig Tillerb5dcec52015-01-13 11:13:42 -0800135 /* Register status constants */
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700136 REGISTER_LONG_CONSTANT("Grpc\\STATUS_OK", GRPC_STATUS_OK,
137 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800138 REGISTER_LONG_CONSTANT("Grpc\\STATUS_CANCELLED", GRPC_STATUS_CANCELLED,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700139 CONST_CS | CONST_PERSISTENT);
140 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNKNOWN", GRPC_STATUS_UNKNOWN,
141 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800142 REGISTER_LONG_CONSTANT("Grpc\\STATUS_INVALID_ARGUMENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700143 GRPC_STATUS_INVALID_ARGUMENT,
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700144 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800145 REGISTER_LONG_CONSTANT("Grpc\\STATUS_DEADLINE_EXCEEDED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700146 GRPC_STATUS_DEADLINE_EXCEEDED,
147 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800148 REGISTER_LONG_CONSTANT("Grpc\\STATUS_NOT_FOUND", GRPC_STATUS_NOT_FOUND,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700149 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800150 REGISTER_LONG_CONSTANT("Grpc\\STATUS_ALREADY_EXISTS",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700151 GRPC_STATUS_ALREADY_EXISTS,
152 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800153 REGISTER_LONG_CONSTANT("Grpc\\STATUS_PERMISSION_DENIED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700154 GRPC_STATUS_PERMISSION_DENIED,
155 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800156 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAUTHENTICATED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700157 GRPC_STATUS_UNAUTHENTICATED,
158 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800159 REGISTER_LONG_CONSTANT("Grpc\\STATUS_RESOURCE_EXHAUSTED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700160 GRPC_STATUS_RESOURCE_EXHAUSTED,
161 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800162 REGISTER_LONG_CONSTANT("Grpc\\STATUS_FAILED_PRECONDITION",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700163 GRPC_STATUS_FAILED_PRECONDITION,
164 CONST_CS | CONST_PERSISTENT);
165 REGISTER_LONG_CONSTANT("Grpc\\STATUS_ABORTED", GRPC_STATUS_ABORTED,
166 CONST_CS | CONST_PERSISTENT);
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700167 REGISTER_LONG_CONSTANT("Grpc\\STATUS_OUT_OF_RANGE",
168 GRPC_STATUS_OUT_OF_RANGE,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700169 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800170 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNIMPLEMENTED",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700171 GRPC_STATUS_UNIMPLEMENTED,
172 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800173 REGISTER_LONG_CONSTANT("Grpc\\STATUS_INTERNAL", GRPC_STATUS_INTERNAL,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700174 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800175 REGISTER_LONG_CONSTANT("Grpc\\STATUS_UNAVAILABLE", GRPC_STATUS_UNAVAILABLE,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700176 CONST_CS | CONST_PERSISTENT);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800177 REGISTER_LONG_CONSTANT("Grpc\\STATUS_DATA_LOSS", GRPC_STATUS_DATA_LOSS,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700178 CONST_CS | CONST_PERSISTENT);
mlumishb892a272014-12-09 16:28:23 -0800179
murgatroid99afd541c2015-03-03 18:16:09 -0800180 /* Register op type constants */
181 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_INITIAL_METADATA",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700182 GRPC_OP_SEND_INITIAL_METADATA,
183 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800184 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_MESSAGE",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700185 GRPC_OP_SEND_MESSAGE,
186 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800187 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_CLOSE_FROM_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700188 GRPC_OP_SEND_CLOSE_FROM_CLIENT,
189 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800190 REGISTER_LONG_CONSTANT("Grpc\\OP_SEND_STATUS_FROM_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700191 GRPC_OP_SEND_STATUS_FROM_SERVER,
192 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800193 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_INITIAL_METADATA",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700194 GRPC_OP_RECV_INITIAL_METADATA,
195 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800196 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_MESSAGE",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700197 GRPC_OP_RECV_MESSAGE,
198 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800199 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_STATUS_ON_CLIENT",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700200 GRPC_OP_RECV_STATUS_ON_CLIENT,
201 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800202 REGISTER_LONG_CONSTANT("Grpc\\OP_RECV_CLOSE_ON_SERVER",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700203 GRPC_OP_RECV_CLOSE_ON_SERVER,
204 CONST_CS | CONST_PERSISTENT);
murgatroid99afd541c2015-03-03 18:16:09 -0800205
Stanley Cheunge63354a2015-08-10 15:46:42 -0700206 /* Register connectivity state constants */
207 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_IDLE",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700208 GRPC_CHANNEL_IDLE,
209 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700210 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_CONNECTING",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700211 GRPC_CHANNEL_CONNECTING,
212 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700213 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_READY",
Stanley Cheung6d3f9ac2015-10-07 13:42:10 -0700214 GRPC_CHANNEL_READY,
215 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700216 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_TRANSIENT_FAILURE",
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700217 GRPC_CHANNEL_TRANSIENT_FAILURE,
218 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700219 REGISTER_LONG_CONSTANT("Grpc\\CHANNEL_FATAL_FAILURE",
Craig Tiller48ed92e2016-06-02 11:07:12 -0700220 GRPC_CHANNEL_SHUTDOWN,
Hannes Magnussonbd52ac42015-10-06 15:26:41 -0700221 CONST_CS | CONST_PERSISTENT);
Stanley Cheunge63354a2015-08-10 15:46:42 -0700222
Craig Tillerb5dcec52015-01-13 11:13:42 -0800223 grpc_init_call(TSRMLS_C);
Stanley Cheung5b3dc4a2017-08-03 18:00:25 -0700224 GRPC_STARTUP(channel);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800225 grpc_init_server(TSRMLS_C);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800226 grpc_init_timeval(TSRMLS_C);
Stanley Cheungaeea1022015-10-21 17:00:49 -0700227 grpc_init_channel_credentials(TSRMLS_C);
228 grpc_init_call_credentials(TSRMLS_C);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800229 grpc_init_server_credentials(TSRMLS_C);
230 return SUCCESS;
mlumishb892a272014-12-09 16:28:23 -0800231}
232/* }}} */
233
234/* {{{ PHP_MSHUTDOWN_FUNCTION
235 */
Craig Tillerb5dcec52015-01-13 11:13:42 -0800236PHP_MSHUTDOWN_FUNCTION(grpc) {
237 /* uncomment this line if you have INI entries
thinkeroua3730b72016-07-20 16:59:54 +0800238 UNREGISTER_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800239 */
Stanley Cheung8b249082016-06-29 15:13:06 -0700240 // WARNING: This function IS being called by PHP when the extension
241 // is unloaded but the logs were somehow suppressed.
Stanley Cheung5d559482017-08-22 13:15:01 -0700242 if (GRPC_G(initialized)) {
243 grpc_shutdown_timeval(TSRMLS_C);
244 grpc_php_shutdown_completion_queue(TSRMLS_C);
245 grpc_shutdown();
246 GRPC_G(initialized) = 0;
247 }
Craig Tillerb5dcec52015-01-13 11:13:42 -0800248 return SUCCESS;
mlumishb892a272014-12-09 16:28:23 -0800249}
250/* }}} */
251
252/* {{{ PHP_MINFO_FUNCTION
253 */
Craig Tillerb5dcec52015-01-13 11:13:42 -0800254PHP_MINFO_FUNCTION(grpc) {
255 php_info_print_table_start();
ZhouyihaiDinge2af6d92017-12-08 09:49:55 -0800256 php_info_print_table_row(2, "grpc support", "enabled");
257 php_info_print_table_row(2, "grpc module version", PHP_GRPC_VERSION);
Craig Tillerb5dcec52015-01-13 11:13:42 -0800258 php_info_print_table_end();
mlumishb892a272014-12-09 16:28:23 -0800259
Craig Tillerb5dcec52015-01-13 11:13:42 -0800260 /* Remove comments if you have entries in php.ini
thinkeroua3730b72016-07-20 16:59:54 +0800261 DISPLAY_INI_ENTRIES();
Craig Tillerb5dcec52015-01-13 11:13:42 -0800262 */
mlumishb892a272014-12-09 16:28:23 -0800263}
264/* }}} */
Stanley Cheung5d559482017-08-22 13:15:01 -0700265
266/* {{{ PHP_RINIT_FUNCTION
267 */
268PHP_RINIT_FUNCTION(grpc) {
269 if (!GRPC_G(initialized)) {
270 grpc_init();
271 grpc_php_init_completion_queue(TSRMLS_C);
272 GRPC_G(initialized) = 1;
273 }
274 return SUCCESS;
275}
276/* }}} */
277
278/* {{{ PHP_GINIT_FUNCTION
279 */
280static PHP_GINIT_FUNCTION(grpc) {
281 grpc_globals->initialized = 0;
282}
283/* }}} */
284
mlumishb892a272014-12-09 16:28:23 -0800285/* The previous line is meant for vim and emacs, so it can correctly fold and
286 unfold functions in source code. See the corresponding marks just before
287 function definition, where the functions purpose is also documented. Please
288 follow this convention for the convenience of others editing your code.
289*/