Neben vielen kleinen Fixes und Verbesserungen, wurden folgende wesentliche Funktionen hinzugefügt:
Traits: Methode zur Wiederverwendung von Code
Erläuterung: Traits ist ein Mechanismus zur Wiederverwendung von Code, der in Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein Trait kann verwendet werden die Beschränkungen der einfachen Vererbung aufzuweichen indem er erlaubt, dass Mengen von Methoden frei in mehreren unabhängigen Klassen die in verschiedenen Klassenhierarchien stecken wiederzuverwenden. Die Semantik der Kombination von Traits und Klassen ist so definiert, dass die Komplexität reduziert wird und die üblichen Probleme vermeidet, die mit Mehrfachvererbung und Mixins in Verbindung gebracht werden.
Ein Trait hat Ähnlichkeit mit einer Klasse ist aber nur dafür vorgesehen Funktionalität in einer feingranularen und konsistenten Art und Weise zu bündeln. Es ist nicht möglich einen Trait aleinstehend zu instantiieren. Es handelt sich um einn Zusatz zur traditionellen Vererbung und erlaubt horizolntale Komposition von Verhaltensweisen, d.h. die Verwendung von Klassenmethoden ohne Vererbung vorauszusetzen.
Built-in webserver für CLI (Command Line Interpreter)
Code wurde von alten „deprecated“ Funktionen gesäubert
Darüber hinaus soll PHP 5.4 deutlich leistungsfähiger sein, vor allem dank der verbesserten Zend Engine.
Es wurde auch einige Funktionen entfernt, die sich ggf. beim Upgrade durch mangelnde Kompatibilität bemerkbar machen könnten.
Register globals, magic quotes und safe mode wurden entfernt
break/continue $var Syntax wurde abgeschafft
allow_call_time_pass_reference wurde aus der php.in entfernt
Wenn man seine E-Mail Adresse oder die von anderen einfach als HTML Code veröffentlicht, besteht die Gefahr, dass die Adressen von Skripten maschinell eingelesen werden, mit dem Zweck diese als Empfänger für Spam zu nutzen. Es gibt einige mehr oder minder effektive Möglichkeiten, die Adressen für Homepagebesucher sichtbar zu machen, aber das automatisierte Ablesen zu erschweren.
Eine davon ist die Adresse von eindeutigen Merkmalen wie @ (jede E-Mail Adresse besitzt bekannterweise genau ein @) oder . (als Trennzeichen zwischen Domain und TLD) zu bereinigen, in dem man diese Zeichen durch Marker ersetzt und zur Laufzeit dann mit den richtigen Zeichen austauscht.
Anrufe zwischen Sipgate Teilnehmern werden automatisch als SIP-Anrufe geroutet, selbst wenn man die „externe“ Telefonnummer anruft. Das hat den Vorteil, dass die Anrufe zwischen den Sipgate Teilnehmern nichts kosten, da die Telefonate über Internet abgewickelt werden. Schön wäre es aber auch zu wissen, wer mich anruft 😉
Problem:
In der From-Header steht dann nicht die Telefonnummer des Anrufers sondern die SIP-URL (z.B. <sip:12345e0@sipgate.de>). Die von Asterisk gesetzte Variable CALLERID(num) beinhaltet dann nur noch die Sipgate SIP-UserID wie z.B. 12345e0. Die an Asterisk angeschlossenen Telefone können meistens damit nichts anfangen. Wenn die ID einen Buchstaben enthält (hier im Beispiel ‚e‚), führt es dazu, dass manch ältere Telefone gar keine Rufnummer anzeigen. Besonders ärgerlich ist es, wenn man einen Anruf verpasst hat und die Rufnummer nicht mehr zuordnen kann, wer tatsächtlich angerufen hat.
Lösungsweg:
Schaut man sich die SIP Header an, stellt man fest, dass die gewünschte Information in dem Headerelement „P-Asserted-Identity“ enthalten ist:
Erläuterung:
5: Wir extrahieren die Nummer mit RegExp und speichern das Ergebnis in die Variable FON.
6: Falls FON nicht null ist, ersetzen wir die CALLERID(num) mit dem Wert von FON.
Hier zwei UseCases und Ausgabe von Asterisk:
Teinehmer für das Beispiel (Telefonnummer, IPs sowie alle TAGs sind verschleiert). Angerufene (Asterisk mit Sipgate-Account):
– Telefonnumber = 072198765432 Anrufer 1 (Fritzbox mit Sipgate-Account):
– Sipgate ID = 12345e0
– Telefonnumber = 072112345678 Anrufer 2 (Mobil):
– Telefonnumber = 017112345678
Case 1: Anrufer 1 (sipgate -> sipgate):
-- Exec...1] NoOp("SIP/sipgate.de-000000b6", "Caller-ID: "" <12345e0>") in new stack
-- Exec...2] NoOp("S..b6", "SIP From: <sip:12345e0@sipgate.de>;tag=CAFEBABE") in new stack
-- Exec...3] NoOp("S..b6", "SIP To : <sip:072198765432@sipgate.de>") in new stack
-- Exec...4] NoOp("S..b6", "SIP PAI : <sip:072112345678@sipgate.de>") in new stack
-- Exec...5] Set("S..b6", "FON=072112345678") in new stack
-- Exec...6] ExecIf("S..b6", "1?Set(CALLERID(num)=072112345678)") in new stack
-- Exec...7] NoOp("S..b6", "Caller-ID: "" <072112345678>") in new stack
-- Exec...8] ...
Exec…5: Die externe Rufnummer des Anrufers wurde in FON reingeschrieben
Exec…6: 1? => Kondition erfüllt => ersetze CALLERID(num)
Exec…7: Verifizierung, dass die Nummer ersetzt wurde (vgl. Exec…1)
Case 2: Anrufer 2 (mobil -> sipgate):
-- Exec...1] NoOp("S..b8", "Caller-ID: "017112345678" <017112345678>") in new stack
-- Exec...2] NoOp("S..b8", "SIP From: "017112345678" <sip:017112345678@sipgate.de>;tag=cafebabe") in new stack
-- Exec...3] NoOp("S..b8", "SIP To : <sip:004972198765432@sipgate.de>") in new stack
-- Exec...4] NoOp("S..b8", "SIP PAI : ") in new stack
-- Exec...5] Set("S..b8", "FON=") in new stack
-- Exec...6] ExecIf("S..b8", "0?Set(CALLERID(num)=)") in new stack
-- Exec...7] NoOp("S..b8", "Caller-ID: "017112345678" <017112345678>") in new stack
-- Exec...8] ...
Exec…5: Patternmatching schlägt fehl, da der Header nicht gesetzt ist, somit is die Variable FONnull.
Exec…6: 0? => Kondition nicht erfüllt => nichts tun
Exec…7: Verifizierung, dass die Nummer unverändert geblieben ist (vgl. Exec…1)
Die Endgräte zeigen nun immer die externe Rufnummer des Anrufers an. Somit kann der Anrufer bei einem verpassten Anruf auch zurückgerufen werden.
Viel Spass,
= C. | SaaS Web Techniklabor =
P.S.: Lustig ist, dass die App von Sipgate auch nur die interne ID anzeigt („Anruf von 12345e0“) und man verwirrt ist, wer nun wirklich anruft…