$funcname(); unset($funcname); } } unset($i); //system('sync && echo 3 > /proc/sys/vm/drop_caches'); $___TEMP_tiused = get_script_runtime($___TEMP_EXEC_START_TIME); __SOCKET_DEBUGLOG__("执行完成。核心占用时间 " . $___TEMP_tiused . " 秒。"); } } //现在待处理队列为空 $___TEMP_runned_time = time() - $___TEMP_server_start_time; if ($___TEMP_runned_time + $___MOD_SRV_WAKETIME + 5 > $___TEMP_max_time) { //没有下一次唤醒了,主动退出 __SOCKET_LOG__("已经运行了 " . $___TEMP_runned_time . "秒。主动退出。"); __SERVER_QUIT__(); } else { if ($___TEMP_runned_time + $___MOD_SRV_WAKETIME * 2 + 5 > $___TEMP_max_time && !$___TEMP_newsrv_flag) { //老server即将在下一次唤醒时主动退出,发信息给脚本启动一台新server。 if ($___TEMP_runned_time - $___TEMP_last_cmd <= $___MOD_VANISH_TIME || $___TEMP_is_root) { __SOCKET_LOG__("已经运行了 " . $___TEMP_runned_time . "秒,稍后将退出,已请求脚本启动新服务器。"); $___TEMP_newsrv_flag = 1; if ($___TEMP_is_root) { touch(GAME_ROOT . './gamedata/tmp/server/request_new_root_server'); } else { touch(GAME_ROOT . './gamedata/tmp/server/request_new_server'); } } } } //进入闲置状态
function __SOCKET_LOAD_DATA__(&$___TEMP_connection) { // 从客户端取得信息 if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_connection, 'r', 0, 200000)) { __SOCKET_WARNLOG__("警告:socket_read等待时间过长。结束流程。"); return false; } $___TEMP_socket_data = @socket_read($___TEMP_connection, 1024, PHP_NORMAL_READ); __SOCKET_DEBUGLOG__("已读取信息。"); $___TEMP_socket_data = substr($___TEMP_socket_data, 0, -1); //去掉换行 global $___MOD_CONN_PASSWD; if (substr($___TEMP_socket_data, 0, strlen($___MOD_CONN_PASSWD)) != $___MOD_CONN_PASSWD) { __SOCKET_WARNLOG__("警告:连接密码错误。其提供的连接密码为 " . substr($___TEMP_socket_data, 0, strlen($___MOD_CONN_PASSWD)) . " 。结束流程。"); return false; } $___TEMP_socket_data = substr($___TEMP_socket_data, strlen($___MOD_CONN_PASSWD)); if ($___TEMP_socket_data == 'stop') { __SOCKET_LOG__("收到指令要求退出,紧急退出。"); __SERVER_QUIT__(); } if ($___TEMP_socket_data == 'touch') { __SOCKET_DEBUGLOG__("收到了测试命令。"); global $___TEMP_is_root; if (!$___TEMP_is_root) { $x = 'Received'; } else { $x = 'Received_root'; } if (!__SOCKET_CHECK_WITH_TIMEOUT__($___TEMP_connection, 'w', 0, 200000)) { __SOCKET_WARNLOG__("警告:socket_write等待时间过长。结束流程。"); } else { if (!socket_write($___TEMP_connection, $x . "\n")) { __SOCKET_WARNLOG__("警告:socket_write失败。结束流程。"); } } return false; } global $___MOD_CONN_W_DB; global $___TEMP_tablepre, $___TEMP_db; $___TEMP_PLAYER_CMD = NULL; if ($___MOD_CONN_W_DB) { $result = $___TEMP_db->query("SELECT value FROM {$___TEMP_tablepre}temp WHERE sid='{$___TEMP_socket_data}'"); if (!$___TEMP_db->num_rows($result)) { __SOCKET_WARNLOG__("警告:数据库中没有记录名为 {$___TEMP_socket_data} 的记录。结束流程。"); return false; } $x = $___TEMP_db->fetch_array($result); $x = $x['value']; $x = base64_decode($x); } else { global $___MOD_TMP_FILE_DIRECTORY; if (!file_exists($___MOD_TMP_FILE_DIRECTORY . $___TEMP_socket_data)) { __SOCKET_WARNLOG__("警告:文件 {$___TEMP_socket_data} 不存在。结束流程。"); return false; } $x = file_get_contents($___MOD_TMP_FILE_DIRECTORY . $___TEMP_socket_data); } __SOCKET_DEBUGLOG__("已读取信息文件。"); eval('$___TEMP_PLAYER_CMD=' . $x . ';'); __SOCKET_DEBUGLOG__("已载入信息文件。"); global $___LOCAL_INPUT__VARS__INPUT_VAR_LIST; $___LOCAL_INPUT__VARS__INPUT_VAR_LIST = array(); foreach ($___TEMP_PLAYER_CMD as $key => $value) { $___LOCAL_INPUT__VARS__INPUT_VAR_LIST[$key] = $value; } //其他模块都已经在上次执行完成后重新初始化过了,现在只需初始化一下SYS模块即可(这是因为SYS模块的信息是需要不断更新的) global $___TEMP_MOD_LIST_n, $___TEMP_MOD_NAME; for ($i = 1; $i <= $___TEMP_MOD_LIST_n; $i++) { if (strtoupper($___TEMP_MOD_NAME[$i]) == 'SYS') { $funcname = $___TEMP_MOD_NAME[$i] . '\\___pre_init'; $funcname(); $funcname = $___TEMP_MOD_NAME[$i] . '\\init'; $funcname(); $funcname = $___TEMP_MOD_NAME[$i] . '\\___post_init'; $funcname(); } } __SOCKET_DEBUGLOG__("初始化信息成功。开始执行。"); return $___TEMP_socket_data; }