diff --git a/plugins/php-yum/index.html b/plugins/php-yum/index.html index 3b4957222..8c3e3b32b 100755 --- a/plugins/php-yum/index.html +++ b/plugins/php-yum/index.html @@ -1,3 +1,40 @@ + +
@@ -13,6 +50,7 @@

禁用函数

性能调整

负载状况

+

会话管理

FPM日志

慢日志

PHPIFNO

diff --git a/plugins/php-yum/index.py b/plugins/php-yum/index.py index e99c25867..8f9183497 100755 --- a/plugins/php-yum/index.py +++ b/plugins/php-yum/index.py @@ -492,6 +492,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): @@ -689,6 +859,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-yum/js/php.js b/plugins/php-yum/js/php.js index e059e3a36..332158bbd 100755 --- a/plugins/php-yum/js/php.js +++ b/plugins/php-yum/js/php.js @@ -340,6 +340,147 @@ function getFpmStatus(version){ }); } +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地址:

" + + "

端口:

" + + "

密码:

" + + "

" + + "
\ + \ +
\ +
\ +
"; + + $(".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 disableFunc(version) { phpPost('get_disable_func', version,'',function(data){ diff --git a/plugins/php/js/php.js b/plugins/php/js/php.js index c76991e8a..1ba06775b 100755 --- a/plugins/php/js/php.js +++ b/plugins/php/js/php.js @@ -444,7 +444,9 @@ function getSessionConfig(version){ $('#clean_func').click(function(){ phpPost('clean_session_old', version, '', function(ret_data){ var rdata = $.parseJSON(ret_data.data); - layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + showMsg(rdata.msg,function(){ + getSessionConfig(version); + },{ icon: rdata.status ? 1 : 2 }); }); }); });