From 3530e83bb9414c1e15e4ec6dcfac4d225b5f0f3a Mon Sep 17 00:00:00 2001 From: midoks Date: Mon, 10 Oct 2022 21:09:35 +0800 Subject: [PATCH] up --- plugins/php-apt/index.html | 39 ++++++++++ plugins/php-apt/index.py | 178 +++++++++++++++++++++++++++++++++++++++++++++ plugins/php-apt/js/php.js | 145 ++++++++++++++++++++++++++++++++++++ 3 files changed, 362 insertions(+) diff --git a/plugins/php-apt/index.html b/plugins/php-apt/index.html index 790f56c06..654c500c0 100755 --- a/plugins/php-apt/index.html +++ b/plugins/php-apt/index.html @@ -1,3 +1,41 @@ + + +
@@ -13,6 +51,7 @@

禁用函数

性能调整

负载状况

+

会话管理

FPM日志

慢日志

PHPIFNO

diff --git a/plugins/php-apt/index.py b/plugins/php-apt/index.py index af7397d5e..a5377be6f 100755 --- a/plugins/php-apt/index.py +++ b/plugins/php-apt/index.py @@ -490,6 +490,176 @@ def getFpmStatus(version): return mw.returnJson(True, "OK", data) +def getSessionConf(version): + filename = getConf(version) + if not os.path.exists(filename): + return mw.returnJson(False, '指定PHP版本不存在!') + + phpini = mw.readFile(filename) + + rep = r'session.save_handler\s*=\s*([0-9A-Za-z_& ~]+)(\s*;?|\r?\n)' + save_handler = re.search(rep, phpini) + if save_handler: + save_handler = save_handler.group(1) + else: + save_handler = "files" + + reppath = r'\nsession.save_path\s*=\s*"tcp\:\/\/([\d\.]+):(\d+).*\r?\n' + passrep = r'\nsession.save_path\s*=\s*"tcp://[\w\.\?\:]+=(.*)"\r?\n' + memcached = r'\nsession.save_path\s*=\s*"([\d\.]+):(\d+)"' + save_path = re.search(reppath, phpini) + if not save_path: + save_path = re.search(memcached, phpini) + passwd = re.search(passrep, phpini) + port = "" + if passwd: + passwd = passwd.group(1) + else: + passwd = "" + if save_path: + port = save_path.group(2) + save_path = save_path.group(1) + + else: + save_path = "" + + data = {"save_handler": save_handler, "save_path": save_path, + "passwd": passwd, "port": port} + return mw.returnJson(True, 'ok', data) + + +def setSessionConf(version): + + args = getArgs() + + ip = args['ip'] + port = args['port'] + passwd = args['passwd'] + save_handler = args['save_handler'] + + if save_handler != "file": + iprep = r"(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})\.(2(5[0-5]{1}|[0-4]\d{1})|[0-1]?\d{1,2})" + if not re.search(iprep, ip): + return mw.returnJson(False, '请输入正确的IP地址') + + try: + port = int(port) + if port >= 65535 or port < 1: + return mw.returnJson(False, '请输入正确的端口号') + except: + return mw.returnJson(False, '请输入正确的端口号') + prep = r"[\~\`\/\=]" + if re.search(prep, passwd): + return mw.returnJson(False, '请不要输入以下特殊字符 " ~ ` / = "') + + filename = getConf(version) + if not os.path.exists(filename): + return mw.returnJson(False, '指定PHP版本不存在!') + phpini = mw.readFile(filename) + + session_tmp = getServerDir() + "/tmp/session" + + rep = r'session.save_handler\s*=\s*(.+)\r?\n' + val = r'session.save_handler = ' + save_handler + '\n' + phpini = re.sub(rep, val, phpini) + + if save_handler == "memcached": + if not re.search("memcached.so", phpini): + return mw.returnJson(False, '请先安装%s扩展' % save_handler) + rep = r'\nsession.save_path\s*=\s*(.+)\r?\n' + val = r'\nsession.save_path = "%s:%s" \n' % (ip, port) + if re.search(rep, phpini): + phpini = re.sub(rep, val, phpini) + else: + phpini = re.sub('\n;session.save_path = "' + session_tmp + '"', + '\n;session.save_path = "' + session_tmp + '"' + val, phpini) + + if save_handler == "memcache": + if not re.search("memcache.so", phpini): + return mw.returnJson(False, '请先安装%s扩展' % save_handler) + rep = r'\nsession.save_path\s*=\s*(.+)\r?\n' + val = r'\nsession.save_path = "%s:%s" \n' % (ip, port) + if re.search(rep, phpini): + phpini = re.sub(rep, val, phpini) + else: + phpini = re.sub('\n;session.save_path = "' + session_tmp + '"', + '\n;session.save_path = "' + session_tmp + '"' + val, phpini) + + if save_handler == "redis": + if not re.search("redis.so", phpini): + return mw.returnJson(False, '请先安装%s扩展' % save_handler) + if passwd: + passwd = "?auth=" + passwd + else: + passwd = "" + rep = r'\nsession.save_path\s*=\s*(.+)\r?\n' + val = r'\nsession.save_path = "tcp://%s:%s%s"\n' % (ip, port, passwd) + res = re.search(rep, phpini) + if res: + phpini = re.sub(rep, val, phpini) + else: + phpini = re.sub('\n;session.save_path = "' + session_tmp + '"', + '\n;session.save_path = "' + session_tmp + '"' + val, phpini) + + if save_handler == "file": + rep = r'\nsession.save_path\s*=\s*(.+)\r?\n' + val = r'\nsession.save_path = "' + session_tmp + '"\n' + if re.search(rep, phpini): + phpini = re.sub(rep, val, phpini) + else: + phpini = re.sub('\n;session.save_path = "' + session_tmp + '"', + '\n;session.save_path = "' + session_tmp + '"' + val, phpini) + + mw.writeFile(filename, phpini) + reload(version) + return mw.returnJson(True, '设置成功!') + + +def getSessionCount_Origin(version): + session_tmp = getServerDir() + "/tmp/session" + d = [session_tmp] + count = 0 + for i in d: + if not os.path.exists(i): + mw.execShell('mkdir -p %s' % i) + list = os.listdir(i) + for l in list: + if os.path.isdir(i + "/" + l): + l1 = os.listdir(i + "/" + l) + for ll in l1: + if "sess_" in ll: + count += 1 + continue + if "sess_" in l: + count += 1 + + s = "find /tmp -mtime +1 |grep 'sess_' | wc -l" + old_file = int(mw.execShell(s)[0].split("\n")[0]) + + s = "find " + session_tmp + " -mtime +1 |grep 'sess_'|wc -l" + old_file += int(mw.execShell(s)[0].split("\n")[0]) + return {"total": count, "oldfile": old_file} + + +def getSessionCount(version): + data = getSessionCount_Origin(version) + return mw.returnJson(True, 'ok!', data) + + +def cleanSessionOld(version): + s = "find /tmp -mtime +1 |grep 'sess_'|xargs rm -f" + mw.execShell(s) + + session_tmp = getServerDir() + "/tmp/session" + s = "find " + session_tmp + " -mtime +1 |grep 'sess_' |xargs rm -f" + mw.execShell(s) + old_file_conf = getSessionCount_Origin(version)["oldfile"] + if old_file_conf == 0: + return mw.returnJson(True, '清理成功') + else: + return mw.returnJson(True, '清理失败') + + def getDisableFunc(version): filename = getConf(version) if not os.path.exists(filename): @@ -688,6 +858,14 @@ if __name__ == "__main__": print(setFpmConfig(version)) elif func == 'get_fpm_status': print(getFpmStatus(version)) + elif func == 'get_session_conf': + print(getSessionConf(version)) + elif func == 'set_session_conf': + print(setSessionConf(version)) + elif func == 'get_session_count': + print(getSessionCount(version)) + elif func == 'clean_session_old': + print(cleanSessionOld(version)) elif func == 'get_disable_func': print(getDisableFunc(version)) elif func == 'set_disable_func': diff --git a/plugins/php-apt/js/php.js b/plugins/php-apt/js/php.js index fd6e14003..9b20f6f98 100755 --- a/plugins/php-apt/js/php.js +++ b/plugins/php-apt/js/php.js @@ -368,6 +368,151 @@ function disableFunc(version) { $(".soft-man-con").html(con); }); } + + + +function getSessionConfig(version){ + phpPost('get_session_conf', version, '', function(ret_data){ + var rdata = $.parseJSON(ret_data.data); + if(!rdata.status){ + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + return; + } + var rdata = rdata.data; + + var cacheList = "" + + "" + + "" + + ""; + + + var info = rdata.save_path.split(":"); + var con = "
" + + "

存储模式:

" + + "

IP地址:

" + + "

端口:

" + + "

密码:

" + + "

" + + "
\ +
    \ +
  • 若你的站点并发比较高,使用Redis,Memcache能有效提升PHP并发能力
  • \ +
  • 若调整Session模式后,网站访问异常,请切换回原来的模式
  • \ +
  • 切换Session模式会使在线的用户会话丢失,请在流量小的时候切换
  • \ +
\ +
\ +
\ +
"; + + $(".soft-man-con").html(con); + + if (rdata.save_handler == 'file'){ + $('input[name="ip"]').attr('disabled','disabled'); + $('input[name="port"]').attr('disabled','disabled'); + $('input[name="passwd"]').attr('placeholder','如果没有密码留空'); + $('input[name="passwd"]').attr('disabled','disabled'); + } + + // change event + $("select[name='save_handler']").change(function() { + var type = $(this).val(); + + var passwd = $('input[name="passwd"]').val(); + if (passwd == ""){ + $('input[name="passwd"]').attr('placeholder','如果没有密码留空'); + } + + var ip = $('input[name="ip"]').val(); + if (ip == ""){ + $('input[name="ip"]').val('127.0.0.1'); + } + + switch (type) { + case 'redis': + var port = $('input[name="port"]').val(); + if (port == ""){ + $('input[name="port"]').val('6379'); + } + $('input[name="ip"]').removeAttr('disabled'); + $('input[name="port"]').removeAttr('disabled'); + $('input[name="passwd"]').removeAttr('disabled'); + break; + case 'file': + $('input[name="ip"]').val("").attr('disabled','disabled'); + $('input[name="port"]').val("").attr('disabled','disabled'); + $('input[name="passwd"]').val("").attr('disabled','disabled'); + break; + case 'memcache': + var port = $('input[name="port"]').val(); + if (port == ""){ + $('input[name="port"]').val('11211'); + } + $('input[name="ip"]').removeAttr('disabled'); + $('input[name="port"]').removeAttr('disabled'); + $('input[name="passwd"]').removeAttr('disabled'); + break; + case 'memcached': + var port = $('input[name="port"]').val(); + if (port == ""){ + $('input[name="port"]').val('11211'); + } + $('input[name="ip"]').removeAttr('disabled'); + $('input[name="port"]').removeAttr('disabled'); + $('input[name="passwd"]').removeAttr('disabled'); + break; + } + }); + + //load session stats + phpPost('get_session_count', version, '', function(ret_data){ + var rdata = $.parseJSON(ret_data.data); + if(!rdata.status){ + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + return; + } + var rdata = rdata.data; + + var html_var = "
清理Session文件
\ +
\ +
\ +
总Session文件数量"+rdata.total+"
\ +
可清理的Session文件数量"+rdata.oldfile+"
\ +
\ + "; + + $("#session_clear").html(html_var); + + + $('#clean_func').click(function(){ + phpPost('clean_session_old', version, '', function(ret_data){ + var rdata = $.parseJSON(ret_data.data); + showMsg(rdata.msg,function(){ + getSessionConfig(version); + },{ icon: rdata.status ? 1 : 2 }); + }); + }); + }); + }); + +} + +function setSessionConfig(version){ + var ip = $('input[name="ip"]').val(); + var port = $('input[name="port"]').val(); + var passwd = $('input[name="passwd"]').val(); + var save_handler = $("select[name='save_handler']").val(); + var data = { + ip:ip, + port:port, + passwd:passwd, + save_handler:save_handler, + }; + phpPost('set_session_conf', version, data, function(ret_data){ + var rdata = $.parseJSON(ret_data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + }); +} + + //设置禁用函数 function setDisableFunc(version, act, fs) { var fsArr = fs.split(',');