| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/taschenmuschi-kaufen.de/web/ |
Upload File : |
#!/usr/bin/env bash
# ============================================================
# taschenmuschi-kaufen.de — Local Dev Server Manager
# ============================================================
# Startet einen lokalen PHP-Server aus dem WordPress-Root.
# Standard-Port: 8090
# PID-Datei: .local-server.pid
# Log-Datei: .local-server.log
#
# Usage:
# ./start-local.sh — interaktives Menü
# ./start-local.sh start — Server starten (Port 8090)
# ./start-local.sh start 8123— Server starten auf Port 8123
# ./start-local.sh stop — Server stoppen
# ./start-local.sh status — Status anzeigen
# ./start-local.sh logs — Letzte Logs anzeigen
# ./start-local.sh open — Browser öffnen
# ============================================================
set -u
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$ROOT_DIR" || exit 1
PID_FILE="$ROOT_DIR/.local-server.pid"
LOG_FILE="$ROOT_DIR/.local-server.log"
DEFAULT_PORT=8090
HOST="localhost"
ROUTER="$ROOT_DIR/router.php"
# --- Farben ---
if [[ -t 1 ]]; then
C_BOLD="\033[1m"
C_DIM="\033[2m"
C_RED="\033[31m"
C_GREEN="\033[32m"
C_YELLOW="\033[33m"
C_BLUE="\033[34m"
C_MAGENTA="\033[35m"
C_CYAN="\033[36m"
C_RESET="\033[0m"
else
C_BOLD=""; C_DIM=""; C_RED=""; C_GREEN=""; C_YELLOW=""; C_BLUE=""; C_MAGENTA=""; C_CYAN=""; C_RESET=""
fi
print_header() {
printf "\n${C_BOLD}${C_MAGENTA}╭──────────────────────────────────────────────────────╮${C_RESET}\n"
printf "${C_BOLD}${C_MAGENTA}│${C_RESET} ${C_BOLD}taschenmuschi-kaufen.de${C_RESET} · Local Dev Server ${C_BOLD}${C_MAGENTA}│${C_RESET}\n"
printf "${C_BOLD}${C_MAGENTA}╰──────────────────────────────────────────────────────╯${C_RESET}\n"
}
info() { printf "${C_CYAN}ℹ${C_RESET} %s\n" "$1"; }
ok() { printf "${C_GREEN}✔${C_RESET} %s\n" "$1"; }
warn() { printf "${C_YELLOW}⚠${C_RESET} %s\n" "$1"; }
err() { printf "${C_RED}✖${C_RESET} %s\n" "$1"; }
# --- Helpers ---
is_port_in_use() {
local port=$1
if command -v ss >/dev/null 2>&1; then
ss -ltn "( sport = :$port )" 2>/dev/null | grep -q ":$port"
elif command -v lsof >/dev/null 2>&1; then
lsof -iTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1
elif command -v netstat >/dev/null 2>&1; then
netstat -ltn 2>/dev/null | grep -q ":$port "
else
return 1
fi
}
is_server_running() {
[[ -f "$PID_FILE" ]] || return 1
local pid
pid=$(<"$PID_FILE")
[[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null
}
current_port_from_log() {
if [[ -f "$LOG_FILE" ]]; then
grep -oE "Development Server.*started" "$LOG_FILE" 2>/dev/null | tail -1 >/dev/null
grep -oE "$HOST:[0-9]+" "$LOG_FILE" 2>/dev/null | head -1 | cut -d: -f2
fi
}
ensure_php() {
if ! command -v php >/dev/null 2>&1; then
err "PHP ist nicht installiert. Bitte zuerst PHP installieren."
return 1
fi
}
# --- Aktionen ---
start_server() {
local port=${1:-$DEFAULT_PORT}
ensure_php || return 1
if is_server_running; then
warn "Server läuft bereits (PID $(<"$PID_FILE")). Stoppe ihn zuerst."
return 1
fi
if is_port_in_use "$port"; then
err "Port $port ist bereits belegt. Wähle einen anderen Port."
return 1
fi
# Eigener Router (router.php): liefert statische Assets + wp-admin/index.php direkt aus
# und reicht alle übrigen Requests an WordPress' index.php weiter (Pretty Permalinks).
#
# PHP_CLI_SERVER_WORKERS (PHP ≥ 7.4): forkt N Worker-Prozesse, sodass langlaufende
# Requests (z.B. AJAX-Import) nicht den gesamten Server blockieren. 4 Worker reichen
# für typisches lokales Browsen + parallelen Hintergrund-Job.
local workers=${PHP_CLI_SERVER_WORKERS:-4}
info "Starte PHP-Server auf ${C_BOLD}http://$HOST:$port${C_RESET} (Workers=$workers) …"
PHP_CLI_SERVER_WORKERS="$workers" nohup php -S "$HOST:$port" -t "$ROOT_DIR" "$ROUTER" \
> "$LOG_FILE" 2>&1 &
local pid=$!
echo "$pid" > "$PID_FILE"
sleep 0.6
if is_server_running; then
ok "Server läuft. PID=$pid"
ok "Adresse: ${C_BOLD}http://$HOST:$port${C_RESET}"
ok "Logs: $LOG_FILE"
else
err "Server konnte nicht gestartet werden. Siehe Log:"
tail -n 20 "$LOG_FILE" 2>/dev/null
rm -f "$PID_FILE"
return 1
fi
}
stop_server() {
if ! is_server_running; then
warn "Es läuft kein Server (PID-Datei fehlt oder Prozess tot)."
rm -f "$PID_FILE"
return 0
fi
local pid
pid=$(<"$PID_FILE")
info "Stoppe Server (PID $pid) …"
kill "$pid" 2>/dev/null
sleep 0.4
if kill -0 "$pid" 2>/dev/null; then
warn "Sanftes Stoppen fehlgeschlagen — sende SIGKILL."
kill -9 "$pid" 2>/dev/null || true
sleep 0.2
fi
rm -f "$PID_FILE"
ok "Server gestoppt."
}
server_status() {
if is_server_running; then
local pid port
pid=$(<"$PID_FILE")
port=$(current_port_from_log)
port=${port:-$DEFAULT_PORT}
ok "Server läuft. PID=$pid · http://$HOST:$port"
else
info "Kein Server aktiv."
fi
}
show_logs() {
if [[ ! -f "$LOG_FILE" ]]; then
warn "Keine Logs vorhanden."
return 0
fi
info "Letzte 30 Zeilen aus $LOG_FILE :"
printf "${C_DIM}"
tail -n 30 "$LOG_FILE"
printf "${C_RESET}\n"
}
open_browser() {
local port
port=$(current_port_from_log)
port=${port:-$DEFAULT_PORT}
local url="http://$HOST:$port"
if ! is_server_running; then
warn "Server läuft nicht. Bitte zuerst starten."
return 1
fi
info "Öffne $url im Browser …"
if command -v xdg-open >/dev/null 2>&1; then
xdg-open "$url" >/dev/null 2>&1 &
elif command -v open >/dev/null 2>&1; then
open "$url"
elif command -v gio >/dev/null 2>&1; then
gio open "$url" >/dev/null 2>&1 &
else
warn "Kein Browser-Opener gefunden. Öffne manuell: $url"
fi
}
# --- Interaktives Menü ---
ask_port() {
local port
read -r -p "Port (default 8090): " port
port=${port:-8090}
if ! [[ "$port" =~ ^[0-9]+$ ]] || (( port < 1 || port > 65535 )); then
err "Ungültiger Port."
return 1
fi
start_server "$port"
}
interactive_menu() {
while true; do
print_header
server_status
echo
printf " ${C_BOLD}1${C_RESET} Server starten auf Port ${C_BOLD}$DEFAULT_PORT${C_RESET}\n"
printf " ${C_BOLD}2${C_RESET} Anderen Port wählen\n"
printf " ${C_BOLD}3${C_RESET} Server stoppen\n"
printf " ${C_BOLD}4${C_RESET} Status anzeigen\n"
printf " ${C_BOLD}5${C_RESET} Logs anzeigen\n"
printf " ${C_BOLD}6${C_RESET} Browser öffnen\n"
printf " ${C_BOLD}0${C_RESET} Beenden\n"
echo
read -r -p "Auswahl: " choice
echo
case "$choice" in
1) start_server "$DEFAULT_PORT" ;;
2) ask_port ;;
3) stop_server ;;
4) server_status ;;
5) show_logs ;;
6) open_browser ;;
0) info "Bye"; exit 0 ;;
*) warn "Ungültige Auswahl." ;;
esac
echo
read -r -p "Enter drücken, um zum Menü zurückzukehren …" _
done
}
# --- CLI Dispatcher ---
main() {
if [[ $# -eq 0 ]]; then
interactive_menu
return
fi
case "$1" in
start) shift; start_server "${1:-$DEFAULT_PORT}" ;;
stop) stop_server ;;
status) server_status ;;
logs) show_logs ;;
open) open_browser ;;
restart) stop_server; start_server "${2:-$DEFAULT_PORT}" ;;
-h|--help|help)
cat <<USAGE
Usage:
$0 — interaktives Menü
$0 start [PORT] — Server starten (Default 8090)
$0 stop — Server stoppen
$0 status — Status anzeigen
$0 logs — Logs anzeigen
$0 open — Browser öffnen
$0 restart [PORT] — Neustart
USAGE
;;
*)
err "Unbekannter Befehl: $1"
"$0" --help
exit 1
;;
esac
}
main "$@"