Extensions PHP IPS auf Raspberry - wo zum teufel ..?

Hallo zusammen,

leider komme ich nicht weiter.
Kann mir jemand sagen wie ich bei IPS auf dem Raspberry eine PHP Extension aktiviere.
wo ist denn das extension dir unter der IPS Linux Version?

und wie bekomme ich die PDO / SQLITE noch reingeladen…
irgendwie stehe ich auf dem schlauch…

danke+gruß

Das ist leider nicht möglich. Nur die vorhandenen Extensions werden unterstützt.

paresy

dh. es gibt keine möglichkeit weitere PHP Extensions wie unter Windows zu nutzen?

Das ist echt doof. Wollte umstellen auf Linux und benötige Zugriff auf ein paar andere Datenbanken um Werte auszulesen von meiner Wetterstation…

Dürfte für Euch doch kein riesiges Problem sein hier Abhilfe zu schaffen…

Es ist leider ein riesiges Problem. Ansonsten hätten wir schon längst eine Lösung. :wink: Such mal im Forum. Theoretisch kannst du Extensions laden… Aber wie man die passend kompiliert ist die Quizfrage :wink:

paresy

Hallo paresy,

mal so eine Frage:
Wie bindet Ihr PHP in den IPS-Server ein auf einem linux-System?
–> Weil es gibt ja div. Möglichkeiten wie - php-fpm / php-cgi etc.

vg

php-embed :slight_smile:

paresy

ok,
da ist dann der hund leider begraben…
da kommen wir wohl nicht weiter mit extensions - zumal die php extensions unter linux mittlerweile anders genutzt / installiert werden als unter windows mit dll. bzw. .so dateien.

Wie meinst du das? Hast du irgendwo ein offizielles Statement gelesen (Link?), dass php-embed keine Shared Extensions haben kann?

paresy

nein, nichts gefunden.
aber dann wird die implementierung der extensions etc. vermutlich bei euch schwieriger sein.
ob es gegangen wäre php hier als CGI irgendiwe einzubauen bzw. in IPS zu integrieren kann ich nicht beurteilen, da ich die iPS Architektur ja nicht detailliert kenne.

Sofern man Windows (als solches mag) gibt es inzwischen preislich betrachtet Alternativen zu Raspi und Co.
Ein Kompletter Raspi mit Gehäuse / Netzteil / SD Karte kostet auch schnell 100 - 150Euro.
Für das Geld gibt es evtl. „einfache“ Windows 10 Mini PCs aus China (Cenovo MiniPC2 / Onda / Beelink) …
Ich hab gerade ein CENOVO mit Intel x5-z8300, 4GB RAM, 64GB eMMC, Win10 HOme für 100Euro im Test.

och … linux ist fein.
kann man gaaanz viel machen damit. bin grad froh, dass ich meinen windows server in die rente schicken kann…

@paresy:
übrigens hätte ich eine sqlite3.so die liegt bei mir unter:

/usr/lib/php5/20131226/sqlite3.so

kann ich die irgendwie einbinden.
in der php.ini habe ich folgendes:

extension_dir="/usr/share/symcon/ext"
extension=„sqlite3.so“

Verzeichnis ext ist da und die sqlite3.so ist drin.

scheint aber nicht geladen zu werden…

Hallo Paresy,

hier mein Workaround - läuft nun seit 48h :wink: ohne Probleme.
IP-Symcon unter Linux geht ja die sqlite extension nicht mehr.

Deshalb folgender Ansatz:
auf der Linux (Raspberry) läuft ein Python dienst und horcht auf einem Port.
Er nimmt SQL Abfragen engegen und liefert das Ergebnis als JSON Array zurück.

So kann man aus IPS dann auf eine SQLITE oder mit dem gleichen Prinzip sicher auch machbar auf eine mysQL DB zugrifen:

Hier das Python Script (per crontab (@reboot) oder mit einem init-script starten):

#!/usr/bin/python
import socket
import sys
import sqlite3
import string
import json

# Settings
SockID    = 20101
debug     = 0
db = "/mnt/usb1/symcon/user/settings.sqlite"
# Maxium length of Commands to be recieved
recbuffer = 1024

#---------------------- PROGRAM START ------------------------------------------

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server_address = ('0.0.0.0', SockID)


print >>sys.stderr, 'starting up on %s port %s' % server_address
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(server_address)
sock.listen(1)

#Binding DB
print 'DB Connection to: ' + db
dbcon = sqlite3.connect(db)
dbc = dbcon.cursor()

# Listen for incoming connections
data = "NOTHING"
while data != "CLOSE":
    conn, addr = sock.accept();
    if debug == 1:
      print "-------------------------------------------------------"
      print 'Connected with ' + addr[0] + ':' + str(addr[1])

    buff = ''
    while 1:
        data = conn.recv(recbuffer)
        buff += data
        if "|SQLEND" in buff:
          cmd = buff
          if debug == 1:
            print "|SQLEND detected: " + buff
          buff = ""
          break

    cmd = cmd.strip()
    cmds  = cmd.split("|")
    if len(cmds) < 2 :
        print 'Wrong Command Recieved'
        conn.send("ERROR|WRONG COMMAND SYNTAX.")
    else:
        cmd = cmds[0].upper()
        if debug == 1:
          print 'Command Recieved Type: ' + cmds[0] + ", Command: " + cmds[1]

        if cmd == 'PING':
          conn.send("OK")
        elif cmd == "QUIT":
          conn.send("OK")
          data = "CLOSE"
          print "Shutting down server."

        elif cmd == 'SQL':
          if debug == 1:
            print "SQL Execution: " + cmds[1]
          try:
            l = len(cmds[1].strip())
            if l != 0:
              dbc.execute(cmds[1])
              dbcon.commit()
              if debug == 1:
                print "SQL Execution finished."
              query_result = [ dict(line) for line in [zip([ column[0] for column in dbc.description], row) for row in dbc.fetchall()] ]
              if debug == 1:
                print "Send result back to receiver."
              conn.send('OK|' + json.dumps(query_result));


          except sqlite3.Error as er:
            print 'SQL Error: ', er.message
            conn.send('ERROR|'+er.message);
    if debug == 1:
      print "Send |SQLEND."
    conn.send('|SQLEND')
    conn.close()
sock.shutdown(socket.SHUT_RDWR)
sock.close()
dbcon.close()

Und hier die PHP Funktion in IPS um den ‚Dienst anzusprechen‘:


$CONF_HOST = "192.168.178.6";
$CONF_SOCKET  = 20101;


function sckSQL($sql){
      global $CONF_HOST, $CONF_SOCKET;
      $fp = fsockopen($CONF_HOST,$CONF_SOCKET);
		$sql = str_replace("
","",$sql);

      $l = strlen($sql);
      if ($l > 1000){
        # in mehreren Steps übergeben
         $arr = str_split($sql,1000);
		   fwrite($fp,'SQL|');
			foreach ($arr as $line){
	         fwrite($fp, $line, 1000);
        }
    	  fwrite($fp,'|SQLEND');
		}else{
			fwrite($fp, "SQL|$sql|SQLEND");
		}

      $resp = "";
		$resp .= fgets($fp);
	   fclose($fp);
		$reA = explode("|",$resp);
		if($reA[0] == 'OK'){
			$this->SCKERR = false;
			$ret = json_decode($reA[1],true);
			$ret = $ret;
			return $ret;
		}else{
			
			$SCKERR = $reA[1];
			# ggf ausgeben: echo $SCKERR;
			return false;
		}
	}