Le démarrage du service dépend du processus. Il est créé avec swoole_server dans le processus. La fonction d'alias dans le code source est swoole_server_create. Le type de sock_type par défaut est tcp. mode.
long sock_type = SW_SOCK_TCP; long serv_port; long serv_mode = SW_MODE_PROCESS;
Allouez la mémoire du swServer et initialisez-le
swServer_init(serv);
Principalement factory_mode, numéro de réacteur réacteur_num, mode de distribution dispatch_mode, taille du tampon en anneau ringbuffer_size, délai d'attente (composé de timeout_sec et timeout_usec) et processus de travail Nombre de work_num, nombre maximum de connexions max_connection, nombre maximum de requêtes max_request, informations de configuration du service http_server, temps d'inactivité du battement de coeur heartbeat_idel_time et intervalle de vérification heartbeat_check_interval, tailles d'entrée et de sortie du tampon buffer_input_size et buffer_output_size et taille du cache du pipeline.
swoole_init(); bzero(serv, sizeof(swServer)); serv->factory_mode = SW_MODE_BASE; serv->reactor_num = SW_REACTOR_NUM > SW_REACTOR_MAX_THREAD ? SW_REACTOR_MAX_THREAD : SW_REACTOR_NUM; serv->dispatch_mode = SW_DISPATCH_FDMOD; serv->ringbuffer_size = SW_QUEUE_SIZE; serv->timeout_sec = SW_REACTOR_TIMEO_SEC; serv->timeout_usec = SW_REACTOR_TIMEO_USEC; //300ms; serv->worker_num = SW_CPU_NUM; serv->max_connection = SwooleG.max_sockets; serv->max_request = 0; //http server serv->http_parse_post = 1; serv->upload_tmp_dir = "/tmp"; //heartbeat check serv->heartbeat_idle_time = SW_HEARTBEAT_IDLE; serv->heartbeat_check_interval = SW_HEARTBEAT_CHECK; serv->buffer_input_size = SW_BUFFER_INPUT_SIZE; serv->buffer_output_size = SW_BUFFER_OUTPUT_SIZE; serv->pipe_buffer_size = SW_PIPE_BUFFER_SIZE; SwooleG.serv = serv;
En même temps, analysez l'adresse IP de l'hôte du service, le numéro de port, le mode de service et le type de sock_type, et ajoutez les informations sur le port d'écoute du serveur à la liste Listen_list swServer_add_port.
//create server socket int sock = swSocket_create(ls->type); if (sock < 0) { swSysError("create socket failed."); return NULL; } //bind address and port if (swSocket_bind(sock, ls->type, ls->host, ls->port) < 0) { return NULL; } //dgram socket, setting socket buffer size if (swSocket_is_dgram(ls->type)) { setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &ls->socket_buffer_size, sizeof(int)); setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &ls->socket_buffer_size, sizeof(int)); } //O_NONBLOCK & O_CLOEXEC swoole_fcntl_set_option(sock, 1, 1); ls->sock = sock; if (swSocket_is_dgram(ls->type)) { serv->have_udp_sock = 1; serv->dgram_port_num++; if (ls->type == SW_SOCK_UDP) { serv->udp_socket_ipv4 = sock; } else if (ls->type == SW_SOCK_UDP6) { serv->udp_socket_ipv6 = sock; } } else { serv->have_tcp_sock = 1; } LL_APPEND(serv->listen_list, ls); serv->listen_port_num++;
Utilisez swoole_server->start pour démarrer (swoole_server_start), Enregistrez des rappels par défaut et personnalisés, enregistrez l'initialisation et implémentez l'initialisation d'usine en fonction du mode de service (php_swoole_server_before_start).
La fonction de démarrage de l'usine créera plusieurs processus ou processus uniques, threads ou threads (swServer_create) selon le mode de service.
Selon l'utilisation ou non d'openssl pour lire le fichier de certificat, l'activation ou non du mode gardien pour initialiser le journal et activer le gardien. swServer_start_proxy crée main_reactor, qui est responsable du traitement du socket d'écoute et de la création du thread du réacteur.
(Apprentissage recommandé : tutoriel vidéo swoole)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!