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