Linux & php & cli & rrdtool

Se da o aplicație scrisă în php, datele stocate în MySQL, care în final folosește rrdtool pentru a genera grafice cu diverse chestii.
Am lucrat împreuna cu un coleg la aceasta, folosind pentru dezvoltare și test o mașina pe care rulează freeBSD 7.2-STABLE, php5-5.2.11_1, rrdtool-1.3.9, php5-rrdtool-1.00_1 și bineînțeles un apache și un server MySQL.
Pentu actualizare valorilor se rulează cu ajutorul crontab un script php care face operațiile necesare în baza de date și apoi face update la fișierul rrd corespunzător.
Până aici toate bune, mergea minunat.

A trebuit să pun în producție această aplicație pe o mașina care rulează Linux CentOS release 5.5 (Final), php-5.1.6-27.el5, php-cli-5.1.6-27.el5, php-rrdtool-1.0.50-3.el5.rf, rrdtool-1.0.50-3.el5.rf, php-rrdtool-1.0.50-3.el5.rf și la fel un server web și serverul MySQL.
Partea aplicației accesibilă din interfața web funcționa corespunzător, dar nu se generau datele în urma executării script-ului în crontab.
Acum a venit momentul să sap pentru a găsi problema. Modificări de fișiere, redirectare output într-un fișier log, comenzi, editoare. Am găsit în final o chestie dubioasă: scriptul respectiv care trebuia executat cu crontab se executa cu frecvența stabilită, dar fișierul conținea funcția php rrd_update() care nu se executa conform așteptărilor atunci când era apelată de php rulat în CLI. Noroc de funcția rrd_error() care mi-a scuipat imediat mesajul:  „ERROR occurred: opening ‘update’: No such file or directory”.
Căutările pe net mi-au indicat că este un bug în versiunea respectivă de rrdtool, despre care se spune că s-a remediat în următoarea versiune lansată. Cum nu avem drepturi administrative pe mașina pe care rula CentOS și timpul mă presa neputând așteptă update-urile făcute de administrator am găsit o cale de a evita apelarea funcției php rrd_update() și am recurs la un artificiu.
Artificiul respectiv constă în apelarea unui script scris in bash care preia parametrii transmiși și apelează comanda rrdupdate nativă în rrdtool, fără a face uz de funcția rrd_update() din php. Scriptul bash este apelat de către scriptul php folosind funcția system(), transmitându-i totodată și parametrii necesari (numele fișiereului rrd precum șî valorile pentru update).
În fișierul php am folosit cod de genul:

$comanda=$nume_fisier_bash.” „.$nume_fisier_rrd.” „.$data_inregistrare.” „.$valoare_inregistrare;
system($comanda);

Fișierul bash conține ceva de genul:

#!/bin/bash
rrdupdate $1 $2:$3;

Și…chiar funcționează!

PS: Urăsc vi, prefer ee !

Articole asemanatoare:

Bogdan Turcanu

Bogdan Turcanu

One thought on “Linux & php & cli & rrdtool

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.