PHP8 und xmlrpc

Hallo, ich habe zum Test meinen Raspi auf PHP 8.0.3 upgedated.
Wenn ich nun per PHP Messwerte von Homegear abfrage, kommt dieser Fehler im PHP Logfile gleich beim ersten “$Client->listInterfaces();”:

==> php8.0-cli.log <==
[14-Mar-2021 15:22:04 Europe/Berlin] PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlrpc.so' (tried: /usr/lib/php/20200930/xmlrpc.so (/usr/lib/php/20200930/xmlrpc.so: undefined symbol: XML_GetErrorCode), /usr/lib/php/20200930/xmlrpc.so.so (/usr/lib/php/20200930/xmlrpc.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
[14-Mar-2021 15:22:04 Europe/Berlin] PHP Fatal error:  Uncaught Error: Call to undefined function XMLRPC\xmlrpc_encode_request() in /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php:227
Stack trace:
#0 /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php(235): XMLRPC\Client->send()
#1 /opt/automation/test_temp.php(26): XMLRPC\Client->__call()
#2 {main}
  thrown in /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php on line 227
[14-Mar-2021 15:25:01 Europe/Berlin] PHP Warning:  PHP Startup: Unable to load dynamic library 'xmlrpc.so' (tried: /usr/lib/php/20200930/xmlrpc.so (/usr/lib/php/20200930/xmlrpc.so: undefined symbol: XML_GetErrorCode), /usr/lib/php/20200930/xmlrpc.so.so (/usr/lib/php/20200930/xmlrpc.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
[14-Mar-2021 15:25:02 Europe/Berlin] PHP Fatal error:  Uncaught Error: Call to undefined function XMLRPC\xmlrpc_encode_request() in /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php:227
Stack trace:
#0 /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php(235): XMLRPC\Client->send()
#1 /opt/automation/automation_mtr.php(351): XMLRPC\Client->__call()
#2 /opt/automation/automation_mtr.php(411): readMeter()
#3 {main}
  thrown in /var/lib/homegear/scripts/HM-XMLRPC-Client/Client.php on line 227

Es ist wohl eine Inkompatibilität mit oder von “xmlrpc”.

Installiert ist:

libhomegear-base: 0.8.0-3101
libhomegear-node: 0.1.7-53
libhomegear-ipc: 0.1.2-42
php8.0-xmlrpc (ganz normal via ‘apt install’)
Version von xmlrpc: 3:1.0.0~rc2-5+0~20210223.4+debian10~1.gbp4dc175

Jemand einen Tipp wie ich das wieder zum Laufen bringe? Danke!

Etwas weiter und ein anderer Fehler. Habe gelernt, dass xmlrpc ab PHP 8 nur noch über PECL installiert werden kann. Erst nachdem ich mein PHP Repository von http://repozytorium.mati75.eu/raspbian zu https://packages.sury.org/php geändert und php8.0-dev sowie libxml2-dev installiert hatte, konnte ich PECL xmlrpc mit pecl install channel://pecl.php.net/xmlrpc-1.0.0RC2 installieren.

Nun kommt beim Aufruf eines PHP Skripts zum Lesen von Messwerten, wieder an der Stelle $Client->listInterfaces();, der Fehler:

php: symbol lookup error: /usr/lib/php/20200930/xmlrpc.so: undefined symbol: XML_ParserCreate

Homegear selbst scheint jetzt lt. Logfiles keinen Fehler mehr zu haben. Wobei listInterfaces(); ja Teil von Homegear ist. Es ist schon mühsam…

Freue mich über Tipps…

Nächste Erkenntnis. Homegear kann wohl von meinen Temperatur Sensor via meinen Nano (als Homegear Gateway) die Werte lesen:

03/14/21 21:09:33.112 Module HomeMatic BidCoS: Info: TEMPERATURE on channel 1 of HomeMatic BidCoS peer 1 with serial number REQ0101579 was set to 0x0002.
03/14/21 21:09:33.113 Module HomeMatic BidCoS: Info: TEMPERATURE on channel 2 of HomeMatic BidCoS peer 1 with serial number REQ0101579 was set to 0x0006.
03/14/21 21:09:33.115 Module HomeMatic BidCoS: Info: TEMPERATURE on channel 3 of HomeMatic BidCoS peer 1 with serial number REQ0101579 was set to 0xFFFC.
03/14/21 21:09:33.116 Module HomeMatic BidCoS: Info: TEMPERATURE on channel 4 of HomeMatic BidCoS peer 1 with serial number REQ0101579 was set to 0x0004.

Was nicht geht, die Werte via PHP aus Homegear rausholen. So zumindest meine Interpretation des Fehlers oben…

Update 14.03: Innerhalb Homegear kann ich die Werte lesen. Liegt also am “externen” PHP Interface.

> rc print_r($hg->getValue(1,1,"TEMPERATURE"))
0.6>
> rc print_r($hg->getValue(1,2,"TEMPERATURE"))
1.1>
> rc print_r($hg->getValue(1,3,"TEMPERATURE"))
-0.5>
> rc print_r($hg->getValue(1,4,"TEMPERATURE"))
0.5>

Update 15.03: Bis ich eine Lösung habe, verwende ich homegear -e Aufrufe um an meine Werte zu kommen. Z.B.:

function hgClientValue($device,$channel,$value) {
	$cmd = "homegear -e rc 'echo serialize(\$hg->getValue(".$device.",".$channel.",\"".$value."\"))'";
	return unserialize(exec($cmd));
} # hgClientValue
$tempVal1 = floatval(hgClientValue(1,1,"TEMPERATURE"));

Durch das serialize & unserialize bekomme ich die gleichen Datenobjekte (array, bool, etc.) wie vorher.

Update 2 15.03: Wie kann ich verhindern, dass Folgendes ins Logfile geschrieben wird?

03/15/21 11:20:02.391 Info: Script with id 337 finished with exit code 0
03/15/21 11:20:02.653 Info: Script with id 338 finished with exit code 0
03/15/21 11:20:02.899 Info: Script with id 339 finished with exit code 0
03/15/21 11:20:03.160 Info: Script with id 340 finished with exit code 0
03/15/21 11:20:03.410 Info: Script with id 341 finished with exit code 0
03/15/21 11:20:03.653 Info: Script with id 342 finished with exit code 0

Immer noch ratlos warum der direkte Aufruf den xmlrpc Fehler bringt…

Es scheint ein Fehler in xmlrpc zu sein. Ich bin schon mit dem Developer in Kontakt. Schreibe hier wenn ich das Problem gelöst habe.

Aber kann mir noch jemand mit dem Verhindern von “finished with exit code 0” im Logfile einen Tipp geben? Danke! Debuglevel ist btw. 3.

Update: Habe das Thema Info-Messages im Logfile & Debuglevel 3 im Fehler-Board hier fortgesetzt…

Update 2: Ich habe bzgl. dem xmlrpc Thema ein Issue auf Github eröffnet. Ich berichte hier über Ergebnisse: Missing symbols in php8.0-xml? Causes problem with PECL xmlrpc · Issue #1576 · oerdnj/deb.sury.org · GitHub.

Update 3: Das Github Issue wurde geschlossen. Auch geht es (noch) etwas über meine Linux Kenntnisse hinaus. Ich warte mal ob der Maintainer von PECL xmlrpc eine neue Version erstellt oder ob Homegear etwas ändert, jetzt da mit PHP 8 xmlrpc nicht mehr Teil des Cores ist. Bis dahin verwende ich den Workaround mit homegear -e rc der, bis auf das kleine Thema mit den Logeinträgen, ganz gut funktioniert.

1 Like

Mein Homegear & xmlrpc Problem konnte ich nun mit Hilfe des xmlrpc PECL Maintainers Christoph und Ondřej Surý, der unter packages.sury.org/php die PHP Pakete bereitstellt, lösen.

Das musste ich machen:

$ wget https://pecl.php.net/get/xmlrpc-1.0.0RC2.tgz
$ tar -xvzf xmlrpc-1.0.0RC2.tgz
$ cd xmlrpc-1.0.0RC2/
$ export CPPFLAGS=-I/usr/include/libxml2/
$ phpize
$ ./configure --with-expat
$ make
$ make install

Und extension=xmlrpc in die betroffenen php.ini's eintragen. Hier /etc/php/8.0/cli/php.ini.

Das Wesentliche dabei ist CPPFLAGS=-I/usr/include/libxml2/ und --with-expat.
Damit funktionieren bei mir Homegear PHP Aufrufe mit z.B. include("Connect.php"); und $interfaceList = $Client->listInterfaces(); wieder.

Danke an Christoph und Ondřej :slight_smile:

1 Like

WOW! Super!

Trotzdem sollte sich das @sathya nochmal angucken.