mirror of https://github.com/midoks/mdserver-web
parent
a97ba2fa71
commit
b14be16f1d
@ -0,0 +1,53 @@ |
|||||||
|
#! /bin/sh |
||||||
|
export PATH=$PATH:/opt/local/bin:/opt/local/sbin:/opt/local/share/man:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin |
||||||
|
DIR=$(cd "$(dirname "$0")"; pwd) |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# cd /www/server/mdserver-web/scripts/quick && bash debug.sh |
||||||
|
# cd /www/server/mdserver-web/plugins/php && bash all_test.sh |
||||||
|
|
||||||
|
|
||||||
|
# cd /www/server/mdserver-web/plugins/php && bash install.sh install 71 |
||||||
|
# cd /www/server/mdserver-web/plugins/php/versions/52/ && bash gd.sh install 52 |
||||||
|
|
||||||
|
# cd /www/server/mdserver-web/plugins/php/versions/52/ && bash openssl.sh install 52 |
||||||
|
# cd /www/server/mdserver-web/plugins/php/versions/81/ && bash imagemagick.sh install 81 |
||||||
|
# cd /www/server/mdserver-web/plugins/php/versions/70/ && bash imagemagick.sh install 70 |
||||||
|
|
||||||
|
PHP_VER=71 |
||||||
|
echo "php${PHP_VER} -- start" |
||||||
|
cmd_ext=$(ls -l $DIR/versions/$PHP_VER/ |awk '{print $9}') |
||||||
|
cd $DIR && /bin/bash install.sh install $PHP_VER |
||||||
|
for ii in $cmd_ext |
||||||
|
do |
||||||
|
if [ "install.sh" == "$ii" ];then |
||||||
|
echo '' > /tmp/t.log |
||||||
|
else |
||||||
|
cd $DIR/versions/$PHP_VER && /bin/bash $ii install $PHP_VER |
||||||
|
fi |
||||||
|
done |
||||||
|
echo "php${PHP_VER} -- end" |
||||||
|
|
||||||
|
|
||||||
|
PHP_VER_LIST=(53 54 55 56 70 71 72 73 74 80 81) |
||||||
|
# PHP_VER_LIST=(81) |
||||||
|
for PHP_VER in ${PHP_VER_LIST[@]}; do |
||||||
|
echo "php${PHP_VER} -- start" |
||||||
|
if [ -d /www/server/php/${PHP_VER} ];then |
||||||
|
cmd_ext=$(ls -l $DIR/versions/$PHP_VER/ |awk '{print $9}') |
||||||
|
for ii in $cmd_ext |
||||||
|
do |
||||||
|
echo "${ii}" |
||||||
|
if [ "install.sh" == "$ii" ];then |
||||||
|
echo '' > /tmp/t.log |
||||||
|
else |
||||||
|
cd $DIR/versions/$PHP_VER/ && bash $ii install ${PHP_VER} |
||||||
|
fi |
||||||
|
done |
||||||
|
fi |
||||||
|
echo "php${PHP_VER} -- end" |
||||||
|
done |
||||||
|
|
||||||
|
|
||||||
|
rm -rf /tmp/t.log |
@ -0,0 +1,9 @@ |
|||||||
|
set $PHP_ENV 1; |
||||||
|
location ~ [^/]\.php(/|$) |
||||||
|
{ |
||||||
|
try_files $uri =404; |
||||||
|
fastcgi_pass unix:/var/opt/remi/php{$PHP_VERSION}/run/php-fpm/www.sock; |
||||||
|
fastcgi_index index.php; |
||||||
|
include fastcgi.conf; |
||||||
|
include {$SERVER_PATH}/web_conf/php/pathinfo.conf; |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
set $real_script_name $fastcgi_script_name; |
||||||
|
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { |
||||||
|
set $real_script_name $1; |
||||||
|
set $path_info $2; |
||||||
|
} |
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; |
||||||
|
fastcgi_param SCRIPT_NAME $real_script_name; |
||||||
|
fastcgi_param PATH_INFO $path_info; |
@ -0,0 +1,5 @@ |
|||||||
|
location /phpfpm_status_yum{$PHP_VERSION} { |
||||||
|
fastcgi_pass unix:/var/opt/remi/php{$PHP_VERSION}/run/php-fpm/www.sock; |
||||||
|
include fastcgi_params; |
||||||
|
fastcgi_param SCRIPT_FILENAME \$fastcgi_script_name; |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
location /{$PHP_VERSION} { |
||||||
|
root {$ROOT_PATH}/phpinfo; |
||||||
|
include {$SERVER_PATH}/web_conf/php/conf/enable-php-yum{$PHP_VERSION}.conf; |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
[www] |
||||||
|
user = {$PHP_USER} |
||||||
|
group = {$PHP_GROUP} |
||||||
|
|
||||||
|
listen = /var/opt/remi/php{$PHP_VERSION}/run/php-fpm/www.sock |
||||||
|
listen.owner = {$PHP_USER} |
||||||
|
listen.group = {$PHP_GROUP} |
||||||
|
pm = dynamic |
||||||
|
pm.max_children = 50 |
||||||
|
pm.start_servers = 5 |
||||||
|
pm.min_spare_servers = 5 |
||||||
|
pm.max_spare_servers = 35 |
||||||
|
pm.status_path = /phpfpm_status_yum{$PHP_VERSION} |
||||||
|
request_terminate_timeout = 100 |
||||||
|
request_slowlog_timeout = 30 |
||||||
|
slowlog = /var/opt/remi/php{$PHP_VERSION}/log/php-fpm/www-slow.log |
||||||
|
|
||||||
|
php_admin_flag[log_errors] = on |
||||||
|
php_admin_value[error_log] = /var/opt/remi/php{$PHP_VERSION}/log/php-fpm/error.log |
After Width: | Height: | Size: 785 B |
@ -0,0 +1,30 @@ |
|||||||
|
<div class="bt-form"> |
||||||
|
<div class='plugin_version'></div> |
||||||
|
<div class="bt-w-main"> |
||||||
|
<div class="bt-w-menu"> |
||||||
|
<p class="bgw" onclick="pluginService('php-apt', $('.plugin_version').attr('version'));">服务</p> |
||||||
|
<p onclick="pluginInitD('php-apt', $('.plugin_version').attr('version'));">自启动</p> |
||||||
|
<p onclick="phpLibConfig($('.plugin_version').attr('version'));">安装扩展</p> |
||||||
|
<p onclick="phpSetConfig($('.plugin_version').attr('version'));">配置修改</p> |
||||||
|
<p onclick="phpUploadLimitReq($('.plugin_version').attr('version'));">上传限制</p> |
||||||
|
<p onclick="phpTimeLimitReq($('.plugin_version').attr('version'));">超时限制</p> |
||||||
|
<p onclick="pluginConfig('php-apt', $('.plugin_version').attr('version'));">配置文件</p> |
||||||
|
<p onclick="pluginConfig('php-apt', $('.plugin_version').attr('version'),'get_fpm_conf_file');">FPM配置</p> |
||||||
|
<p onclick="disableFunc($('.plugin_version').attr('version'));">禁用函数</p> |
||||||
|
<p onclick="getFpmConfig($('.plugin_version').attr('version'));">性能调整</p> |
||||||
|
<p onclick="getFpmStatus($('.plugin_version').attr('version'));">负载状况</p> |
||||||
|
<p onclick="pluginLogs('php-apt',$('.plugin_version').attr('version'),'fpm_log');">FPM日志</p> |
||||||
|
<p onclick="pluginLogs('php-apt',$('.plugin_version').attr('version'),'fpm_slow_log');">慢日志</p> |
||||||
|
<p onclick="getPhpinfo($('.plugin_version').attr('version'));">PHPIFNO</p> |
||||||
|
</div> |
||||||
|
<div class="bt-w-con pd15"> |
||||||
|
<div class="soft-man-con"></div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
</div> |
||||||
|
<script type="text/javascript"> |
||||||
|
$.getScript( "/plugins/file?name=php-apt&f=js/php.js", function(){ |
||||||
|
pluginService('php-apt', $('.plugin_version').attr('version')); |
||||||
|
}); |
||||||
|
</script> |
@ -0,0 +1,714 @@ |
|||||||
|
# coding:utf-8 |
||||||
|
|
||||||
|
import sys |
||||||
|
import io |
||||||
|
import os |
||||||
|
import time |
||||||
|
import re |
||||||
|
import json |
||||||
|
import shutil |
||||||
|
|
||||||
|
|
||||||
|
sys.path.append(os.getcwd() + "/class/core") |
||||||
|
import mw |
||||||
|
|
||||||
|
if mw.isAppleSystem(): |
||||||
|
cmd = 'ls /usr/local/lib/ | grep python | cut -d \\ -f 1 | awk \'END {print}\'' |
||||||
|
info = mw.execShell(cmd) |
||||||
|
p = "/usr/local/lib/" + info[0].strip() + "/site-packages" |
||||||
|
sys.path.append(p) |
||||||
|
|
||||||
|
app_debug = False |
||||||
|
if mw.isAppleSystem(): |
||||||
|
app_debug = True |
||||||
|
|
||||||
|
|
||||||
|
def getPluginName(): |
||||||
|
return 'php-apt' |
||||||
|
|
||||||
|
|
||||||
|
def getServerDir(): |
||||||
|
return '/etc/opt/remi' |
||||||
|
|
||||||
|
|
||||||
|
def getPluginDir(): |
||||||
|
return mw.getPluginDir() + '/' + getPluginName() |
||||||
|
|
||||||
|
|
||||||
|
def getArgs(): |
||||||
|
args = sys.argv[3:] |
||||||
|
tmp = {} |
||||||
|
args_len = len(args) |
||||||
|
|
||||||
|
if args_len == 1: |
||||||
|
t = args[0].strip('{').strip('}') |
||||||
|
t = t.split(':') |
||||||
|
tmp[t[0]] = t[1] |
||||||
|
elif args_len > 1: |
||||||
|
for i in range(len(args)): |
||||||
|
t = args[i].split(':') |
||||||
|
tmp[t[0]] = t[1] |
||||||
|
|
||||||
|
return tmp |
||||||
|
|
||||||
|
|
||||||
|
def checkArgs(data, ck=[]): |
||||||
|
for i in range(len(ck)): |
||||||
|
if not ck[i] in data: |
||||||
|
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!')) |
||||||
|
return (True, mw.returnJson(True, 'ok')) |
||||||
|
|
||||||
|
|
||||||
|
def getConf(version): |
||||||
|
path = getServerDir() + '/php' + version + '/php.ini' |
||||||
|
return path |
||||||
|
|
||||||
|
|
||||||
|
def status(version): |
||||||
|
# ps -ef|grep 'php/81' |grep -v grep | grep -v python | awk '{print $2} |
||||||
|
cmd = "ps -ef|grep 'remi/php" + version + \ |
||||||
|
"' |grep -v grep | grep -v python | awk '{print $2}'" |
||||||
|
data = mw.execShell(cmd) |
||||||
|
if data[0] == '': |
||||||
|
return 'stop' |
||||||
|
return 'start' |
||||||
|
|
||||||
|
|
||||||
|
def contentReplace(content, version): |
||||||
|
service_path = mw.getServerDir() |
||||||
|
content = content.replace('{$ROOT_PATH}', mw.getRootDir()) |
||||||
|
content = content.replace('{$SERVER_PATH}', service_path) |
||||||
|
content = content.replace('{$PHP_VERSION}', version) |
||||||
|
content = content.replace('{$LOCAL_IP}', mw.getLocalIp()) |
||||||
|
|
||||||
|
if mw.isAppleSystem(): |
||||||
|
# user = mw.execShell( |
||||||
|
# "who | sed -n '2, 1p' |awk '{print $1}'")[0].strip() |
||||||
|
content = content.replace('{$PHP_USER}', 'nobody') |
||||||
|
content = content.replace('{$PHP_GROUP}', 'nobody') |
||||||
|
|
||||||
|
rep = 'listen.owner\s*=\s*(.+)\r?\n' |
||||||
|
val = ';listen.owner = nobody\n' |
||||||
|
content = re.sub(rep, val, content) |
||||||
|
|
||||||
|
rep = 'listen.group\s*=\s*(.+)\r?\n' |
||||||
|
val = ';listen.group = nobody\n' |
||||||
|
content = re.sub(rep, val, content) |
||||||
|
|
||||||
|
rep = 'user\s*=\s*(.+)\r?\n' |
||||||
|
val = ';user = nobody\n' |
||||||
|
content = re.sub(rep, val, content) |
||||||
|
|
||||||
|
rep = r'[^\.]group\s*=\s*(.+)\r?\n' |
||||||
|
val = ';group = nobody\n' |
||||||
|
content = re.sub(rep, val, content) |
||||||
|
|
||||||
|
else: |
||||||
|
content = content.replace('{$PHP_USER}', 'www') |
||||||
|
content = content.replace('{$PHP_GROUP}', 'www') |
||||||
|
return content |
||||||
|
|
||||||
|
|
||||||
|
def makeOpenrestyConf(version): |
||||||
|
|
||||||
|
sdir = mw.getServerDir() |
||||||
|
d_pathinfo = sdir + '/web_conf/php/pathinfo.conf' |
||||||
|
if not os.path.exists(d_pathinfo): |
||||||
|
s_pathinfo = getPluginDir() + '/conf/pathinfo.conf' |
||||||
|
shutil.copyfile(s_pathinfo, d_pathinfo) |
||||||
|
|
||||||
|
dst_dir = sdir + '/web_conf/php' |
||||||
|
dst_dir_conf = sdir + '/web_conf/php/conf' |
||||||
|
dst_dir_status = sdir + '/web_conf/php/status' |
||||||
|
if not os.path.exists(dst_dir): |
||||||
|
mw.execShell('mkdir -p ' + dst_dir) |
||||||
|
|
||||||
|
if not os.path.exists(dst_dir_conf): |
||||||
|
mw.execShell('mkdir -p ' + dst_dir_conf) |
||||||
|
|
||||||
|
if not os.path.exists(dst_dir_status): |
||||||
|
mw.execShell('mkdir -p ' + dst_dir_status) |
||||||
|
|
||||||
|
info = getPluginDir() + '/info.json' |
||||||
|
content = mw.readFile(info) |
||||||
|
content = json.loads(content) |
||||||
|
versions = content['versions'] |
||||||
|
tpl = getPluginDir() + '/conf/enable-php.conf' |
||||||
|
tpl_content = mw.readFile(tpl) |
||||||
|
dfile = sdir + '/web_conf/php/conf/enable-php-yum' + version + '.conf' |
||||||
|
if not os.path.exists(dfile): |
||||||
|
w_content = contentReplace(tpl_content, version) |
||||||
|
mw.writeFile(dfile, w_content) |
||||||
|
|
||||||
|
# php-fpm status |
||||||
|
dfile = sdir + '/web_conf/php/status/phpfpm_status_yum' + version + '.conf' |
||||||
|
tpl = getPluginDir() + '/conf/phpfpm_status.conf' |
||||||
|
if not os.path.exists(dfile): |
||||||
|
content = mw.readFile(tpl) |
||||||
|
content = contentReplace(content, version) |
||||||
|
mw.writeFile(dfile, content) |
||||||
|
|
||||||
|
|
||||||
|
def phpFpmWwwReplace(version): |
||||||
|
service_php_fpm_dir = getServerDir() + '/php' + version + '/php-fpm.d/' |
||||||
|
if not os.path.exists(service_php_fpm_dir): |
||||||
|
os.mkdir(service_php_fpm_dir) |
||||||
|
|
||||||
|
service_php_fpmwww = service_php_fpm_dir + '/www.conf' |
||||||
|
if os.path.exists(service_php_fpmwww): |
||||||
|
# 原来文件备份 |
||||||
|
mw.execShell('mv ' + service_php_fpmwww + |
||||||
|
' ' + service_php_fpmwww + '.bak') |
||||||
|
|
||||||
|
service_php_fpm_mw = service_php_fpm_dir + '/mw.conf' |
||||||
|
if not os.path.exists(service_php_fpm_mw): |
||||||
|
tpl_php_fpmwww = getPluginDir() + '/conf/www.conf' |
||||||
|
content = mw.readFile(tpl_php_fpmwww) |
||||||
|
content = contentReplace(content, version) |
||||||
|
mw.writeFile(service_php_fpm_mw, content) |
||||||
|
|
||||||
|
|
||||||
|
def getFpmConfFile(version): |
||||||
|
return getServerDir() + '/php' + version + '/php-fpm.d/mw.conf' |
||||||
|
|
||||||
|
|
||||||
|
def deleteConfList(version): |
||||||
|
sdir = mw.getServerDir() |
||||||
|
enable_conf = sdir + '/web_conf/php/conf/enable-php-yum' + version + '.conf' |
||||||
|
status_conf = sdir + '/web_conf/php/status/phpfpm_status_yum' + version + '.conf' |
||||||
|
|
||||||
|
clist = (status_conf, enable_conf) |
||||||
|
for f in clist: |
||||||
|
if os.path.exists(f): |
||||||
|
os.remove(f) |
||||||
|
|
||||||
|
|
||||||
|
def initReplace(version): |
||||||
|
makeOpenrestyConf(version) |
||||||
|
phpFpmWwwReplace(version) |
||||||
|
|
||||||
|
# systemd |
||||||
|
# mw.execShell('systemctl daemon-reload') |
||||||
|
return 'ok' |
||||||
|
|
||||||
|
|
||||||
|
def phpOp(version, method): |
||||||
|
if method == 'start': |
||||||
|
initReplace(version) |
||||||
|
|
||||||
|
if mw.isAppleSystem(): |
||||||
|
return 'fail' |
||||||
|
data = mw.execShell('systemctl ' + method + ' ' + |
||||||
|
'php' + version + '-php-fpm') |
||||||
|
if data[1] == '': |
||||||
|
return 'ok' |
||||||
|
return data[1] |
||||||
|
|
||||||
|
|
||||||
|
def start(version): |
||||||
|
return phpOp(version, 'start') |
||||||
|
|
||||||
|
|
||||||
|
def stop(version): |
||||||
|
status = phpOp(version, 'stop') |
||||||
|
deleteConfList(version) |
||||||
|
return status |
||||||
|
|
||||||
|
|
||||||
|
def restart(version): |
||||||
|
return phpOp(version, 'restart') |
||||||
|
|
||||||
|
|
||||||
|
def reload(version): |
||||||
|
return phpOp(version, 'reload') |
||||||
|
|
||||||
|
|
||||||
|
def initdStatus(version): |
||||||
|
if mw.isAppleSystem(): |
||||||
|
return "Apple Computer does not support" |
||||||
|
|
||||||
|
shell_cmd = 'systemctl status php' + version + \ |
||||||
|
'-php-fpm | grep loaded | grep "enabled;"' |
||||||
|
data = mw.execShell(shell_cmd) |
||||||
|
if data[0] == '': |
||||||
|
return 'fail' |
||||||
|
return 'ok' |
||||||
|
|
||||||
|
|
||||||
|
def initdInstall(version): |
||||||
|
if mw.isAppleSystem(): |
||||||
|
return "Apple Computer does not support" |
||||||
|
|
||||||
|
mw.execShell('systemctl enable php' + version + '-php-fpm') |
||||||
|
return 'ok' |
||||||
|
|
||||||
|
|
||||||
|
def initdUinstall(version): |
||||||
|
if mw.isAppleSystem(): |
||||||
|
return "Apple Computer does not support" |
||||||
|
|
||||||
|
mw.execShell('systemctl disable php' + version + '-php-fpm') |
||||||
|
return 'ok' |
||||||
|
|
||||||
|
|
||||||
|
def fpmLog(version): |
||||||
|
return '/var/opt/remi/php' + version + '/log/php-fpm/error.log' |
||||||
|
|
||||||
|
|
||||||
|
def fpmSlowLog(version): |
||||||
|
return '/var/opt/remi/php' + version + '/log/php-fpm/www-slow.log' |
||||||
|
|
||||||
|
|
||||||
|
def getPhpConf(version): |
||||||
|
gets = [ |
||||||
|
{'name': 'short_open_tag', 'type': 1, 'ps': '短标签支持'}, |
||||||
|
{'name': 'asp_tags', 'type': 1, 'ps': 'ASP标签支持'}, |
||||||
|
{'name': 'max_execution_time', 'type': 2, 'ps': '最大脚本运行时间'}, |
||||||
|
{'name': 'max_input_time', 'type': 2, 'ps': '最大输入时间'}, |
||||||
|
{'name': 'max_input_vars', 'type': 2, 'ps': '最大输入数量'}, |
||||||
|
{'name': 'memory_limit', 'type': 2, 'ps': '脚本内存限制'}, |
||||||
|
{'name': 'post_max_size', 'type': 2, 'ps': 'POST数据最大尺寸'}, |
||||||
|
{'name': 'file_uploads', 'type': 1, 'ps': '是否允许上传文件'}, |
||||||
|
{'name': 'upload_max_filesize', 'type': 2, 'ps': '允许上传文件的最大尺寸'}, |
||||||
|
{'name': 'max_file_uploads', 'type': 2, 'ps': '允许同时上传文件的最大数量'}, |
||||||
|
{'name': 'default_socket_timeout', 'type': 2, 'ps': 'Socket超时时间'}, |
||||||
|
{'name': 'error_reporting', 'type': 3, 'ps': '错误级别'}, |
||||||
|
{'name': 'display_errors', 'type': 1, 'ps': '是否输出详细错误信息'}, |
||||||
|
{'name': 'cgi.fix_pathinfo', 'type': 0, 'ps': '是否开启pathinfo'}, |
||||||
|
{'name': 'date.timezone', 'type': 3, 'ps': '时区'} |
||||||
|
] |
||||||
|
phpini = mw.readFile(getConf(version)) |
||||||
|
result = [] |
||||||
|
for g in gets: |
||||||
|
rep = g['name'] + '\s*=\s*([0-9A-Za-z_& ~]+)(\s*;?|\r?\n)' |
||||||
|
tmp = re.search(rep, phpini) |
||||||
|
if not tmp: |
||||||
|
continue |
||||||
|
g['value'] = tmp.groups()[0] |
||||||
|
result.append(g) |
||||||
|
return mw.getJson(result) |
||||||
|
|
||||||
|
|
||||||
|
def submitPhpConf(version): |
||||||
|
gets = ['display_errors', 'cgi.fix_pathinfo', 'date.timezone', 'short_open_tag', |
||||||
|
'asp_tags', 'max_execution_time', 'max_input_time', 'max_input_vars', 'memory_limit', |
||||||
|
'post_max_size', 'file_uploads', 'upload_max_filesize', 'max_file_uploads', |
||||||
|
'default_socket_timeout', 'error_reporting'] |
||||||
|
args = getArgs() |
||||||
|
filename = getConf(version) |
||||||
|
phpini = mw.readFile(filename) |
||||||
|
for g in gets: |
||||||
|
if g in args: |
||||||
|
rep = g + '\s*=\s*(.+)\r?\n' |
||||||
|
val = g + ' = ' + args[g] + '\n' |
||||||
|
phpini = re.sub(rep, val, phpini) |
||||||
|
mw.writeFile(filename, phpini) |
||||||
|
reload(version) |
||||||
|
return mw.returnJson(True, '设置成功') |
||||||
|
|
||||||
|
|
||||||
|
def getLimitConf(version): |
||||||
|
fileini = getConf(version) |
||||||
|
phpini = mw.readFile(fileini) |
||||||
|
filefpm = getFpmConfFile(version) |
||||||
|
phpfpm = mw.readFile(filefpm) |
||||||
|
|
||||||
|
# print fileini, filefpm |
||||||
|
data = {} |
||||||
|
try: |
||||||
|
rep = "upload_max_filesize\s*=\s*([0-9]+)M" |
||||||
|
tmp = re.search(rep, phpini).groups() |
||||||
|
data['max'] = tmp[0] |
||||||
|
except: |
||||||
|
data['max'] = '50' |
||||||
|
|
||||||
|
try: |
||||||
|
rep = "request_terminate_timeout\s*=\s*([0-9]+)\n" |
||||||
|
tmp = re.search(rep, phpfpm).groups() |
||||||
|
data['maxTime'] = tmp[0] |
||||||
|
except: |
||||||
|
data['maxTime'] = 0 |
||||||
|
|
||||||
|
try: |
||||||
|
rep = r"\n;*\s*cgi\.fix_pathinfo\s*=\s*([0-9]+)\s*\n" |
||||||
|
tmp = re.search(rep, phpini).groups() |
||||||
|
|
||||||
|
if tmp[0] == '1': |
||||||
|
data['pathinfo'] = True |
||||||
|
else: |
||||||
|
data['pathinfo'] = False |
||||||
|
except: |
||||||
|
data['pathinfo'] = False |
||||||
|
|
||||||
|
return mw.getJson(data) |
||||||
|
|
||||||
|
|
||||||
|
def setMaxTime(version): |
||||||
|
args = getArgs() |
||||||
|
data = checkArgs(args, ['time']) |
||||||
|
if not data[0]: |
||||||
|
return data[1] |
||||||
|
|
||||||
|
time = args['time'] |
||||||
|
if int(time) < 30 or int(time) > 86400: |
||||||
|
return mw.returnJson(False, '请填写30-86400间的值!') |
||||||
|
|
||||||
|
filefpm = getFpmConfFile(version) |
||||||
|
conf = mw.readFile(filefpm) |
||||||
|
rep = "request_terminate_timeout\s*=\s*([0-9]+)\n" |
||||||
|
conf = re.sub(rep, "request_terminate_timeout = " + time + "\n", conf) |
||||||
|
mw.writeFile(filefpm, conf) |
||||||
|
|
||||||
|
fileini = getConf(version) |
||||||
|
phpini = mw.readFile(fileini) |
||||||
|
rep = "max_execution_time\s*=\s*([0-9]+)\r?\n" |
||||||
|
phpini = re.sub(rep, "max_execution_time = " + time + "\n", phpini) |
||||||
|
rep = "max_input_time\s*=\s*([0-9]+)\r?\n" |
||||||
|
phpini = re.sub(rep, "max_input_time = " + time + "\n", phpini) |
||||||
|
mw.writeFile(fileini, phpini) |
||||||
|
return mw.returnJson(True, '设置成功!') |
||||||
|
|
||||||
|
|
||||||
|
def setMaxSize(version): |
||||||
|
args = getArgs() |
||||||
|
data = checkArgs(args, ['max']) |
||||||
|
if not data[0]: |
||||||
|
return data[1] |
||||||
|
|
||||||
|
maxVal = args['max'] |
||||||
|
if int(maxVal) < 2: |
||||||
|
return mw.returnJson(False, '上传大小限制不能小于2MB!') |
||||||
|
|
||||||
|
path = getConf(version) |
||||||
|
conf = mw.readFile(path) |
||||||
|
rep = u"\nupload_max_filesize\s*=\s*[0-9]+M" |
||||||
|
conf = re.sub(rep, u'\nupload_max_filesize = ' + maxVal + 'M', conf) |
||||||
|
rep = u"\npost_max_size\s*=\s*[0-9]+M" |
||||||
|
conf = re.sub(rep, u'\npost_max_size = ' + maxVal + 'M', conf) |
||||||
|
mw.writeFile(path, conf) |
||||||
|
|
||||||
|
msg = mw.getInfo('设置PHP-{1}最大上传大小为[{2}MB]!', (version, maxVal,)) |
||||||
|
mw.writeLog('插件管理[PHP]', msg) |
||||||
|
return mw.returnJson(True, '设置成功!') |
||||||
|
|
||||||
|
|
||||||
|
def getFpmConfig(version): |
||||||
|
|
||||||
|
filefpm = getFpmConfFile(version) |
||||||
|
conf = mw.readFile(filefpm) |
||||||
|
data = {} |
||||||
|
rep = "\s*pm.max_children\s*=\s*([0-9]+)\s*" |
||||||
|
tmp = re.search(rep, conf).groups() |
||||||
|
data['max_children'] = tmp[0] |
||||||
|
|
||||||
|
rep = "\s*pm.start_servers\s*=\s*([0-9]+)\s*" |
||||||
|
tmp = re.search(rep, conf).groups() |
||||||
|
data['start_servers'] = tmp[0] |
||||||
|
|
||||||
|
rep = "\s*pm.min_spare_servers\s*=\s*([0-9]+)\s*" |
||||||
|
tmp = re.search(rep, conf).groups() |
||||||
|
data['min_spare_servers'] = tmp[0] |
||||||
|
|
||||||
|
rep = "\s*pm.max_spare_servers \s*=\s*([0-9]+)\s*" |
||||||
|
tmp = re.search(rep, conf).groups() |
||||||
|
data['max_spare_servers'] = tmp[0] |
||||||
|
|
||||||
|
rep = "\s*pm\s*=\s*(\w+)\s*" |
||||||
|
tmp = re.search(rep, conf).groups() |
||||||
|
data['pm'] = tmp[0] |
||||||
|
return mw.getJson(data) |
||||||
|
|
||||||
|
|
||||||
|
def setFpmConfig(version): |
||||||
|
args = getArgs() |
||||||
|
# if not 'max' in args: |
||||||
|
# return 'missing time args!' |
||||||
|
|
||||||
|
version = args['version'] |
||||||
|
max_children = args['max_children'] |
||||||
|
start_servers = args['start_servers'] |
||||||
|
min_spare_servers = args['min_spare_servers'] |
||||||
|
max_spare_servers = args['max_spare_servers'] |
||||||
|
pm = args['pm'] |
||||||
|
|
||||||
|
file = getServerDir() + '/php' + version + '/php-fpm.d/www.conf' |
||||||
|
conf = mw.readFile(file) |
||||||
|
|
||||||
|
rep = "\s*pm.max_children\s*=\s*([0-9]+)\s*" |
||||||
|
conf = re.sub(rep, "\npm.max_children = " + max_children, conf) |
||||||
|
|
||||||
|
rep = "\s*pm.start_servers\s*=\s*([0-9]+)\s*" |
||||||
|
conf = re.sub(rep, "\npm.start_servers = " + start_servers, conf) |
||||||
|
|
||||||
|
rep = "\s*pm.min_spare_servers\s*=\s*([0-9]+)\s*" |
||||||
|
conf = re.sub(rep, "\npm.min_spare_servers = " + |
||||||
|
min_spare_servers, conf) |
||||||
|
|
||||||
|
rep = "\s*pm.max_spare_servers \s*=\s*([0-9]+)\s*" |
||||||
|
conf = re.sub(rep, "\npm.max_spare_servers = " + |
||||||
|
max_spare_servers + "\n", conf) |
||||||
|
|
||||||
|
rep = "\s*pm\s*=\s*(\w+)\s*" |
||||||
|
conf = re.sub(rep, "\npm = " + pm + "\n", conf) |
||||||
|
|
||||||
|
mw.writeFile(file, conf) |
||||||
|
reload(version) |
||||||
|
|
||||||
|
msg = mw.getInfo('设置PHP-{1}并发设置,max_children={2},start_servers={3},min_spare_servers={4},max_spare_servers={5}', (version, max_children, |
||||||
|
start_servers, min_spare_servers, max_spare_servers,)) |
||||||
|
mw.writeLog('插件管理[PHP]', msg) |
||||||
|
return mw.returnJson(True, '设置成功!') |
||||||
|
|
||||||
|
|
||||||
|
def checkFpmStatusFile(version): |
||||||
|
if not mw.isInstalledWeb(): |
||||||
|
return False |
||||||
|
|
||||||
|
dfile = getServerDir() + '/nginx/conf/php_status/phpfpm_status_yum' + version + '.conf' |
||||||
|
if not os.path.exists(dfile): |
||||||
|
tpl = getPluginDir() + '/conf/phpfpm_status.conf' |
||||||
|
content = mw.readFile(tpl) |
||||||
|
content = contentReplace(content, version) |
||||||
|
mw.writeFile(dfile, content) |
||||||
|
mw.restartWeb() |
||||||
|
return True |
||||||
|
|
||||||
|
|
||||||
|
def getFpmStatus(version): |
||||||
|
|
||||||
|
checkFpmStatusFile(version) |
||||||
|
stat = status(version) |
||||||
|
if stat == 'stop': |
||||||
|
return mw.returnJson(False, 'PHP[' + version + ']未启动!!!') |
||||||
|
|
||||||
|
try: |
||||||
|
url = 'http://' + mw.getHostAddr() + '/phpfpm_status_yum' + version + '?json' |
||||||
|
result = mw.httpGet(url, 1) |
||||||
|
data = json.loads(result) |
||||||
|
fTime = time.localtime(int(data['start time'])) |
||||||
|
data['start time'] = time.strftime('%Y-%m-%d %H:%M:%S', fTime) |
||||||
|
except Exception as e: |
||||||
|
url = 'http://127.0.0.1/phpfpm_status_yum' + version + '?json' |
||||||
|
result = mw.httpGet(url, 1) |
||||||
|
data = json.loads(result) |
||||||
|
fTime = time.localtime(int(data['start time'])) |
||||||
|
data['start time'] = time.strftime('%Y-%m-%d %H:%M:%S', fTime) |
||||||
|
except Exception as e: |
||||||
|
data = {} |
||||||
|
|
||||||
|
return mw.returnJson(True, "OK", data) |
||||||
|
|
||||||
|
|
||||||
|
def getDisableFunc(version): |
||||||
|
filename = getConf(version) |
||||||
|
if not os.path.exists(filename): |
||||||
|
return mw.returnJson(False, '指定PHP版本不存在!') |
||||||
|
|
||||||
|
phpini = mw.readFile(filename) |
||||||
|
data = {} |
||||||
|
rep = "disable_functions\s*=\s{0,1}(.*)\n" |
||||||
|
tmp = re.search(rep, phpini).groups() |
||||||
|
data['disable_functions'] = tmp[0] |
||||||
|
return mw.getJson(data) |
||||||
|
|
||||||
|
|
||||||
|
def setDisableFunc(version): |
||||||
|
filename = getConf(version) |
||||||
|
if not os.path.exists(filename): |
||||||
|
return mw.returnJson(False, '指定PHP版本不存在!') |
||||||
|
|
||||||
|
args = getArgs() |
||||||
|
disable_functions = args['disable_functions'] |
||||||
|
|
||||||
|
phpini = mw.readFile(filename) |
||||||
|
rep = "disable_functions\s*=\s*.*\n" |
||||||
|
phpini = re.sub(rep, 'disable_functions = ' + |
||||||
|
disable_functions + "\n", phpini) |
||||||
|
|
||||||
|
msg = mw.getInfo('修改PHP-{1}的禁用函数为[{2}]', (version, disable_functions,)) |
||||||
|
mw.writeLog('插件管理[PHP-YUM]', msg) |
||||||
|
mw.writeFile(filename, phpini) |
||||||
|
reload(version) |
||||||
|
return mw.returnJson(True, '设置成功!') |
||||||
|
|
||||||
|
|
||||||
|
def checkPhpinfoFile(v): |
||||||
|
sdir = mw.getServerDir() |
||||||
|
dfile = sdir + '/web_conf/php/status/phpinfo_' + v + '.conf' |
||||||
|
tpl = getPluginDir() + '/conf/phpinfo.conf' |
||||||
|
content = mw.readFile(tpl) |
||||||
|
content = contentReplace(content, v) |
||||||
|
mw.writeFile(dfile, content) |
||||||
|
mw.restartWeb() |
||||||
|
|
||||||
|
|
||||||
|
def getPhpinfo(v): |
||||||
|
checkPhpinfoFile(v) |
||||||
|
sPath = mw.getRootDir() + '/phpinfo/' + v |
||||||
|
|
||||||
|
mw.execShell("rm -rf " + mw.getRootDir() + '/phpinfo') |
||||||
|
mw.execShell("mkdir -p " + sPath) |
||||||
|
mw.writeFile(sPath + '/phpinfo.php', '<?php phpinfo(); ?>') |
||||||
|
url = 'http://127.0.0.1/' + v + '/phpinfo.php' |
||||||
|
phpinfo = mw.httpGet(url) |
||||||
|
os.system("rm -rf " + mw.getRootDir() + '/phpinfo') |
||||||
|
return phpinfo |
||||||
|
|
||||||
|
|
||||||
|
def get_php_info(args): |
||||||
|
if not mw.isInstalledWeb(): |
||||||
|
return "openresty is not running!!!" |
||||||
|
return getPhpinfo(args['version']) |
||||||
|
|
||||||
|
|
||||||
|
def getLibConf(version): |
||||||
|
fname = getConf(version) |
||||||
|
if not os.path.exists(fname): |
||||||
|
return mw.returnJson(False, '指定PHP版本不存在!') |
||||||
|
|
||||||
|
# phpini = mw.readFile(fname) |
||||||
|
content = mw.execShell('cat /etc/opt/remi/php' + |
||||||
|
version + "/php.d/* | grep -v '^;' |tr -s '\n'") |
||||||
|
content = content[0] |
||||||
|
|
||||||
|
libpath = getPluginDir() + '/versions/phplib.conf' |
||||||
|
phplib = json.loads(mw.readFile(libpath)) |
||||||
|
|
||||||
|
libs = [] |
||||||
|
tasks = mw.M('tasks').where( |
||||||
|
"status!=?", ('1',)).field('status,name').select() |
||||||
|
for lib in phplib: |
||||||
|
lib['task'] = '1' |
||||||
|
for task in tasks: |
||||||
|
tmp = mw.getStrBetween('[', ']', task['name']) |
||||||
|
if not tmp: |
||||||
|
continue |
||||||
|
tmp1 = tmp.split('-') |
||||||
|
if tmp1[0].lower() == lib['name'].lower(): |
||||||
|
lib['task'] = task['status'] |
||||||
|
lib['phpversions'] = [] |
||||||
|
lib['phpversions'].append(tmp1[1]) |
||||||
|
if content.find(lib['check']) == -1: |
||||||
|
lib['status'] = False |
||||||
|
else: |
||||||
|
lib['status'] = True |
||||||
|
libs.append(lib) |
||||||
|
return mw.returnJson(True, 'OK!', libs) |
||||||
|
|
||||||
|
|
||||||
|
def installLib(version): |
||||||
|
args = getArgs() |
||||||
|
data = checkArgs(args, ['name']) |
||||||
|
if not data[0]: |
||||||
|
return data[1] |
||||||
|
|
||||||
|
name = args['name'] |
||||||
|
execstr = "cd " + getPluginDir() + '/versions/' + \ |
||||||
|
" && /bin/bash common.sh " + version + ' install ' + name |
||||||
|
|
||||||
|
rettime = time.strftime('%Y-%m-%d %H:%M:%S') |
||||||
|
insert_info = (None, '安装PHPYUM[' + name + '-' + version + ']', |
||||||
|
'execshell', '0', rettime, execstr) |
||||||
|
mw.M('tasks').add('id,name,type,status,addtime,execstr', insert_info) |
||||||
|
|
||||||
|
mw.triggerTask() |
||||||
|
return mw.returnJson(True, '已将下载任务添加到队列!') |
||||||
|
|
||||||
|
|
||||||
|
def uninstallLib(version): |
||||||
|
args = getArgs() |
||||||
|
data = checkArgs(args, ['name']) |
||||||
|
if not data[0]: |
||||||
|
return data[1] |
||||||
|
|
||||||
|
name = args['name'] |
||||||
|
execstr = "cd " + getPluginDir() + '/versions/' + \ |
||||||
|
" && /bin/bash common.sh " + version + ' uninstall ' + name |
||||||
|
|
||||||
|
data = mw.execShell(execstr) |
||||||
|
# data[0] == '' and |
||||||
|
if data[1] == '': |
||||||
|
return mw.returnJson(True, '已经卸载成功!') |
||||||
|
else: |
||||||
|
return mw.returnJson(False, '卸载错误信息!:' + data[1]) |
||||||
|
|
||||||
|
|
||||||
|
def installPreInspection(version): |
||||||
|
sys = mw.execShell( |
||||||
|
"cat /etc/*-release | grep PRETTY_NAME |awk -F = '{print $2}' | awk -F '\"' '{print $2}'| awk '{print $1}'") |
||||||
|
|
||||||
|
sys_id = mw.execShell( |
||||||
|
"cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F '\"' '{print $2}'") |
||||||
|
|
||||||
|
sysName = sys[0].strip().lower() |
||||||
|
sysId = sys_id[0].strip() |
||||||
|
|
||||||
|
if not sysName in ('centos'): |
||||||
|
return '暂时仅支持centos' |
||||||
|
return 'ok' |
||||||
|
|
||||||
|
if __name__ == "__main__": |
||||||
|
|
||||||
|
if len(sys.argv) < 3: |
||||||
|
print('missing parameters') |
||||||
|
exit(0) |
||||||
|
|
||||||
|
func = sys.argv[1] |
||||||
|
version = sys.argv[2] |
||||||
|
|
||||||
|
if func == 'status': |
||||||
|
print(status(version)) |
||||||
|
elif func == 'start': |
||||||
|
print(start(version)) |
||||||
|
elif func == 'stop': |
||||||
|
print(stop(version)) |
||||||
|
elif func == 'restart': |
||||||
|
print(restart(version)) |
||||||
|
elif func == 'reload': |
||||||
|
print(reload(version)) |
||||||
|
elif func == 'install_pre_inspection': |
||||||
|
print(installPreInspection(version)) |
||||||
|
elif func == 'initd_status': |
||||||
|
print(initdStatus(version)) |
||||||
|
elif func == 'initd_install': |
||||||
|
print(initdInstall(version)) |
||||||
|
elif func == 'initd_uninstall': |
||||||
|
print(initdUinstall(version)) |
||||||
|
elif func == 'fpm_log': |
||||||
|
print(fpmLog(version)) |
||||||
|
elif func == 'fpm_slow_log': |
||||||
|
print(fpmSlowLog(version)) |
||||||
|
elif func == 'conf': |
||||||
|
print(getConf(version)) |
||||||
|
elif func == 'get_php_conf': |
||||||
|
print(getPhpConf(version)) |
||||||
|
elif func == 'get_fpm_conf_file': |
||||||
|
print(getFpmConfFile(version)) |
||||||
|
elif func == 'submit_php_conf': |
||||||
|
print(submitPhpConf(version)) |
||||||
|
elif func == 'get_limit_conf': |
||||||
|
print(getLimitConf(version)) |
||||||
|
elif func == 'set_max_time': |
||||||
|
print(setMaxTime(version)) |
||||||
|
elif func == 'set_max_size': |
||||||
|
print(setMaxSize(version)) |
||||||
|
elif func == 'get_fpm_conf': |
||||||
|
print(getFpmConfig(version)) |
||||||
|
elif func == 'set_fpm_conf': |
||||||
|
print(setFpmConfig(version)) |
||||||
|
elif func == 'get_fpm_status': |
||||||
|
print(getFpmStatus(version)) |
||||||
|
elif func == 'get_disable_func': |
||||||
|
print(getDisableFunc(version)) |
||||||
|
elif func == 'set_disable_func': |
||||||
|
print(setDisableFunc(version)) |
||||||
|
elif func == 'get_phpinfo': |
||||||
|
print(getPhpinfo(version)) |
||||||
|
elif func == 'get_lib_conf': |
||||||
|
print(getLibConf(version)) |
||||||
|
elif func == 'install_lib': |
||||||
|
print(installLib(version)) |
||||||
|
elif func == 'uninstall_lib': |
||||||
|
print(uninstallLib(version)) |
||||||
|
else: |
||||||
|
print("fail") |
@ -0,0 +1,19 @@ |
|||||||
|
{ |
||||||
|
"sort": 7, |
||||||
|
"ps": "PHP是世界上最好的编程语言[APT]", |
||||||
|
"shell": "install.sh", |
||||||
|
"name": "php-apt", |
||||||
|
"title": "PHP[APT]", |
||||||
|
"coexist": true, |
||||||
|
"versions": ["74","80","81","82"], |
||||||
|
"install_pre_inspection":true, |
||||||
|
"tip": "soft", |
||||||
|
"checks": "server/php-apt/VERSION", |
||||||
|
"path": "server/php-apt/VERSION", |
||||||
|
"display": 1, |
||||||
|
"author": "Zend", |
||||||
|
"date": "2022-07-07", |
||||||
|
"home": "https://www.php.net", |
||||||
|
"type": "PHP语言解释器", |
||||||
|
"pid": "1" |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
|
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl |
||||||
|
|
||||||
|
if id www &> /dev/null ;then |
||||||
|
echo "www UID is `id -u www`" |
||||||
|
echo "www Shell is `grep "^www:" /etc/passwd |cut -d':' -f7 `" |
||||||
|
else |
||||||
|
groupadd www |
||||||
|
# useradd -g www -s /sbin/nologin www |
||||||
|
useradd -g www -s /bin/bash www |
||||||
|
fi |
||||||
|
|
||||||
|
action=$1 |
||||||
|
type=$2 |
||||||
|
|
||||||
|
if [ "${2}" == "" ];then |
||||||
|
echo '缺少安装脚本...' > $install_tmp |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
if [ ! -d $curPath/versions/$2 ];then |
||||||
|
echo '缺少安装脚本2...' > $install_tmp |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
|
||||||
|
if [ "${action}" == "uninstall" ] && [ -d ${serverPath}/php-apt/${type} ];then |
||||||
|
#初始化 |
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-apt/index.py stop ${type} |
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-apt/index.py initd_uninstall ${type} |
||||||
|
fi |
||||||
|
|
||||||
|
cd ${curPath} && sh -x $curPath/versions/$2/install.sh $1 |
||||||
|
|
||||||
|
if [ "${action}" == "install" ] && [ -d ${serverPath}/php-apt/${type} ];then |
||||||
|
#初始化 |
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-apt/index.py start ${type} |
||||||
|
cd ${rootPath} && python3 ${rootPath}/plugins/php-apt/index.py initd_install ${type} |
||||||
|
fi |
||||||
|
|
||||||
|
|
@ -0,0 +1,545 @@ |
|||||||
|
|
||||||
|
function str2Obj(str){ |
||||||
|
var data = {}; |
||||||
|
kv = str.split('&'); |
||||||
|
for(i in kv){ |
||||||
|
v = kv[i].split('='); |
||||||
|
data[v[0]] = v[1]; |
||||||
|
} |
||||||
|
return data; |
||||||
|
} |
||||||
|
|
||||||
|
function phpPost(method, version, args,callback){ |
||||||
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); |
||||||
|
|
||||||
|
var req_data = {}; |
||||||
|
req_data['name'] = 'php-apt'; |
||||||
|
req_data['func'] = method; |
||||||
|
req_data['version'] = version; |
||||||
|
|
||||||
|
if (typeof(args) == 'string'){ |
||||||
|
req_data['args'] = JSON.stringify(str2Obj(args)); |
||||||
|
} else { |
||||||
|
req_data['args'] = JSON.stringify(args); |
||||||
|
} |
||||||
|
|
||||||
|
$.post('/plugins/run', req_data, function(data) { |
||||||
|
layer.close(loadT); |
||||||
|
if (!data.status){ |
||||||
|
//错误展示10S
|
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [10, '#000']}); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){ |
||||||
|
callback(data); |
||||||
|
} |
||||||
|
},'json');
|
||||||
|
} |
||||||
|
|
||||||
|
function phpPostCallbak(method, version, args,callback){ |
||||||
|
var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); |
||||||
|
|
||||||
|
var req_data = {}; |
||||||
|
req_data['name'] = 'php-apt'; |
||||||
|
req_data['func'] = method; |
||||||
|
args['version'] = version; |
||||||
|
|
||||||
|
if (typeof(args) == 'string'){ |
||||||
|
req_data['args'] = JSON.stringify(str2Obj(args)); |
||||||
|
} else { |
||||||
|
req_data['args'] = JSON.stringify(args); |
||||||
|
} |
||||||
|
|
||||||
|
$.post('/plugins/callback', req_data, function(data) { |
||||||
|
layer.close(loadT); |
||||||
|
if (!data.status){ |
||||||
|
layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if(typeof(callback) == 'function'){ |
||||||
|
callback(data); |
||||||
|
} |
||||||
|
},'json');
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//配置修改
|
||||||
|
function phpSetConfig(version) { |
||||||
|
phpPost('get_php_conf', version,'',function(data){ |
||||||
|
// console.log(data);
|
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
// console.log(rdata);
|
||||||
|
var mlist = ''; |
||||||
|
for (var i = 0; i < rdata.length; i++) { |
||||||
|
var w = '70' |
||||||
|
if (rdata[i].name == 'error_reporting') w = '250'; |
||||||
|
var ibody = '<input style="width: ' + w + 'px;" class="bt-input-text mr5" name="' + rdata[i].name + '" value="' + rdata[i].value + '" type="text" >'; |
||||||
|
switch (rdata[i].type) { |
||||||
|
case 0: |
||||||
|
var selected_1 = (rdata[i].value == 1) ? 'selected' : ''; |
||||||
|
var selected_0 = (rdata[i].value == 0) ? 'selected' : ''; |
||||||
|
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;"><option value="1" ' + selected_1 + '>开启</option><option value="0" ' + selected_0 + '>关闭</option></select>' |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
var selected_1 = (rdata[i].value == 'On') ? 'selected' : ''; |
||||||
|
var selected_0 = (rdata[i].value == 'Off') ? 'selected' : ''; |
||||||
|
ibody = '<select class="bt-input-text mr5" name="' + rdata[i].name + '" style="width: ' + w + 'px;"><option value="On" ' + selected_1 + '>开启</option><option value="Off" ' + selected_0 + '>关闭</option></select>' |
||||||
|
break; |
||||||
|
} |
||||||
|
mlist += '<p><span>' + rdata[i].name + '</span>' + ibody + ', <font>' + rdata[i].ps + '</font></p>' |
||||||
|
} |
||||||
|
var phpCon = '<style>.conf_p p{margin-bottom: 2px}</style><div class="conf_p" style="margin-bottom:0">\ |
||||||
|
' + mlist + '\ |
||||||
|
<div style="margin-top:10px; padding-right:15px" class="text-right"><button class="btn btn-success btn-sm mr5" onclick="phpSetConfig(' + version + ')">刷新</button><button class="btn btn-success btn-sm" onclick="submitConf(' + version + ')">保存</button></div>\ |
||||||
|
</div>' |
||||||
|
$(".soft-man-con").html(phpCon); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//提交PHP配置
|
||||||
|
function submitConf(version) { |
||||||
|
var data = { |
||||||
|
version: version, |
||||||
|
display_errors: $("select[name='display_errors']").val(), |
||||||
|
'cgi.fix_pathinfo': $("select[name='cgi.fix_pathinfo']").val(), |
||||||
|
'date.timezone': $("input[name='date.timezone']").val(), |
||||||
|
short_open_tag: $("select[name='short_open_tag']").val(), |
||||||
|
asp_tags: $("select[name='asp_tags']").val() || 'On', |
||||||
|
safe_mode: $("select[name='safe_mode']").val(), |
||||||
|
max_execution_time: $("input[name='max_execution_time']").val(), |
||||||
|
max_input_time: $("input[name='max_input_time']").val(), |
||||||
|
max_input_vars: $("input[name='max_input_vars']").val(), |
||||||
|
memory_limit: $("input[name='memory_limit']").val(), |
||||||
|
post_max_size: $("input[name='post_max_size']").val(), |
||||||
|
file_uploads: $("select[name='file_uploads']").val(), |
||||||
|
upload_max_filesize: $("input[name='upload_max_filesize']").val(), |
||||||
|
max_file_uploads: $("input[name='max_file_uploads']").val(), |
||||||
|
default_socket_timeout: $("input[name='default_socket_timeout']").val(), |
||||||
|
error_reporting: $("input[name='error_reporting']").val() || 'On' |
||||||
|
}; |
||||||
|
|
||||||
|
phpPost('submit_php_conf', version, data, function(ret_data){ |
||||||
|
var rdata = $.parseJSON(ret_data.data); |
||||||
|
// console.log(rdata);
|
||||||
|
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//php上传限制
|
||||||
|
function phpUploadLimitReq(version){ |
||||||
|
phpPost('get_limit_conf', version, '', function(ret_data){ |
||||||
|
var rdata = $.parseJSON(ret_data.data); |
||||||
|
phpUploadLimit(version,rdata['max']); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function phpUploadLimit(version,max){ |
||||||
|
var LimitCon = '<p class="conf_p"><input class="phpUploadLimit bt-input-text mr5" type="number" value="'+ |
||||||
|
max+'" name="max">MB<button class="btn btn-success btn-sm" onclick="setPHPMaxSize(\''+ |
||||||
|
version+'\')" style="margin-left:20px">保存</button></p>'; |
||||||
|
$(".soft-man-con").html(LimitCon); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//php超时限制
|
||||||
|
function phpTimeLimitReq(version){ |
||||||
|
phpPost('get_limit_conf', version, '', function(ret_data){ |
||||||
|
var rdata = $.parseJSON(ret_data.data); |
||||||
|
phpTimeLimit(version,rdata['maxTime']); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function phpTimeLimit(version, max) { |
||||||
|
var LimitCon = '<p class="conf_p"><input class="phpTimeLimit bt-input-text mr5" type="number" value="' + max + '">秒<button class="btn btn-success btn-sm" onclick="setPHPMaxTime(\'' + version + '\')" style="margin-left:20px">保存</button></p>'; |
||||||
|
$(".soft-man-con").html(LimitCon); |
||||||
|
} |
||||||
|
|
||||||
|
//设置超时限制
|
||||||
|
function setPHPMaxTime(version) { |
||||||
|
var max = $(".phpTimeLimit").val(); |
||||||
|
phpPost('set_max_time',version,{'time':max},function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); |
||||||
|
}); |
||||||
|
} |
||||||
|
//设置PHP上传限制
|
||||||
|
function setPHPMaxSize(version) { |
||||||
|
max = $(".phpUploadLimit").val(); |
||||||
|
if (max < 2) { |
||||||
|
alert(max); |
||||||
|
layer.msg('上传大小限制不能小于2M', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
phpPost('set_max_size',version,{'max':max},function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function getFpmConfig(version){ |
||||||
|
phpPost('get_fpm_conf', version, {}, function(data){ |
||||||
|
// console.log(data);
|
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
// console.log(rdata);
|
||||||
|
var limitList = "<option value='0'>自定义</option>" + |
||||||
|
"<option value='1' " + (rdata.max_children == 30 ? 'selected' : '') + ">30并发</option>" + |
||||||
|
"<option value='2' " + (rdata.max_children == 50 ? 'selected' : '') + ">50并发</option>" + |
||||||
|
"<option value='3' " + (rdata.max_children == 100 ? 'selected' : '') + ">100并发</option>" + |
||||||
|
"<option value='4' " + (rdata.max_children == 200 ? 'selected' : '') + ">200并发</option>" + |
||||||
|
"<option value='5' " + (rdata.max_children == 300 ? 'selected' : '') + ">300并发</option>" + |
||||||
|
"<option value='6' " + (rdata.max_children == 500 ? 'selected' : '') + ">500并发</option>" |
||||||
|
var pms = [{ 'name': 'static', 'title': '静态' }, { 'name': 'dynamic', 'title': '动态' }]; |
||||||
|
var pmList = ''; |
||||||
|
for (var i = 0; i < pms.length; i++) { |
||||||
|
pmList += '<option value="' + pms[i].name + '" ' + ((pms[i].name == rdata.pm) ? 'selected' : '') + '>' + pms[i].title + '</option>'; |
||||||
|
} |
||||||
|
var body = "<div class='bingfa'>" + |
||||||
|
"<p class='line'><span class='span_tit'>并发方案:</span><select class='bt-input-text' name='limit' style='width:100px;'>" + limitList + "</select></p>" + |
||||||
|
"<p class='line'><span class='span_tit'>运行模式:</span><select class='bt-input-text' name='pm' style='width:100px;'>" + pmList + "</select><span class='c9'>*PHP-FPM运行模式</span></p>" + |
||||||
|
"<p class='line'><span class='span_tit'>max_children:</span><input class='bt-input-text' type='number' name='max_children' value='" + rdata.max_children + "' /><span class='c9'>*允许创建的最大子进程数</span></p>" + |
||||||
|
"<p class='line'><span class='span_tit'>start_servers:</span><input class='bt-input-text' type='number' name='start_servers' value='" + rdata.start_servers + "' /> <span class='c9'>*起始进程数(服务启动后初始进程数量)</span></p>" + |
||||||
|
"<p class='line'><span class='span_tit'>min_spare_servers:</span><input class='bt-input-text' type='number' name='min_spare_servers' value='" + rdata.min_spare_servers + "' /> <span class='c9'>*最小空闲进程数(清理空闲进程后的保留数量)</span></p>" + |
||||||
|
"<p class='line'><span class='span_tit'>max_spare_servers:</span><input class='bt-input-text' type='number' name='max_spare_servers' value='" + rdata.max_spare_servers + "' /> <span class='c9'>*最大空闲进程数(当空闲进程达到此值时清理)</span></p>" + |
||||||
|
"<div class='mtb15'><button class='btn btn-success btn-sm' onclick='setFpmConfig(\"" + version + "\",1)'>保存</button></div>" + |
||||||
|
"</div>"; |
||||||
|
|
||||||
|
$(".soft-man-con").html(body); |
||||||
|
$("select[name='limit']").change(function() { |
||||||
|
var type = $(this).val(); |
||||||
|
var max_children = rdata.max_children; |
||||||
|
var start_servers = rdata.start_servers; |
||||||
|
var min_spare_servers = rdata.min_spare_servers; |
||||||
|
var max_spare_servers = rdata.max_spare_servers; |
||||||
|
switch (type) { |
||||||
|
case '1': |
||||||
|
max_children = 30; |
||||||
|
start_servers = 5; |
||||||
|
min_spare_servers = 5; |
||||||
|
max_spare_servers = 20; |
||||||
|
break; |
||||||
|
case '2': |
||||||
|
max_children = 50; |
||||||
|
start_servers = 15; |
||||||
|
min_spare_servers = 15; |
||||||
|
max_spare_servers = 35; |
||||||
|
break; |
||||||
|
case '3': |
||||||
|
max_children = 100; |
||||||
|
start_servers = 20; |
||||||
|
min_spare_servers = 20; |
||||||
|
max_spare_servers = 70; |
||||||
|
break; |
||||||
|
case '4': |
||||||
|
max_children = 200; |
||||||
|
start_servers = 25; |
||||||
|
min_spare_servers = 25; |
||||||
|
max_spare_servers = 150; |
||||||
|
break; |
||||||
|
case '5': |
||||||
|
max_children = 300; |
||||||
|
start_servers = 30; |
||||||
|
min_spare_servers = 30; |
||||||
|
max_spare_servers = 180; |
||||||
|
break; |
||||||
|
case '6': |
||||||
|
max_children = 500; |
||||||
|
start_servers = 35; |
||||||
|
min_spare_servers = 35; |
||||||
|
max_spare_servers = 250; |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
$("input[name='max_children']").val(max_children); |
||||||
|
$("input[name='start_servers']").val(start_servers); |
||||||
|
$("input[name='min_spare_servers']").val(min_spare_servers); |
||||||
|
$("input[name='max_spare_servers']").val(max_spare_servers); |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function setFpmConfig(version){ |
||||||
|
var max_children = Number($("input[name='max_children']").val()); |
||||||
|
var start_servers = Number($("input[name='start_servers']").val()); |
||||||
|
var min_spare_servers = Number($("input[name='min_spare_servers']").val()); |
||||||
|
var max_spare_servers = Number($("input[name='max_spare_servers']").val()); |
||||||
|
var pm = $("select[name='pm']").val(); |
||||||
|
|
||||||
|
if (max_children < max_spare_servers) { |
||||||
|
layer.msg('max_spare_servers 不能大于 max_children', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (min_spare_servers > start_servers) { |
||||||
|
layer.msg('min_spare_servers 不能大于 start_servers', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (max_spare_servers < min_spare_servers) { |
||||||
|
layer.msg('min_spare_servers 不能大于 max_spare_servers', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (max_children < start_servers) { |
||||||
|
layer.msg('start_servers 不能大于 max_children', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
if (max_children < 1 || start_servers < 1 || min_spare_servers < 1 || max_spare_servers < 1) { |
||||||
|
layer.msg('配置值不能小于1', { icon: 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
var data = { |
||||||
|
version:version, |
||||||
|
max_children:max_children, |
||||||
|
start_servers:start_servers, |
||||||
|
min_spare_servers:min_spare_servers, |
||||||
|
max_spare_servers:max_spare_servers, |
||||||
|
pm:pm, |
||||||
|
}; |
||||||
|
phpPost('set_fpm_conf', version, data, function(ret_data){ |
||||||
|
var rdata = $.parseJSON(ret_data.data); |
||||||
|
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function getFpmStatus(version){ |
||||||
|
phpPost('get_fpm_status', version, '', function(ret_data){ |
||||||
|
var tmp_data = $.parseJSON(ret_data.data); |
||||||
|
if(!tmp_data.status){ |
||||||
|
layer.msg(tmp_data.msg, { icon: tmp_data.status ? 1 : 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
var rdata = tmp_data.data; |
||||||
|
var con = "<div style='height:420px;overflow:hidden;'><table class='table table-hover table-bordered GetPHPStatus' style='margin:0;padding:0'>\ |
||||||
|
<tr><th>应用池(pool)</th><td>" + rdata.pool + "</td></tr>\ |
||||||
|
<tr><th>进程管理方式(process manager)</th><td>" + ((rdata['process manager'] == 'dynamic') ? '动态' : '静态') + "</td></tr>\ |
||||||
|
<tr><th>启动日期(start time)</th><td>" + rdata['start time'] + "</td></tr>\ |
||||||
|
<tr><th>请求数(accepted conn)</th><td>" + rdata['accepted conn'] + "</td></tr>\ |
||||||
|
<tr><th>请求队列(listen queue)</th><td>" + rdata['listen queue'] + "</td></tr>\ |
||||||
|
<tr><th>最大等待队列(max listen queue)</th><td>" + rdata['max listen queue'] + "</td></tr>\ |
||||||
|
<tr><th>socket队列长度(listen queue len)</th><td>" + rdata['listen queue len'] + "</td></tr>\ |
||||||
|
<tr><th>空闲进程数量(idle processes)</th><td>" + rdata['idle processes'] + "</td></tr>\ |
||||||
|
<tr><th>活跃进程数量(active processes)</th><td>" + rdata['active processes'] + "</td></tr>\ |
||||||
|
<tr><th>总进程数量(total processes)</th><td>" + rdata['total processes'] + "</td></tr>\ |
||||||
|
<tr><th>最大活跃进程数量(max active processes)</th><td>" + rdata['max active processes'] + "</td></tr>\ |
||||||
|
<tr><th>到达进程上限次数(max children reached)</th><td>" + rdata['max children reached'] + "</td></tr>\ |
||||||
|
<tr><th>慢请求数量(slow requests)</th><td>" + rdata['slow requests'] + "</td></tr>\ |
||||||
|
</table></div>"; |
||||||
|
$(".soft-man-con").html(con); |
||||||
|
$(".GetPHPStatus td,.GetPHPStatus th").css("padding", "7px"); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
//禁用函数
|
||||||
|
function disableFunc(version) { |
||||||
|
phpPost('get_disable_func', version,'',function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
var disable_functions = rdata.disable_functions.split(','); |
||||||
|
var dbody = '' |
||||||
|
for (var i = 0; i < disable_functions.length; i++) { |
||||||
|
if (disable_functions[i] == '') continue; |
||||||
|
dbody += "<tr><td>" + disable_functions[i] + "</td><td><a style='float:right;' href=\"javascript:setDisableFunc('" + version + "','" + disable_functions[i] + "','" + rdata.disable_functions + "');\">删除</a></td></tr>"; |
||||||
|
} |
||||||
|
|
||||||
|
var con = "<div class='dirBinding'>" + |
||||||
|
"<input class='bt-input-text mr5' type='text' placeholder='添加要被禁止的函数名,如: exec' id='disable_function_val' style='height: 28px; border-radius: 3px;width: 410px;' />" + |
||||||
|
"<button class='btn btn-success btn-sm' onclick=\"setDisableFunc('" + version + "',1,'" + rdata.disable_functions + "')\">添加</button>" + |
||||||
|
"</div>" + |
||||||
|
"<div class='divtable mtb15' style='height:350px;overflow:auto'><table class='table table-hover' width='100%' style='margin-bottom:0'>" + |
||||||
|
"<thead><tr><th>名称</th><th width='100' class='text-right'>操作</th></tr></thead>" + |
||||||
|
"<tbody id='blacktable'>" + dbody + "</tbody>" + |
||||||
|
"</table></div>"; |
||||||
|
|
||||||
|
con += '<ul class="help-info-text">\ |
||||||
|
<li>在此处可以禁用指定函数的调用,以增强环境安全性!</li>\ |
||||||
|
<li>强烈建议禁用如exec,system等危险函数!</li>\ |
||||||
|
</ul>'; |
||||||
|
|
||||||
|
$(".soft-man-con").html(con); |
||||||
|
}); |
||||||
|
} |
||||||
|
//设置禁用函数
|
||||||
|
function setDisableFunc(version, act, fs) { |
||||||
|
var fsArr = fs.split(','); |
||||||
|
if (act == 1) { |
||||||
|
var functions = $("#disable_function_val").val(); |
||||||
|
for (var i = 0; i < fsArr.length; i++) { |
||||||
|
if (functions == fsArr[i]) { |
||||||
|
layer.msg(lan.soft.fun_msg, { icon: 5 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
fs += ',' + functions; |
||||||
|
msg = '添加成功'; |
||||||
|
} else { |
||||||
|
|
||||||
|
fs = ''; |
||||||
|
for (var i = 0; i < fsArr.length; i++) { |
||||||
|
if (act == fsArr[i]) continue; |
||||||
|
fs += fsArr[i] + ',' |
||||||
|
} |
||||||
|
msg = '删除成功'; |
||||||
|
fs = fs.substr(0, fs.length - 1); |
||||||
|
} |
||||||
|
|
||||||
|
var data = { |
||||||
|
'version':version, |
||||||
|
'disable_functions':fs, |
||||||
|
}; |
||||||
|
|
||||||
|
phpPost('set_disable_func', version,data,function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
showMsg(rdata.status ? msg : rdata.msg, function(){ |
||||||
|
disableFunc(version); |
||||||
|
} ,{ icon: rdata.status ? 1 : 2 });
|
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//phpinfo
|
||||||
|
function getPhpinfo(version) { |
||||||
|
var con = '<button class="btn btn-default btn-sm" onclick="getPHPInfo(\'' + version + '\')">查看phpinfo()</button>'; |
||||||
|
$(".soft-man-con").html(con); |
||||||
|
} |
||||||
|
|
||||||
|
//获取PHPInfo
|
||||||
|
function getPHPInfo_old(version) { |
||||||
|
phpPost('get_phpinfo', version, '', function(data){ |
||||||
|
var rdata = data.data; |
||||||
|
layer.open({ |
||||||
|
type: 1, |
||||||
|
title: "PHP-" + version + "-PHPINFO", |
||||||
|
area: ['90%', '90%'], |
||||||
|
closeBtn: 2, |
||||||
|
shadeClose: true, |
||||||
|
content: rdata |
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function getPHPInfo(version) { |
||||||
|
phpPostCallbak('get_php_info', version, {}, function(data){ |
||||||
|
if (!data.status){ |
||||||
|
layer.msg(rdata.msg, { icon: 2 }); |
||||||
|
} |
||||||
|
|
||||||
|
layer.open({ |
||||||
|
type: 1, |
||||||
|
title: "PHP-" + version + "-PHPINFO", |
||||||
|
area: ['90%', '90%'], |
||||||
|
closeBtn: 2, |
||||||
|
shadeClose: true, |
||||||
|
content: data.data |
||||||
|
}); |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function phpLibConfig(version){ |
||||||
|
|
||||||
|
phpPost('get_lib_conf', version, '', function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
|
||||||
|
if (!rdata.status){ |
||||||
|
layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
var libs = rdata.data; |
||||||
|
var body = ''; |
||||||
|
var opt = ''; |
||||||
|
|
||||||
|
for (var i = 0; i < libs.length; i++) { |
||||||
|
if (libs[i].versions.indexOf(version) == -1){ |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
if (libs[i]['task'] == '-1' && libs[i].phpversions.indexOf(version) != -1) { |
||||||
|
opt = '<a style="color:green;" href="javascript:messageBox();">安装</a>' |
||||||
|
} else if (libs[i]['task'] == '0' && libs[i].phpversions.indexOf(version) != -1) { |
||||||
|
opt = '<a style="color:#C0C0C0;" href="javascript:messageBox();">等待安装...</a>' |
||||||
|
} else if (libs[i].status) { |
||||||
|
opt = '<a style="color:red;" href="javascript:uninstallPHPLib(\'' + version + '\',\'' + libs[i].name + '\',\'' + libs[i].title + '\',' + '' + ');">卸载</a>' |
||||||
|
} else { |
||||||
|
opt = '<a class="btlink" href="javascript:installPHPLib(\'' + version + '\',\'' + libs[i].name + '\',\'' + libs[i].title + '\',' + '' + ');">安装</a>' |
||||||
|
} |
||||||
|
|
||||||
|
body += '<tr>' + |
||||||
|
'<td>' + libs[i].name + '</td>' + |
||||||
|
'<td>' + libs[i].type + '</td>' + |
||||||
|
'<td>' + libs[i].msg + '</td>' + |
||||||
|
'<td><span class="ico-' + (libs[i].status ? 'start' : 'stop') + ' glyphicon glyphicon-' + (libs[i].status ? 'ok' : 'remove') + '"></span></td>' + |
||||||
|
'<td style="text-align: right;">' + opt + '</td>' + |
||||||
|
'</tr>'; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
var con = '<div class="divtable" id="phpextdiv" style="margin-right:10px;height: 420px; overflow: auto; margin-right: 0px;">' + |
||||||
|
'<table class="table table-hover" width="100%" cellspacing="0" cellpadding="0" border="0">' + |
||||||
|
'<thead>' + |
||||||
|
'<tr>' + |
||||||
|
'<th>名称</th>' + |
||||||
|
'<th width="64">类型</th>' + |
||||||
|
'<th>说明</th>' + |
||||||
|
'<th width="40">状态</th>' + |
||||||
|
'<th style="text-align: right;" width="50">操作</th>' + |
||||||
|
'</tr>' + |
||||||
|
'</thead>' + |
||||||
|
'<tbody>' + body + '</tbody>' + |
||||||
|
'</table>' + |
||||||
|
'</div>' + |
||||||
|
'<ul class="help-info-text c7 pull-left">\ |
||||||
|
<li>请按实际需求安装扩展,不要安装不必要的PHP扩展,这会影响PHP执行效率,甚至出现异常</li>\ |
||||||
|
<li>Redis扩展只允许在1个PHP版本中使用,安装到其它PHP版本请在[软件管理]重装Redis</li>\ |
||||||
|
<li>opcache/xcache/apc等脚本缓存扩展,请只安装其中1个,否则可能导致您的站点程序异常</li>\ |
||||||
|
<li>ioncube要在ZendGuardLoader/opcache前安装,否则可能导致您的站点程序异常</li>\ |
||||||
|
</ul>'; |
||||||
|
$('.soft-man-con').html(con); |
||||||
|
}); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
//安装扩展
|
||||||
|
function installPHPLib(version, name, title, pathinfo) { |
||||||
|
layer.confirm('您真的要安装{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() { |
||||||
|
name = name.toLowerCase(); |
||||||
|
var data = "name=" + name + "&version=" + version + "&type=1"; |
||||||
|
|
||||||
|
phpPost('install_lib', version, data, function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
// layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
|
||||||
|
showMsg(rdata.msg, function(){ |
||||||
|
getTaskCount(); |
||||||
|
phpLibConfig(version); |
||||||
|
},{ icon: rdata.status ? 1 : 2 }); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
//卸载扩展
|
||||||
|
function uninstallPHPLib(version, name, title, pathinfo) { |
||||||
|
layer.confirm('您真的要安装{1}吗?'.replace('{1}', name), { icon: 3, closeBtn: 2 }, function() { |
||||||
|
name = name.toLowerCase(); |
||||||
|
var data = 'name=' + name + '&version=' + version; |
||||||
|
phpPost('uninstall_lib', version, data, function(data){ |
||||||
|
var rdata = $.parseJSON(data.data); |
||||||
|
// layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 });
|
||||||
|
showMsg(rdata.msg, function(){ |
||||||
|
getTaskCount(); |
||||||
|
phpLibConfig(version); |
||||||
|
},{ icon: rdata.status ? 1 : 2 },5000); |
||||||
|
|
||||||
|
}); |
||||||
|
}); |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
sourcePath=${serverPath}/source |
||||||
|
sysName=`uname` |
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl |
||||||
|
|
||||||
|
|
||||||
|
#获取信息和版本 |
||||||
|
# bash /www/server/mdsever-web/scripts/getos.sh |
||||||
|
bash ${rootPath}/scripts/getos.sh |
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl` |
||||||
|
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` |
||||||
|
|
||||||
|
version=7.4.x |
||||||
|
PHP_VER=74 |
||||||
|
|
||||||
|
|
||||||
|
Install_php() |
||||||
|
{ |
||||||
|
#------------------------ install start ------------------------------------# |
||||||
|
|
||||||
|
### centos start ################ |
||||||
|
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-${VERSION_ID}.rpm |
||||||
|
yum install -y php74 php74-php-fpm |
||||||
|
### centos start ################ |
||||||
|
|
||||||
|
if [ "$?" == "0" ];then |
||||||
|
mkdir -p $serverPath/php-yum/${PHP_VER} |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------ install end ------------------------------------# |
||||||
|
} |
||||||
|
|
||||||
|
Uninstall_php() |
||||||
|
{ |
||||||
|
# $serverPath/php-ya/init.d/php${PHP_VER} stop |
||||||
|
rm -rf $serverPath/php-yum/${PHP_VER} |
||||||
|
echo "卸载php-${version}..." > $install_tmp |
||||||
|
} |
||||||
|
|
||||||
|
action=${1} |
||||||
|
if [ "${1}" == 'install' ];then |
||||||
|
Install_php |
||||||
|
else |
||||||
|
Uninstall_php |
||||||
|
fi |
@ -0,0 +1,52 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
sourcePath=${serverPath}/source |
||||||
|
sysName=`uname` |
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl |
||||||
|
|
||||||
|
|
||||||
|
#获取信息和版本 |
||||||
|
# bash /www/server/mdsever-web/scripts/getos.sh |
||||||
|
bash ${rootPath}/scripts/getos.sh |
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl` |
||||||
|
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` |
||||||
|
|
||||||
|
version=8.0.x |
||||||
|
PHP_VER=80 |
||||||
|
|
||||||
|
|
||||||
|
Install_php() |
||||||
|
{ |
||||||
|
#------------------------ install start ------------------------------------# |
||||||
|
|
||||||
|
### centos start ################ |
||||||
|
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-${VERSION_ID}.rpm |
||||||
|
yum install -y php80 php80-php-fpm |
||||||
|
### centos start ################ |
||||||
|
|
||||||
|
if [ "$?" == "0" ];then |
||||||
|
mkdir -p $serverPath/php-yum/${PHP_VER} |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------ install end ------------------------------------# |
||||||
|
} |
||||||
|
|
||||||
|
Uninstall_php() |
||||||
|
{ |
||||||
|
# $serverPath/php-ya/init.d/php${PHP_VER} stop |
||||||
|
rm -rf $serverPath/php-yum/${PHP_VER} |
||||||
|
echo "卸载php-${version}..." > $install_tmp |
||||||
|
} |
||||||
|
|
||||||
|
action=${1} |
||||||
|
if [ "${1}" == 'install' ];then |
||||||
|
Install_php |
||||||
|
else |
||||||
|
Uninstall_php |
||||||
|
fi |
@ -0,0 +1,52 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
sourcePath=${serverPath}/source |
||||||
|
sysName=`uname` |
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl |
||||||
|
|
||||||
|
|
||||||
|
#获取信息和版本 |
||||||
|
# bash /www/server/mdsever-web/scripts/getos.sh |
||||||
|
bash ${rootPath}/scripts/getos.sh |
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl` |
||||||
|
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` |
||||||
|
|
||||||
|
version=8.1.x |
||||||
|
PHP_VER=81 |
||||||
|
|
||||||
|
|
||||||
|
Install_php() |
||||||
|
{ |
||||||
|
#------------------------ install start ------------------------------------# |
||||||
|
|
||||||
|
### centos start ################ |
||||||
|
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-${VERSION_ID}.rpm |
||||||
|
yum install -y php81 php81-php-fpm |
||||||
|
### centos start ################ |
||||||
|
|
||||||
|
if [ "$?" == "0" ];then |
||||||
|
mkdir -p $serverPath/php-yum/${PHP_VER} |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------ install end ------------------------------------# |
||||||
|
} |
||||||
|
|
||||||
|
Uninstall_php() |
||||||
|
{ |
||||||
|
# $serverPath/php-ya/init.d/php${PHP_VER} stop |
||||||
|
rm -rf $serverPath/php-yum/${PHP_VER} |
||||||
|
echo "卸载php-${version}..." > $install_tmp |
||||||
|
} |
||||||
|
|
||||||
|
action=${1} |
||||||
|
if [ "${1}" == 'install' ];then |
||||||
|
Install_php |
||||||
|
else |
||||||
|
Uninstall_php |
||||||
|
fi |
@ -0,0 +1,52 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
sourcePath=${serverPath}/source |
||||||
|
sysName=`uname` |
||||||
|
install_tmp=${rootPath}/tmp/mw_install.pl |
||||||
|
|
||||||
|
|
||||||
|
#获取信息和版本 |
||||||
|
# bash /www/server/mdsever-web/scripts/getos.sh |
||||||
|
bash ${rootPath}/scripts/getos.sh |
||||||
|
OSNAME=`cat ${rootPath}/data/osname.pl` |
||||||
|
VERSION_ID=`cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F "\"" '{print $2}'` |
||||||
|
|
||||||
|
version=8.2.x |
||||||
|
PHP_VER=82 |
||||||
|
|
||||||
|
|
||||||
|
Install_php() |
||||||
|
{ |
||||||
|
#------------------------ install start ------------------------------------# |
||||||
|
|
||||||
|
### centos start ################ |
||||||
|
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-${VERSION_ID}.rpm |
||||||
|
yum install -y php82 php82-php-fpm |
||||||
|
### centos start ################ |
||||||
|
|
||||||
|
if [ "$?" == "0" ];then |
||||||
|
mkdir -p $serverPath/php-apt/${PHP_VER} |
||||||
|
fi |
||||||
|
|
||||||
|
#------------------------ install end ------------------------------------# |
||||||
|
} |
||||||
|
|
||||||
|
Uninstall_php() |
||||||
|
{ |
||||||
|
# $serverPath/php-ya/init.d/php${PHP_VER} stop |
||||||
|
rm -rf $serverPath/php-apt/${PHP_VER} |
||||||
|
echo "卸载php-${version}..." > $install_tmp |
||||||
|
} |
||||||
|
|
||||||
|
action=${1} |
||||||
|
if [ "${1}" == 'install' ];then |
||||||
|
Install_php |
||||||
|
else |
||||||
|
Uninstall_php |
||||||
|
fi |
@ -0,0 +1,50 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
|
||||||
|
version=$1 |
||||||
|
action=$2 |
||||||
|
extName=$3 |
||||||
|
|
||||||
|
# echo $1,$2,$3 |
||||||
|
|
||||||
|
# echo $curPath |
||||||
|
# echo $rootPath |
||||||
|
# echo $serverPath |
||||||
|
|
||||||
|
FILE=${curPath}/${version}/${extName}.sh |
||||||
|
|
||||||
|
# yum install -y php81-php-yar |
||||||
|
|
||||||
|
|
||||||
|
if [ "$action" == 'install' ];then |
||||||
|
|
||||||
|
if [ -f $FILE ];then |
||||||
|
bash ${curPath}/${version}/${extName}.sh install |
||||||
|
else |
||||||
|
yum install -y php${version}-php*-${extName} |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
|
||||||
|
# yum remove -y php81-php-yar |
||||||
|
if [ "$action" == 'uninstall' ];then |
||||||
|
|
||||||
|
if [ -f $FILE ];then |
||||||
|
bash ${curPath}/${version}/${extName}.sh uninstall |
||||||
|
else |
||||||
|
yum remove -y php${version}-php*-${extName} |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
echo "yum install -y php${version}-php-${extName}" |
||||||
|
echo "yum remove -y php${version}-php-${extName}" |
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,20 @@ |
|||||||
|
#!/bin/bash |
||||||
|
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin |
||||||
|
export PATH |
||||||
|
|
||||||
|
curPath=`pwd` |
||||||
|
rootPath=$(dirname "$curPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
rootPath=$(dirname "$rootPath") |
||||||
|
serverPath=$(dirname "$rootPath") |
||||||
|
|
||||||
|
version=$1 |
||||||
|
action=$2 |
||||||
|
|
||||||
|
if [ -f /lib/systemd/system/php${version}.service ];then |
||||||
|
systemctl ${action} php${version} |
||||||
|
elif [[ -f /usr/lib/systemd/system/php${version}.service ]]; then |
||||||
|
systemctl ${action} php${version} |
||||||
|
else |
||||||
|
$serverPath/php/init.d/php${version} ${action} |
||||||
|
fi |
@ -0,0 +1,534 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"name": "pdo", |
||||||
|
"versions": [ |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "数据库", |
||||||
|
"msg": "数据库访问抽象模块!", |
||||||
|
"shell": "pdo.sh", |
||||||
|
"check": "pdo" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "mysqlnd", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"56", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "数据库", |
||||||
|
"msg": "用于使用MySQL数据库的模块!", |
||||||
|
"shell": "mysqlnd.sh", |
||||||
|
"check": "mysqlnd" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "oci8", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"56", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "数据库", |
||||||
|
"msg": "用于使用OCI8数据库的模块!", |
||||||
|
"shell": "oci8.sh", |
||||||
|
"check": "oci8" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "odbc", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"56", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "数据库", |
||||||
|
"msg": "用于使用ODBC数据库的模块!", |
||||||
|
"shell": "odbc.sh", |
||||||
|
"check": "odbc" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "ZendGuardLoader", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"56" |
||||||
|
], |
||||||
|
"type": "脚本解密", |
||||||
|
"msg": "用于解密ZendGuard加密脚本!", |
||||||
|
"shell": "zend_guard_loader.sh", |
||||||
|
"check": "ZendGuardLoader" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "ZendOptimizer", |
||||||
|
"versions": [ |
||||||
|
"52" |
||||||
|
], |
||||||
|
"type": "脚本解密", |
||||||
|
"msg": "用于解密ZendOptimizer加密脚本!", |
||||||
|
"shell": "zend_optimizer.sh", |
||||||
|
"check": "ZendOptimizer" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "ionCube", |
||||||
|
"versions": [ |
||||||
|
"52", |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74" |
||||||
|
], |
||||||
|
"type": "脚本解密", |
||||||
|
"msg": "用于解密ionCube Encoder加密脚本!", |
||||||
|
"shell": "ioncube.sh", |
||||||
|
"check": "ioncube" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "opcache", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "用于加速PHP脚本!", |
||||||
|
"shell": "opcache.sh", |
||||||
|
"check": "opcache" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "mcrypt", |
||||||
|
"versions": [ |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "加密软件!", |
||||||
|
"shell": "mcrypt.sh", |
||||||
|
"check": "mcrypt" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "fileinfo", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "用于FILE!", |
||||||
|
"shell": "fileinfo.sh", |
||||||
|
"check": "fileinfo" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "exif", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "用于图像文件格式!", |
||||||
|
"shell": "exif.sh", |
||||||
|
"check": "exif" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "gd", |
||||||
|
"versions": [ |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "通用GD库!", |
||||||
|
"shell": "gd.sh", |
||||||
|
"check": "gd" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "intl", |
||||||
|
"versions": [ |
||||||
|
"52", |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "提供国际化支持", |
||||||
|
"shell": "intl.sh", |
||||||
|
"check": "intl" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "memcache", |
||||||
|
"versions": [ |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "强大的内容缓存器,不支持集群", |
||||||
|
"shell": "memcache.sh", |
||||||
|
"check": "memcache" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "memcached", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "强大的内容缓存器,支持集群", |
||||||
|
"shell": "memcached.sh", |
||||||
|
"check": "memcached" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "redis", |
||||||
|
"versions": [ |
||||||
|
"52", |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "更强大的内容缓存器,支持集群", |
||||||
|
"shell": "redis.sh", |
||||||
|
"check": "redis" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "apc", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "脚本缓存器", |
||||||
|
"shell": "apc.sh", |
||||||
|
"check": "apc" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "imagick-im7", |
||||||
|
"versions": [ |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "比GD更强大的图形库", |
||||||
|
"shell": "imagick.sh", |
||||||
|
"check": "imagick" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "xdebug", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "调试器", |
||||||
|
"msg": "不多说,不了解的不要安装", |
||||||
|
"shell": "xdebug.sh", |
||||||
|
"check": "xdebug" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "xhprof", |
||||||
|
"versions": [ |
||||||
|
"52", |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "性能分析", |
||||||
|
"msg": "不多说,不了解的不要安装!", |
||||||
|
"shell": "xhprof.sh", |
||||||
|
"check": "xhprof" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "Swoole", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "异步、并行、高性能网络通信引擎", |
||||||
|
"shell": "swoole.sh", |
||||||
|
"check": "swoole" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "eAccelerator", |
||||||
|
"versions": [ |
||||||
|
"52", |
||||||
|
"53" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "内容缓存器", |
||||||
|
"shell": "eaccelerator.sh", |
||||||
|
"check": "eaccelerator" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "yaf", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "框架", |
||||||
|
"msg": "Yaf是一个C语言编写的PHP框架", |
||||||
|
"shell": "yaf.sh", |
||||||
|
"check": "yaf" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "yar", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "框架", |
||||||
|
"msg": "Yar是一个RPC框架", |
||||||
|
"shell": "yar.sh", |
||||||
|
"check": "yar" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "mongo", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "Mongodb数据库连接驱动", |
||||||
|
"shell": "mongo.sh", |
||||||
|
"check": "mongo" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "mongodb", |
||||||
|
"versions": [ |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "Mongodb数据库连接驱动", |
||||||
|
"shell": "mongodb.sh", |
||||||
|
"check": "mongodb" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "yac", |
||||||
|
"versions": [ |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "缓存器", |
||||||
|
"msg": "高性能无锁共享内存Cache", |
||||||
|
"shell": "yac.sh", |
||||||
|
"check": "yac" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "solr", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "大数据", |
||||||
|
"msg": "SOLR全文搜索服务", |
||||||
|
"shell": "solr.sh", |
||||||
|
"check": "solr" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "seaslog", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81" |
||||||
|
], |
||||||
|
"type": "日志", |
||||||
|
"msg": "SeasLog高性能日志记录", |
||||||
|
"shell": "seaslog.sh", |
||||||
|
"check": "seaslog" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "mbstring", |
||||||
|
"versions": [ |
||||||
|
"53", |
||||||
|
"54", |
||||||
|
"55", |
||||||
|
"56", |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "通用扩展", |
||||||
|
"msg": "用于需要多字节字符串处理的模块", |
||||||
|
"shell": "mbstring.sh", |
||||||
|
"check": "mbstring" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"name": "zip", |
||||||
|
"versions": [ |
||||||
|
"70", |
||||||
|
"71", |
||||||
|
"72", |
||||||
|
"73", |
||||||
|
"74", |
||||||
|
"80", |
||||||
|
"81", |
||||||
|
"82" |
||||||
|
], |
||||||
|
"type": "压缩", |
||||||
|
"msg": "压缩组件", |
||||||
|
"shell": "zip.sh", |
||||||
|
"check": "zip" |
||||||
|
} |
||||||
|
] |
Loading…
Reference in new issue