Archives

Synology : PHP en ligne de commande

Au moment de la sortie de cet article nous sommes en DSM 6 , il y a plusieurs versions de php qui cohabite : vous pouvez  installer la 5.6 (ou la 7) par l’intermédiaire du gestionnaire de paquet, puis dans l’interface webstation du DSM seule les versions que vous avez installées (5.6 ou 7) apparaissent , du coup pas de soucis.

par contre quand on veut utiliser la ligne de commande ( comme par exemple pour lancer un script php via la crontab(ou planificateurs de tache) , on se rend compte qu’une ancienne version reste accessible et vient nous pourrir la vie.

la commande normale pour lancer un script php est :

php -f  /volume1/test/monscript.php

mais la ça pointe sur la vieille version , pour lancer la nouvelle il faut faire :

php56 -f  /volume1/test/monscript.php


Autre problème : si vous voulez utiliser une extension php , il faut savoir que l’installation du serveur php web (PHP-CGI) du webstation est différente de l’installation de php en ligne de commande (PHP-CLI) , du coup les extension activées dans webstation ne le sont pas en ligne de commande.

de quoi se creuser la tête un bout de temps.

par exemple si vous utilisez l’extension mysqli dans votre site web sur le webstation  ,et bien en ligne de commande ca ne marchera pas . vous aurez une erreur du style

Fatal error: Call to undefined function mysqli_connect() 

il va donc falloir activer les extensions en ligne de commande :

recherchez  le php.ini :

php56 --ini

Configuration File (php.ini) Path: /usr/local/etc/php56
Loaded Configuration File: /usr/local/etc/php56/php.ini
Scan for additional .ini files in: /usr/local/etc/php56/conf.d
Additional .ini files parsed: /usr/local/etc/php56/conf.d/webstation-extensions.ini

copier le fichier /usr/local/etc/php56/php.ini dans le répertoire de votre script puis modifier le et ajoutez la ligne suivante dans la rubrique [PHP]

extension = mysqli.so

ensuite utilisez ce nouveau php.ini  dans votre ligne de commande :

php56 -c  /volume1/test/php.ini  -f  /volume1/test/monscript.php

une autre méthode est d’éditer directement le fichier /usr/local/etc/php56/php.ini , par contre je ne sais pas si ça résiste a une mise a jour du DSM.

Visualisation des données sur une page web

La série d’articles :

Partie 1 : Installation capteur DS18B20 et lecture en ligne de commande
Partie 2 : Lecture des valeurs avec un script Python basique
Partie 3 : Lecture des valeurs avec un script Python avancé et stockage dans une base MySQL
Partie 4 : Visualisation des données sur une page web

Dans la partie 3 de cet article nous avons vu comment stocker la température dans une base MySQL.

Le moment est venu d’afficher de jolies courbes sur une page web.

matériel necessaire :

  • une base MySQL
  • un serveur web avec php 5.6 (pour php 7 voir le commentaire de Bertrand plus bas)

Je vais vous montrer un exemple simple qui vous mettra le pied a l’étrier , ensuite vous n’aurez plus qu’a laisser parler votre imagination.

Temperature

Pour cela je vais utiliser une librairie de graphique qui s’appelle Highcharts. Elle est très connue, gratuite et il y a des tonnes d’info sur le web. Il n’y a rien a installer , on charge simplement la librairie au début de la page html

J’ai créé un exemple très simple en ne gardant que le strict nécessaire afin de rester le plus clair possible. il suffit de coller ce code dans un fichier index.php. ce code est prévu pour 2 sondes. nous supposerons que la table « PiTemp » contient ces champs « date, sonde1,sonde2 »

  • la partie HEAD permet de charger la librairie Highchart et JQuery
  • la partie php permet d’interroger la base et de préparer les données
  • la partie javascript permet d’afficher le graphique. cette partie n’est pas à écrire vous même , il suffit de copier/coller un exemple depuis le site highcharts.com puis de personnaliser vos options
<!DOCTYPE html>
<html>
<head>
    <title>Mes Temperatures</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="http://code.highcharts.com/highcharts.js"></script>

</head>

<body>

<?php
// ************* preparation de la connexion a MySQL ****************************
    $hostname = "localhost";
    $database = "maBase";
    $username = "monUser";
    $password = "monPassword";

    function connectMaBase($hostname, $database, $username, $password){
        $Conn = mysql_connect ($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR);
        mysql_select_db($database, $Conn);
    }

// ************* preparation de la requete **************************************
    $query1 = "SELECT date, sonde1,sonde2 FROM PiTemp
                ORDER BY `date` DESC  LIMIT 4000";

// connexion mysql et lancement requete *****************************************
    connectMaBase($hostname, $database, $username, $password); // on ouvre la base
    $req1 = mysql_query($query1) ; // on lance la requete
    mysql_close(); // on ferme la base

// ********** traitement du resultat ********************************************
    while($data = mysql_fetch_assoc($req1)) {
        $dateD = strtotime($data[date]) * 1000; //transforme la date MySQL en timestamp
        $liste1[] = "[$dateD, $data[sonde1]]"; // format data pour highchart [x,y],[x,y].....
        $liste2[] = "[$dateD, $data[sonde2]]";
    }
    $liste1 = join(',', array_reverse($liste1)); // on inverse l'ordre car la requete SQL sort le resultat a l'envers
    $liste2 = join(',', array_reverse($liste2));

?>
<div id="graphique0"></div>
<script type="text/javascript">
//**ceci est du code Highcharts.com*************************************************************************
//** vous pouvez trouver toutes les decriptions des options sur le site officiel****************************
// temperature
$(function() {
    chart1 = new Highcharts.Chart({
        chart: {
            renderTo: 'graphique0',
            type: 'spline',
            zoomType: 'x',
            backgroundColor: null,
        },
        title: {
            text: 'Temperatures',
            style:{
                color: '#4572A7',
            },
        },
        legend: {
            enabled: true,
            backgroundColor: 'white',
            borderRadius: 14,
        },
        xAxis: {
            type: 'datetime',
            dateTimeLabelFormats: {
                month: '%e. %b',
                year: '%b',
            }
         },
        yAxis: [{
            labels: {
                format: '{value} °C',
                style: {
                    color: '#C03000',
                },
            },
            title: {
                text: '',
                style: {
                    color: '#C03000',
                },
            }
        }],
        tooltip: {
            shared: true,
            crosshairs: true,
            borderRadius: 6,
            borderWidth: 3,
            xDateFormat: '%A %e %b  %H:%M:%S',
            valueSuffix: ' °C',
         },
        plotOptions: {
            spline: {
                marker: {
                    enabled: false,
                },
            },
        },

        series: [{
            name: 'sonde1',
            color: 'red',
            zIndex: 1,
            data: [<?php echo $liste1; ?>] // c'est ici qu'on insert les data
        }, {
            name: 'sonde2',
            color: 'blue',
            zIndex: 2,
            data: [<?php echo $liste2; ?>] // c'est ici qu'on insert les data
        }]
    });
});
</script>

</body>
</html>