-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathphp_multi_install.sh
More file actions
214 lines (190 loc) · 7.59 KB
/
php_multi_install.sh
File metadata and controls
214 lines (190 loc) · 7.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/usr/bin/env bash
function php_multi_install() {
local options
local available_versions
declare -a versions_arr
local max_verlen=0
local pkg
local ver
local item
local line
local phpver
local shortver
local ver_str
local installed_versions
while true; do
available_versions=()
versions_arr=()
installed_versions=()
#mapfile -t available_versions < <(dnf repository-packages remi-safe list | grep php | grep -oP 'php[0-9]{2}' | sort -r | uniq)
# 1. Получаем список версий и статус
while read pkg ver; do
phpver=$(echo "$pkg" | grep -oE 'php[0-9]{2}')
shortver=$(echo "$ver" | cut -d'-' -f1)
if [[ "$shortver" == *~* ]]; then
status="[${shortver#*~}]"
else
status="[stable]"
fi
ver_str="$phpver ($shortver)"
versions_arr+=("$ver_str|$status")
(( ${#ver_str} > max_verlen )) && max_verlen=${#ver_str}
done < <(
dnf repository-packages remi-safe list | awk '/^php[0-9]{2}-php-fpm\./ {print $1, $2}' | sort -ru
)
# 2. Собираем красивый массив для меню
available_versions=()
for item in "${versions_arr[@]}"; do
ver_str="${item%%|*}"
status="${item##*|}"
printf -v line "%-${max_verlen}s %s" "$ver_str" "$status"
available_versions+=("$line")
done
local available
local max_installed_width=0
while read item; do
installed_versions+=("$item")
(( ${#item} > max_installed_width )) && max_installed_width=${#item}
done < <(
rpm -qa | grep '^php[0-9][0-9]-php-fpm' | sort -r | while read pkg; do
phpver=$(echo "$pkg" | grep -oE '^php[0-9]{2}')
version=$(rpm -q --qf '%{VERSION}\n' "$pkg" | head -n1)
echo "$phpver ($version)"
done
)
max_installed_width=$((max_installed_width + 2))
options=()
for available in "${available_versions[@]}"; do
phpver="${available%% *}" # до первого пробела — всегда phpXX
skip=
for installed in "${installed_versions[@]}"; do
installed_phpver="${installed%% *}" # тоже только phpXX
if [[ $phpver == $installed_phpver ]]; then
skip=1
break
fi
done
[[ ! $skip ]] && options+=("$available")
done
if [ ${#options[@]} -eq 0 ]; then
echo "Все доступные версии PHP уже установлены."
return
fi
echo
echo -e "Вы сможете доустановить невыбранные версии ${GREEN}PHP${WHITE} позднее, после установки RISH."
echo -e "Установка ${GREEN}PHP${WHITE} происходит по очереди, одна версия за другой."
echo -e "Выбирайте только реально необходимые, не ставьте все подряд."
echo
echo -e "Выберите нужную версию ${GREEN}PHP${WHITE} из доступных."
local max_width=0
local len
local item
for item in "${available_versions[@]}"; do
len=${#item}
(( len > max_width )) && max_width=$len
done
local left_block_width=$((max_width + 7))
local right_block_x=$((left_block_width + 13))
local arrow_x=$((left_block_width + 1))
local current_y=$(get_cursor_row)
echo
local size=$(stty size)
local lines=${size% *}
((skip_lines=0))
((need_to_skeep=${#installed_versions[@]}))
if (((current_y + need_to_skeep + 1) > lines)); then
((skip_lines=${current_y} + need_to_skeep - ${lines} + 2))
echo -en ${ESC}"[${skip_lines}S"
((current_y = ${current_y} - ${skip_lines}))
fi
if (( ${#installed_versions[@]} > 0 )); then
cursor_to $(($current_y+2)) $arrow_x
echo -en "───────────>"
cursor_to $(($current_y)) $right_block_x
echo -en "Установлено:"
refresh_window ${current_y}+1 $right_block_x ${#installed_versions[@]} ${max_installed_width} 0 "${installed_versions[@]}"
fi
# Добавляем опцию для завершения процесса
options+=("Завершить выбор")
cursor_to $(($current_y)) 0
echo "Доступно:"
vertical_menu "current" 1 0 10 "${options[@]}"
local ret=$?
cursor_to $(($current_y)) 0
echo -en ${ESC}"[0J"
if (( ret == 255 )) || (( ret == ${#options[@]}-1 )); then
return 0
fi
local selected_line=${options[${ret}]}
local selected_version
selected_version=$(echo "$selected_line" | grep -oP '^php[0-9]{2}')
echo "Установка выбранной версии PHP ($selected_version) и дополнительных расширений..."
sudo dnf install -y "$selected_version" \
"${selected_version}-php-fpm" \
"${selected_version}-php-opcache" \
"${selected_version}-php-cli" \
"${selected_version}-php-gd" \
"${selected_version}-php-mbstring" \
"${selected_version}-php-mysqlnd" \
"${selected_version}-php-xml" \
"${selected_version}-php-soap" \
"${selected_version}-php-zip" \
"${selected_version}-php-intl" \
"${selected_version}-php-json" \
"${selected_version}-php-gmp"
Up
echo -e "${GREEN}${selected_version}${WHITE} успешно установлен."
Down
PHPINI="/etc/opt/remi/${selected_version}/php.ini"
sed -i "s/memory_limit = .*/memory_limit = 256M/" $PHPINI
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 32M/" $PHPINI
sed -i "s/post_max_size = .*/post_max_size = 32M/" $PHPINI
sed -i "s/max_execution_time = .*/max_execution_time = 60/" $PHPINI
sed -i "/^;\?max_input_vars[[:space:]]*=/c\max_input_vars = 20000" $PHPINI
sed -i "s/output_buffering .*/output_buffering = Off/" $PHPINI
echo -e "Установлены лимиты для ${GREEN}${selected_version}${WHITE}:"
echo -e "memory_limit = ${GREEN}256M${WHITE}"
echo -e "upload_max_filesize = ${GREEN}32M${WHITE}"
echo -e "post_max_size = ${GREEN}32M${WHITE}"
echo -e "max_execution_time = ${GREEN}60${WHITE}"
echo -e "max_input_vars = ${GREEN}20000${WHITE}"
echo
echo -e "Ставим ${GREEN}imagick${WHITE}?"
if vertical_menu "current" 2 0 5 "Да" "Нет"
then
Install "${selected_version}-php-pecl-imagick"
#yum install php-pecl-imagick
fi
if ${LocalServer}; then
echo -e ${CURSORUP}"Ставим ${GREEN}Xdebug${WHITE}?${ERASEUNTILLENDOFLINE}"
if vertical_menu "current" 2 0 5 "Да" "Нет"; then
Install "${selected_version}-php-xdebug"
if [[ -e "/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini" ]]; then
{
echo "xdebug.idekey = \"PHPSTORM\""
echo "xdebug.mode = debug"
echo "xdebug.client_port = 9003"
echo "xdebug.discover_client_host=1"
} >>"/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini"
else
echo -e "Файл ${RED}/etc/opt/remi/${selected_version}/php.d/15-xdebug.ini${WHITE} не существует!"
echo -e "Возможны ошибки при установке xdebug."
echo -e "Продолжить установку?"
if vertical_menu "current" 2 0 5 "Да" "Нет"; then
echo "Продолжаем..."
else
RemoveRim
echo "Установка завершена с ошибкой"
exit 1
fi
fi
fi
fi
systemctl enable ${selected_version}-php-fpm
echo
systemctl start ${selected_version}-php-fpm
echo
done
source create_hotlist.sh
create_hotlist
}