Synology Installation et activation automatisé extension REDIS PHP 8.2 / 8.3 /8.4

Ryuzaki

Nouveau membre
23 Février 2025
19
4
13
32
Europe
radislabs.com
Bonjour,
je vous partage un petit script qui mets à jour l' activation redis pour PHP en effet après chaque mis à jour de PHP il faut recréé l' extension.
Attention: je n' utilise pas d'extension officiel synology ( je crois qu' il n'en existe pas) .

Dans un premier temps il faut télécharger et installer REDIS sur votre nas, ajouter une source de paquet:
Name: digitalbox
Emplacement: https://digitalbox.go.zd.fr/

puis installer REDIS dans l' onglet "Communauté"
redis-tuto-1.pngredis-tuto-2.png
Vous pouvez vérifié l'exécution avec les commande ssh ping - pong mais je ne vais pas m' attarder dessus.


Ensuite j' ai créé un dossier partagé nommé ADMIN accessible que par les admin local du nas, dans ce dossier j' ai créé le dossier "script" qui contiendra le script à éxecuter:
redis-tuto-3.png

Puis il faut créé une tache planifier en ROOT qui execute le script avec cette commande:
bash /volume1/ADMIN/script/ensure-php-redis.sh

pour ma part elle est exécuter à chaque démarrage du nas.

vous obtiendrez ensuite l' extension redis pour PHP:
redis-tuto-4.png



Je me suis servie du tutoriel suivant: https://digitalboxweb.wordpress.com/2020/02/01/redis-sur-nas-synology/
Voici le script (Dans mon cas php est sur volume1) :


Bash:
#!/bin/bash
# RADIS Laboratory - Persistance Redis PHP 8.2, 8.3 et 8.4 sur Synology.
# Executer en root via le Planificateur de taches DSM.

set -u
umask 077

LOG="/volume1/ADMIN/script/ensure-php-redis.log"

mkdir -p "$(dirname "$LOG")" || exit 1

log() {
    printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG"
}

backup() {
    local file="$1"
    local dest="${file}.bak.$(date '+%Y%m%d-%H%M%S')"
    cp -p "$file" "$dest" || {
        log "ERREUR : sauvegarde impossible pour $file"
        return 1
    }
    log "Sauvegarde creee : $dest"
}

ensure_version() {
    local version="$1" n="$2"
    local php="/usr/local/bin/php$n"
    local module="/volume1/@appstore/PHP${version}/usr/local/lib/php${n}/modules/redis.so"
    local ini="/usr/local/etc/php${n}/cli/conf.d/extension.ini"
    local json="/volume1/@appstore/PHP${version}/misc/extension_list.json"

    log "===== Debut PHP ${version} ====="

    if [ ! -x "$php" ]; then
        log "ERREUR : binaire PHP absent ou non executable : $php"
        return 1
    fi
    if [ ! -f "$module" ]; then
        log "ERREUR : module Redis absent : $module"
        return 1
    fi
    if [ ! -f "$ini" ] || [ ! -f "$json" ]; then
        log "ERREUR : fichier de configuration absent pour PHP ${version}."
        return 1
    fi

    # extension.ini : ajouter la ligne uniquement si elle n'existe pas.
    if grep -Eq '^[[:space:]]*extension[[:space:]]*=[[:space:]]*redis\.so([[:space:]]*;.*)?$' "$ini"; then
        log "PHP ${version} : extension.ini contient deja redis.so."
    else
        backup "$ini" || return 1
        printf '\nextension = redis.so\n' >> "$ini" || {
            log "ERREUR : ecriture impossible dans $ini"
            return 1
        }
        log "PHP ${version} : entree redis.so ajoutee dans extension.ini."
    fi

    # Valider le JSON avant toute modification.
    "$php" -r '
$d = json_decode(file_get_contents($argv[1]), true);
exit(is_array($d) && json_last_error() === JSON_ERROR_NONE ? 0 : 1);
' "$json" >/dev/null 2>&1 || {
        log "ERREUR : JSON invalide ou illisible : $json"
        return 1
    }

    # Ajouter l'entree redis seulement si la cle est absente.
    if "$php" -r '
$d = json_decode(file_get_contents($argv[1]), true);
exit(array_key_exists("redis", $d) ? 0 : 1);
' "$json"; then
        log "PHP ${version} : entree redis deja presente dans extension_list.json."
    else
        backup "$json" || return 1
        "$php" -r '
$p = $argv[1];
$d = json_decode(file_get_contents($p), true);
if (!is_array($d) || json_last_error() !== JSON_ERROR_NONE) {
    fwrite(STDERR, "JSON invalide\n");
    exit(1);
}
if (!array_key_exists("redis", $d)) {
    $d["redis"] = [
        "enable_default" => true,
        "desc" => "PHPredis extension from REDIS API"
    ];
}
$j = json_encode($d, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
if ($j === false) {
    fwrite(STDERR, "Encodage JSON impossible\n");
    exit(1);
}
$tmp = $p . ".tmp." . getmypid();
if (file_put_contents($tmp, $j . PHP_EOL, LOCK_EX) === false) {
    @unlink($tmp);
    exit(1);
}
if (!rename($tmp, $p)) {
    @unlink($tmp);
    exit(1);
}
' "$json" || {
            log "ERREUR : modification JSON impossible pour PHP ${version}."
            return 1
        }
        log "PHP ${version} : entree redis ajoutee dans extension_list.json."
    fi

    # Tester le chargement de l'extension dans PHP CLI.
    if "$php" -m 2>/dev/null | grep -qi '^redis$'; then
        log "OK : Redis est charge par PHP ${version} CLI."
    else
        log "ATTENTION : Redis ne figure pas dans php -m pour PHP ${version}."
    fi

    log "===== Fin PHP ${version} ====="
    return 0
}

if [ "$(id -u)" -ne 0 ]; then
    log "ERREUR : ce script doit etre execute en root."
    exit 1
fi

failed=0
ensure_version "8.2" "82" || failed=1
ensure_version "8.3" "83" || failed=1
ensure_version "8.4" "84" || failed=1

if [ "$failed" -ne 0 ]; then
    log "Termine avec une ou plusieurs erreurs."
    exit 1
fi

log "Verification des versions PHP 8.2, 8.3 et 8.4 terminee."
exit 0