-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsphp.sh
More file actions
executable file
·312 lines (255 loc) · 10.3 KB
/
sphp.sh
File metadata and controls
executable file
·312 lines (255 loc) · 10.3 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
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#!/bin/zsh
VERSIONSPHP=1.0.8
ZSHRC_PATH="$HOME/.zshrc"
PHP_SYMLINK="/usr/local/bin/php"
SPHP_INSTALL_PATH="/opt/homebrew/bin/sphp"
SPHP_SCRIPT_PATH="$(perl -MCwd -e 'print Cwd::abs_path shift' "$0")"
# Verifica se o Homebrew está instalado
if ! command -v brew &> /dev/null; then
echo "Erro: Homebrew não está instalado. Instale o Homebrew antes de continuar."
exit 1
fi
# Função para instalar o script
instalar_sphp() {
local install_path="${1:-$SPHP_INSTALL_PATH}"
echo "Instalando sphp em $install_path..."
if [ -f "$install_path" ]; then
echo "⚠️ O script já está instalado em $install_path. Substituindo..."
fi
if [ ! -w "$(dirname "$install_path")" ]; then
echo "⛔ A pasta $(dirname "$install_path") não tem permissão de escrita. Tente com sudo."
exit 1
fi
sudo cp "$SPHP_SCRIPT_PATH" "$install_path"
sudo chmod +x "$install_path"
echo "✅ sphp instalado com sucesso em $install_path"
echo "Use 'sphp <comando>' para gerenciar versões do PHP."
if ! echo "$PATH" | grep -q "$(dirname "$install_path")"; then
echo "🔧 Dica: adicione ao seu PATH se necessário:"
echo "export PATH=\"$(dirname "$install_path"):\$PATH\""
fi
}
# Verifica e instala Xdebug se necessário
instalar_xdebug() {
if php -m | grep -iq xdebug; then
echo "✅ Xdebug já está ativado."
return
fi
echo "🔍 Xdebug não está ativo. Tentando instalar via PECL..."
local php_version_major_minor
php_version_major_minor=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
local php_etc_path="/opt/homebrew/etc/php/$php_version_major_minor"
local php_ini="$php_etc_path/php.ini"
# Garante que o diretório etc existe e tem permissão
if [ ! -d "$php_etc_path" ]; then
echo "📁 Criando diretório de configuração: $php_etc_path"
sudo mkdir -p "$php_etc_path"
sudo chown $(whoami) "$php_etc_path"
fi
# Criação do php.ini se ainda não existir
if [ ! -f "$php_ini" ]; then
# Primeiro tenta usar o php.ini carregado atualmente como base
local ini_source_path
ini_source_path=$(php --ini | grep -i "Loaded Configuration" | awk -F': ' '{print $2}' | tr -d ' ')
if [ -f "$ini_source_path" ]; then
echo "📄 Copiando php.ini atual de $ini_source_path para $php_ini"
sudo cp "$ini_source_path" "$php_ini"
else
echo "⚠️ Nenhum php.ini carregado. Criando php.ini básico em $php_ini..."
cat <<EOF | sudo tee "$php_ini" > /dev/null
[PHP]
display_errors = On
error_reporting = E_ALL
EOF
fi
fi
# Instala o Xdebug via PECL se necessário
if ! pecl list | grep -q xdebug; then
yes '' | pecl install xdebug
else
echo "🔁 Xdebug já instalado via PECL."
fi
# Busca o caminho do xdebug.so
local xdebug_so_path
xdebug_so_path=$(find "/opt/homebrew/Cellar" -type f -name "xdebug.so" | grep "$php_version_major_minor" | head -n 1)
# Fallback geral se grep falhar (ex: php sem sufixo)
if [ -z "$xdebug_so_path" ]; then
xdebug_so_path=$(find "/opt/homebrew/Cellar" -type f -name "xdebug.so" | head -n 1)
fi
# Adiciona configuração ao php.ini se necessário
if [ -f "$xdebug_so_path" ]; then
if ! grep -q "xdebug.so" "$php_ini"; then
echo "" | sudo tee -a "$php_ini" > /dev/null
echo "; Xdebug" | sudo tee -a "$php_ini" > /dev/null
echo "zend_extension=\"$xdebug_so_path\"" | sudo tee -a "$php_ini" > /dev/null
echo "xdebug.mode=develop,debug" | sudo tee -a "$php_ini" > /dev/null
echo "xdebug.start_with_request=yes" | sudo tee -a "$php_ini" > /dev/null
echo "✅ Xdebug ativado no $php_ini"
else
echo "⚠️ Xdebug já está configurado em $php_ini"
fi
else
echo "❌ Arquivo xdebug.so não encontrado de forma confiável"
fi
echo "🔄 Reiniciando serviço PHP para aplicar Xdebug..."
brew services restart "$(brew list --formula | grep php | grep -E "@$php_version_major_minor|^php$" | head -n 1)"
}
# Função para atualizar o PATH no ~/.zshrc
atualizar_path_php() {
local php_version="$1"
# Remover todas as entradas antigas do PHP no ~/.zshrc
echo "Removendo entradas antigas do PATH do PHP no ~/.zshrc..."
sed -i '' '/export PATH="\/opt\/homebrew\/opt\/php[^"]*\/bin:[^"]*"/d' "$ZSHRC_PATH"
sed -i '' '/export PATH="\/opt\/homebrew\/opt\/php[^"]*\/sbin:[^"]*"/d' "$ZSHRC_PATH"
# Adiciona a nova versão do PHP no PATH logo abaixo de '## PHP'
echo "Atualizando PATH do PHP no ~/.zshrc..."
if grep -q "## PHP" "$ZSHRC_PATH"; then
sed -i '' '/## PHP/a\
export PATH="/opt/homebrew/opt/php@'"$php_version"'/bin:$PATH"\
export PATH="/opt/homebrew/opt/php@'"$php_version"'/sbin:$PATH"
' "$ZSHRC_PATH"
else
echo "## PHP" >> "$ZSHRC_PATH"
echo "export PATH=\"/opt/homebrew/opt/php@$php_version/bin:\$PATH\"" >> "$ZSHRC_PATH"
echo "export PATH=\"/opt/homebrew/opt/php@$php_version/sbin:\$PATH\"" >> "$ZSHRC_PATH"
fi
echo "Atualização do PATH concluída. Aplicando mudanças..."
source "$ZSHRC_PATH"
}
# Função para instalar uma versão específica do PHP
instalar_php() {
local php_version="$1"
if [[ "$php_version" =~ ^7\. ]]; then
php_formula="shivammathur/php/php@$php_version"
else
php_formula="php@$php_version"
fi
# Verifica se a versão já está instalada
if brew list --formula | grep -q "$php_formula"; then
echo "PHP $php_version já está instalado."
else
echo "Instalando PHP $php_version..."
brew install "$php_formula"
fi
echo "Desativando outras versões do PHP..."
for version in $(brew list --versions | grep -E '^(php|php@|shivammathur/php/php@)' | awk '{print $1}'); do
brew unlink "$version" &> /dev/null
done
echo "Ativando PHP $php_version..."
brew link --force --overwrite "$php_formula"
# Criar um link simbólico para garantir que 'php' use a versão correta
local php_bin_path="/opt/homebrew/opt/php@$php_version/bin/php"
echo "Criando link simbólico para PHP $php_version..."
sudo ln -sfn "$php_bin_path" "$PHP_SYMLINK"
echo "Link simbólico atualizado. Agora 'php' usará a versão $php_version."
# Atualiza o PATH corretamente
atualizar_path_php "$php_version"
# Reinicia o serviço PHP para garantir que a nova versão está rodando
echo "Reiniciando serviço PHP..."
brew services restart "$php_formula"
instalar_xdebug "$php_version"
echo "Versão atual do PHP:"
php -v
}
# Função para remover uma versão do PHP completamente
remover_php() {
local php_version="$1"
if [[ "$php_version" =~ ^7\. ]]; then
php_formula="shivammathur/php/php@$php_version"
else
php_formula="php@$php_version"
fi
# Verifica se o PHP está realmente instalado
if ! brew info "$php_formula" | grep -q "Not installed"; then
echo "Removendo PHP $php_version..."
brew uninstall "$php_formula"
else
echo "Erro: PHP $php_version não está instalado."
exit 1
fi
# Perguntar ao usuário se deseja remover arquivos de configuração
if [ -d "/opt/homebrew/etc/php/$php_version" ]; then
echo "Arquivos de configuração de PHP $php_version ainda estão presentes em '/opt/homebrew/etc/php/$php_version'."
echo "Deseja removê-los? (y/N):"
read resposta
if [[ "$resposta" =~ ^[Yy]$ ]]; then
rm -rf "/opt/homebrew/etc/php/$php_version"
echo "Arquivos de configuração de PHP $php_version removidos."
else
echo "Arquivos de configuração mantidos."
fi
fi
echo "Removendo referências ao PHP $php_version no ~/.zshrc..."
sed -i '' "/export PATH=\"\/opt\/homebrew\/opt\/php@$php_version\/bin:.*/d" "$ZSHRC_PATH"
sed -i '' "/export PATH=\"\/opt\/homebrew\/opt\/php@$php_version\/sbin:.*/d" "$ZSHRC_PATH"
echo "PHP $php_version removido com sucesso."
echo "Se necessário, execute 'source ~/.zshrc' para atualizar seu ambiente."
}
# Função para definir uma versão do PHP como padrão
usar_php() {
local php_version="$1"
# Define corretamente a fórmula dependendo da versão
if [[ "$php_version" == "8.4" ]]; then
php_formula="php"
elif [[ "$php_version" =~ ^7\. ]]; then
php_formula="shivammathur/php/php@$php_version"
else
php_formula="php@$php_version"
fi
local php_bin_path="/opt/homebrew/opt/$php_formula/bin/php"
# Verifica se o PHP está realmente instalado
if ! brew list --formula | grep -E "(php@$php_version|shivammathur/php/php@$php_version|php)"; then
echo "Erro: PHP $php_version não está instalado. Use 'sphp install $php_version' para instalar."
exit 1
fi
echo "Desativando outras versões do PHP..."
for version in $(brew list --versions | grep -E '^(php|php@|shivammathur/php/php@)' | awk '{print $1}'); do
brew unlink "$version" &> /dev/null
done
echo "Ativando PHP $php_version..."
brew link --force --overwrite "$php_formula"
# Criar um link simbólico para garantir que 'php' use a versão correta
echo "Criando link simbólico para PHP $php_version..."
sudo ln -sfn "$php_bin_path" "/usr/local/bin/php"
echo "Link simbólico atualizado. Agora 'php' usará a versão $php_version."
# Atualiza o PATH corretamente
atualizar_path_php "$php_version"
# Reinicia o serviço PHP para garantir que a nova versão está rodando
echo "Reiniciando serviço PHP..."
brew services restart "$php_formula"
instalar_xdebug "$php_version"
echo "Versão atual do PHP:"
php -v
}
# Função para listar versões instaladas do PHP
listar_versoes_php() {
echo "Versões do PHP instaladas:"
brew list --versions | grep -E '^(php@|php|shivammathur/php/php@)' | awk '{print $1 " (" $2 ")"}'
}
# Verifica se o usuário passou argumentos suficientes
if [ "$#" -eq 0 ]; then
echo "Uso: sphp <comando> <versão>"
echo "Comandos disponíveis:"
echo " install <versão> → Instala uma versão do PHP"
echo " use <versão> → Define uma versão do PHP como padrão"
echo " remove <versão> → Remove completamente uma versão do PHP"
echo " list → Lista as versões instaladas"
echo " install-script [path] → Instala o script sphp no caminho especificado (padrão: /opt/homebrew/bin/sphp)"
echo "Exemplo: sphp install 7.4"
echo "Versão: $VERSIONSPHP"
exit 1
fi
COMANDO=$1
VERSAO=$2
case "$COMANDO" in
install) instalar_php "$VERSAO" ;;
use) usar_php "$VERSAO" ;;
remove) remover_php "$VERSAO" ;;
list) listar_versoes_php ;;
install-script) instalar_sphp "$VERSAO" ;;
*)
echo "Erro: Comando inválido."
echo "Use 'sphp install <versão>', 'sphp use <versão>', 'sphp remove <versão>' ou 'sphp list'."
exit 1
;;
esac