Aktuell plant die PHP Community einige Extensions mit PHP 8.4 zu entfernen bzw. diese nicht mehr standardmäßig auszuliefern. (PHP: rfc:unbundle_imap_pspell_oci8) Dadurch wird die Verfügbarkeit dieser Erweiterungen ingesamt auf lange Sicht fragwürdig.
Die betroffenen Erweiterungen sind aktuell:
OCI (Oracle)
IMAP (die imap_* Befehle; Nicht unser integriertes IMAP Modul; IMAP über curl_* ist auch weiterhin verfügbar)
psspell
Betroffen sind dabei auch ausschließlich die Windows User - alle anderen Plattformen haben eine vollständig integrierte PHP Version, welche ein festes, von uns ausgewähltes Set an Erweiterungen hat. Keine der o.g. Erweiterungen ist dort Bestandteil. Somit ändert sich dort nichts.
Unter Windows gibt es aber einige Erweiterungen, die aktuell noch optional installiert werden können - insbesondere, wenn ihr von der Version 3.4 oder älter kommt, werden diese Erweiterungen ggf. mitgeschleppt. Interessant ist aber, welche ihr davon auch tatsächlich nutzt und weiter nutzen wollen würdet.
Folgende Erweiterungen habe ich ermittelt, die aktuell noch unter Windows verfügbar sind, aber nicht in den Linux&Co Versionen mitgeliefert werden.
Liste der Erweiterungen, die eher wahrscheinlich in Benutzung sind:
pgsql (PostgreSQL Anbindung)
snmp (Furchtbare Erweiterung, die immer wieder Abstürze verursacht. Sollte dringend durch unser Store Module getauscht werden. Am liebsten würde ich diese Erweiterung bereits zur 7.x entfernen)
sqlite3 (Evtl. noch aus IP-Symcon 3.x Zeiten in Benutzung)
Liste der Erweiterungen, die eher unwahrscheinlich in Benutzung sind:
bzip2
com_dotnet
enchant
ffi (Erst neu seit PHP 8.0)
gettext (Früher im ganz alten HTML4 WebFront in Verwendung. Symcon 2.x Zeiten)
ldap
odbc (Vermutlich werden eher die native Treiber z.B. für MySQL verwendet)
Ich würde gerne herausfinden, wie viele von euch betroffen wären, wenn wir die Windows Version von PHP ebenfalls vollständig integrieren würden und somit auch alle IP-Symcon Versionen in der PHP angleichen würden.
Ich würde zum nächsten 7.0er Update mal einige der „unwahrscheinlichen“ Erweiterungen entfernen, um ein Gefühl dafür zu bekommen, ob ggf. doch jemand diese benutzt. Somit bitte melden, wenn Bedarf für die ein oder andere Erweiterung besteht.
Hi,
ich habe auf die 7er aktuallisiert und mir ist aufgefallen das die ‚php_com_dotnet.dll‘ fehlt.
Ich habe die passende in das „ext“ Verzeichnis koppiert und jetzt läuft es.
Wäre aber super wenn ich das nicht jedesmal manuell machen müsste.
Hallo Paresy,
ich bin gerade auf diesen thread gestoßen, da ich bz2 Dateien vom DWD unzippen wollte.
Die Extension ist in der aktuellen 7.2 nicht verfügbar. Mein Symcon läuft als Docker auf QNAP. Habe daher mal versucht via exec den Befehl bzip2 bzw. über shell Script die Aufgabe zu lösen. Leider wird der Befehl nicht gefunden auch bei Angabe des Pfades (aus which bzip2 geholt). Interessant ist, dass wenn ich den Befehl in ein bash Script schreibe, geht es via Telnet/SSH aber nicht via exec in php von Symcon. Befehl bzip2 nicht gefunden.
Irgendetwas mit den Rechten / Umgebung scheint bei exec nicht zu klappen. Andere Befehle wie ls funktionieren übrigens.
Wäre toll wenn eine der beiden Wege funktionieren würde.
Klaus
Berechtigungen dürften kein Problem sein, solange du INNERHALB der Docker-Pfade bleibst. Eigene PHP Extensions gibts nur unter Windows. Es ist immer schwierig, wenn du schreibst ‚es geht in der Shell‘. Um dazu eine Aussage zu treffen müsste man schon den kompletten Befehl kennen.
Der shell Befehl lautet: /bin/bzip2 -dkf /var/lib/symcon/temp/HG_LATEST_000.bz2
Dieser funktioniert direkt in Telenet/SSH und in einem script test.sh und test.sh in Telenet/SSH gestartet. Das selbe als PHP: $ret = exec(„/bin/bzip2 -dkf /var/lib/symcon/temp/HG_LATEST_000.bz2“ . " 2>&1", $out, $rc); leider nicht (auch ohne " 2>&1", dieser liefert nur noch den vollständigen Fehlertext).
Der Pfad /bin/bzip2 kommt vom linux Befehl which bzip2 aus der Telenet Session.
Vielleicht weißt Du ja eine Lösung.
Danke
Moin Paresy,
erst mal ein gutes neues Jahr. Ich bin eben erst über diesen Thread gestolpert. Mich nervt es sehr, dass der PDO-Treiber nach jedem Update händisch wieder eingebaut werden muss. Da daran bei mir einige zentrale Funktionen hängen und ich manchmal etwas zu vorschnell den Update-Button drücke, gab es schon den einen oder anderen Anranzer meiner Frau. …
Welchen PDO Treiber meinst du genau? Den für MySQL? Wir haben den MySQL ND Treiber standardmäßig mit dabei. Der ist sehr ähnlich zum PDO Treiber. Ggf. wäre es einfach darauf deine Skripte umzubauen.
Hi Paresy,
ich benutze seit Ewigkeiten eine abgewandelte Version von diesem Skript: Script (Klasse) um dauerhaft Variablen bzw. Arrays zu speichern
Das benötigt die Treiber php_pdo_sqlite.dll und php_sqlite3.dll. Aber wahrscheinlich hast Du Recht und ich sollte das Skript mal modernisieren.
Boris
Für Kleinigkeiten nutze ich die Möglichkeit, aus einem Array einen Json String zu machen und diesen String, dann in eine IPS String-Variable zu schreiben. Das klappt eigentlich ganz gut. Wie gesagt, nur wenn es sich um wenige Datensätze handelt. Die Verarbeitungsgeschwindigkeit ist einwandfrei. Man muss den JSON String bei bedarf halt wieder in ein Array umwandeln. Für beides gibt es aber PHP-Funktionen die das erledigen.
Danke für den Tipp, aber bei mir sind es diverse Dinge die ich speichere (ca. 100 Variableninhalte und diverse Arrays), auf die ich dann auch mit einigen anderen Skripten unterschiedlich wieder zugreife. Ich bin mir nicht sicher, ob die Performance dafür reicht, ganz abgesehen davon, dass ich die ganze Logik ändern müsste…
Bezüglich Performance würd ich mir keine Sorgen machen. Wenn du SQLite verwendest, ist es auch nicht viel anders als eine Textdatei. Und die settings.json (dort wo alles drinnen ist) ist im RAM. Somit recht flott.
Für Variableninhalte würd ich normale IPS-Variablen verwenden. Der Zugriff darauf ist auch recht einfach (getvalue, setvalue).
Hallo Wango,
ich nutze SQLITE hier nicht mehr und habe umgebaut.
ich nutze dazu nun folgendes Script: se_datastorage.php
// Datastorage Speicher Klasse -
class eh_datastorage
{
public $ScriptID;
private $fn;
private $data;
private $logCurrent;
public function __construct($dsName = "") {
$this->ScriptID = $_IPS['SELF'];
$this->fn = $this->ScriptID.".ehds.ips.php";
$this->Load();
}
// Sets the name of the save file
public function setname($name){
$this->ScriptID = $name;
$this->fn = $this->ScriptID.".ehds.ips.php";
$this->Load();
}
public function __set($name, $value){
$this->data[$name] = $value;
}
public function __get($name)
{
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
return null;
}
private function Load(){
if(file_exists($this->fn)){
include $this->fn;
$this->data = $ds;
}else {
$this->data = [];
}
}
public function Save(){
// Log anhängen
@$this->data["xx_int_log"] = $this->logCurrent . $this->data["xx_int_log"];
if(strlen($this->data["xx_int_log"]) > 100000){
$this->data["xx_int_log"] = substr($this->data["xx_int_log"], 0, 100000);
}
return file_put_contents($this->fn, '<?php $ds = '.var_export($this->data, true).";?>");
}
public function SetValue($id, $val){
$this->data[$id] = $val;
}
public function GetValue($id){
return @$this->data[$id];
}
public function Delete(){
return unlink($this->fn);
}
public function Show(){
print_r($this->data);
}
public function log($txt=""){
if(empty($txt)) return $this->logCurrent.@$this->data["xx_int_log"];
$lgtxt = date("Y-m-d, H:i:s").", ".$txt;
$this->logCurrent = $lgtxt ."\n".$this->logCurrent ;
}
}
// Gleich Initialisieren
$ds = new eh_datastorage();
dieses kannst Du dann inkludieren und wie folgt verwenden:
include "se_datastorage.php";
/*Optional mit setname kannst du einen Namen definieren, unter welchem die Daten gespeichert werden. (Nützlich, wenn du aus anderen Scripts auf die Werte zugreifen möchtest.
Sonst weglassen, dann nimmt er die Script-ID als namensraum
*/
$ds->setname("heizung_wp");
/* Hier kannst Du was in dein eigenes Log speichern*/
$ds->Log("BLA");
/* Ausgabe */
echo $ds->log();
/* Daten speichern (arrays gehen auch */
$ds->DEIN_NAME = "irgendwas";
// oder
$ds->SetValue("DEIN_NAME ", "Mein Wert");
//lesen mit
echo $ds->DEIN_NAME;
//oder
echo $ds->GetValue("DEIN_NAME")
/* Wichtig ist am Ende des Scripts oder wenn eben gespeichert werden soll aufzurufen:*/
$ds->save();