1 /* 2 +----------------------------------------------------------------------+ 3 | Swoole | 4 +----------------------------------------------------------------------+ 5 | Copyright (c) 2012-2015 The Swoole Group | 6 +----------------------------------------------------------------------+ 7 | This source file is subject to version 2.0 of the Apache license, | 8 | that is bundled with this package in the file LICENSE, and is | 9 | available through the world-wide-web at the following url: | 10 | http://www.apache.org/licenses/LICENSE-2.0.html | 11 | If you did not receive a copy of the Apache2.0 license and are unable| 12 | to obtain it through the world-wide-web, please send a note to | 13 | license@swoole.com so we can mail you a copy immediately. | 14 +----------------------------------------------------------------------+ 15 | Author: Tianfeng Han <mikan.tenny@gmail.com> | 16 +----------------------------------------------------------------------+ 17 */ 18 19 #pragma once 20 21 #include "php_swoole_cxx.h" 22 #include "swoole_server.h" 23 24 #include <unordered_map> 25 #include <list> 26 #include <vector> 27 28 //-------------------------------------------------------- 29 enum php_swoole_server_callback_type { 30 SW_SERVER_CB_onStart, // master 31 SW_SERVER_CB_onBeforeShutdown, // master 32 SW_SERVER_CB_onShutdown, // master 33 SW_SERVER_CB_onWorkerStart, // worker(event & task) 34 SW_SERVER_CB_onWorkerStop, // worker(event & task) 35 SW_SERVER_CB_onBeforeReload, // manager 36 SW_SERVER_CB_onAfterReload, // manager 37 SW_SERVER_CB_onTask, // worker(task) 38 SW_SERVER_CB_onFinish, // worker(event & task) 39 SW_SERVER_CB_onWorkerExit, // worker(event) 40 SW_SERVER_CB_onWorkerError, // manager 41 SW_SERVER_CB_onManagerStart, // manager 42 SW_SERVER_CB_onManagerStop, // manager 43 SW_SERVER_CB_onPipeMessage, // worker(event & task) 44 }; 45 //-------------------------------------------------------- 46 enum php_swoole_server_port_callback_type { 47 SW_SERVER_CB_onConnect, // stream, worker(event) 48 SW_SERVER_CB_onReceive, // stream, worker(event) 49 SW_SERVER_CB_onClose, // stream, worker(event) 50 SW_SERVER_CB_onPacket, // dgram, worker(event) 51 SW_SERVER_CB_onRequest, // http, worker(event) 52 SW_SERVER_CB_onHandShake, // websocket, worker(event) 53 SW_SERVER_CB_onOpen, // websocket, worker(event) 54 SW_SERVER_CB_onMessage, // websocket, worker(event) 55 SW_SERVER_CB_onDisconnect, // websocket (non websocket connection), worker(event) 56 SW_SERVER_CB_onBufferFull, // worker(event) 57 SW_SERVER_CB_onBufferEmpty, // worker(event) 58 }; 59 60 #define PHP_SWOOLE_SERVER_CALLBACK_NUM (SW_SERVER_CB_onPipeMessage + 1) 61 #define PHP_SWOOLE_SERVER_PORT_CALLBACK_NUM (SW_SERVER_CB_onBufferEmpty + 1) 62 63 namespace swoole { 64 struct TaskCo; 65 66 struct ServerPortProperty { 67 zval *callbacks[PHP_SWOOLE_SERVER_PORT_CALLBACK_NUM]; 68 zend_fcall_info_cache *caches[PHP_SWOOLE_SERVER_PORT_CALLBACK_NUM]; 69 zval _callbacks[PHP_SWOOLE_SERVER_PORT_CALLBACK_NUM]; 70 Server *serv; 71 ListenPort *port; 72 zval *zsetting; 73 }; 74 75 struct ServerProperty { 76 std::vector<zval *> ports; 77 std::vector<zval *> user_processes; 78 ServerPortProperty *primary_port; 79 zend_fcall_info_cache *callbacks[PHP_SWOOLE_SERVER_CALLBACK_NUM]; 80 std::unordered_map<TaskId, zend_fcall_info_cache> task_callbacks; 81 std::unordered_map<TaskId, TaskCo *> task_coroutine_map; 82 std::unordered_map<SessionId, std::list<Coroutine *> *> send_coroutine_map; 83 std::vector<zend_fcall_info_cache *> command_callbacks; 84 }; 85 86 struct ServerObject { 87 Server *serv; 88 ServerProperty *property; 89 zend_object std; 90 get_ceServerObject91 zend_class_entry *get_ce() { 92 return Z_OBJCE_P(get_object()); 93 } 94 get_objectServerObject95 zval *get_object() { 96 return (zval *) serv->private_data_2; 97 } 98 isset_callbackServerObject99 bool isset_callback(ListenPort *port, int event_type) { 100 ServerPortProperty *port_property = (ServerPortProperty *) port->ptr; 101 return (port_property->callbacks[event_type] || property->primary_port->callbacks[event_type]); 102 } 103 is_websocket_serverServerObject104 zend_bool is_websocket_server() { 105 return instanceof_function(get_ce(), swoole_websocket_server_ce); 106 } 107 is_http_serverServerObject108 zend_bool is_http_server() { 109 return instanceof_function(get_ce(), swoole_http_server_ce); 110 } 111 is_redis_serverServerObject112 zend_bool is_redis_server() { 113 return instanceof_function(get_ce(), swoole_redis_server_ce); 114 } 115 116 void register_callback(); 117 void on_before_start(); 118 }; 119 120 struct TaskCo { 121 Coroutine *co; 122 int *list; 123 uint32_t count; 124 zval *result; 125 }; 126 void register_admin_server_commands(Server *serv); 127 } // namespace swoole 128 129 void php_swoole_server_register_callbacks(swServer *serv); 130 zend_fcall_info_cache *php_swoole_server_get_fci_cache(swServer *serv, int server_fd, int event_type); 131 int php_swoole_create_dir(const char *path, size_t length); 132 void php_swoole_server_before_start(swServer *serv, zval *zobject); 133 bool php_swoole_server_isset_callback(swServer *serv, swListenPort *port, int event_type); 134 void php_swoole_http_server_init_global_variant(); 135 void php_swoole_server_send_yield(swServer *serv, swoole::SessionId sesion_id, zval *zdata, zval *return_value); 136 void php_swoole_get_recv_data(swServer *serv, zval *zdata, swRecvData *req); 137 void php_swoole_server_onConnect(swServer *, swDataHead *); 138 int php_swoole_server_onReceive(swServer *, swRecvData *); 139 int php_swoole_http_server_onReceive(swServer *, swRecvData *); 140 int php_swoole_redis_server_onReceive(swServer *serv, swRecvData *req); 141 int php_swoole_server_onPacket(swServer *, swRecvData *); 142 void php_swoole_server_onClose(swServer *, swDataHead *); 143 void php_swoole_server_onBufferFull(swServer *, swDataHead *); 144 void php_swoole_server_onBufferEmpty(swServer *, swDataHead *); 145 146 swServer *php_swoole_server_get_and_check_server(zval *zobject); 147 void php_swoole_server_port_deref(zend_object *object); 148 swoole::ServerObject *php_swoole_server_get_zend_object(swoole::Server *serv); 149 zval *php_swoole_server_get_zval_object(swoole::Server *serv); 150