Archive for the ‘PHP’ Category
Einen LDAP-Server/ActiveDirectory administrieren mit Zend_Ldap
Ein Directory-Server zur zentralen Administration von Benutzeraccounts, Adressbüchern und anderen Resourcen aller Art ist eine feine Sache, sobald man mehrere Rechner, Dienste und/oder Benutzer zu administrieren hat. Nicht nur im Firmenumfeld, auch zu Hause haben IT-Spezies mehr und mehr einen LDAP (Leightweight Directory Access Protocol)-kompatiblen Server, der die genannten Informationen zentral zur Verfügung stellt.
Ohne hier detailliert auf die Vorteile eingehen zu wollen, kann man zum Beispiel viele Dienste mit den zentralen Benutzeraccounts auf dem LDAP-Server verbinden (evtl. mittels Samba, aber das soll hier nicht Thema sein), und so braucht sich ein Benutzer nur ein Passwort merken und dieses regelmäßig ändern anstatt für jeden Dienst einen eigenen Account zu haben. Ein Benutzer kann sich dann beispielsweise an jedem Rechner der Firma anmelden, sein Email-Kennwort ist das selbe, der FTP-Zugang ist auch automatisch verfügbar mit dem selben Kennwort, es können Rechte zentral verwaltet werden, und im Falle des Ausscheidens des Mitarbeiters muss man nur einen Account löschen und er hat nirgends mehr Zugriff. Natürlich können auch alle Intranet-Webseiten dann diese Login-Informationen nutzen, sodass nicht auf jeder Intranetseite ein separater Account angelegt und verwaltet werden muss (Stichwort Zend_Auth_Adapter_Ldap). Soweit die Theorie.
Auch ist es möglich, sein Adressbuch auf einem LDAP-Server zu speichern und dieses dann von überall nutzen zu können: via Webapplikation, Thunderbird, Outlook, Mail.app, wohlmöglich ein Software-IP-Telefon und und und. Das geht zum Beispiel nicht mit einer Datenbank.
Es gibt im Großen und Ganzen 2 bekannte Produkte auf dem Markt: OpenLDAP und ActiveDirectory von Microsoft. Beide Dienste bieten die oben genannten angerissenen Möglichkeiten und lassen sich via LDAP abfragen und manipulieren.
Nun zu PHP und Zend_Ldap: Wir können uns also zum LDAP-Dienst verbinden und dort neue Objekte anlegen, diese editieren, löschen, verschieben und vieles mehr. Im Folgenden zeige ich Euch am Beispiel von einem OpenLDAP-Server, wie man das sehr einfach machen kann.
Noch einige Grundlagen, damit der Code auch verständlicher ist:
- Wurzel: Die Wurzel eines LDAP-Servers ist häufig eine Organisation (o) oder eine Domain (wird dann via dc benannt)
- ou: Organisational Unit, wird zur Strukturierung (vgl. „Ordner“) genutzt, sodass sich ein Baum bildet
- dn: Distinguished Name, das ist der vollständige Pfad zu einem Objekt
- objectclass: Ein Objekt gehört mindestens einer (strukturellen) Klasse an, die die Attribute bestimmt und soetwas wie eine Schablone ist
- … weitere Informationen finden sich im entsprechenden LDAP-Wikipedia Eintrag.
Die Baumstruktur sieht dann beispielsweise so aus:
Ein Objekt in diesem Baum sieht dann zum Beispiel so aus:
Und so greifen wir dann darauf zu:
$options = array( 'host' => '10.12.13.14', 'username' => 'cn=michael,ou=Users,dc=test,dc=de', 'password' => '123456', 'bindRequiresDn' => true, 'accountDomainName' => 'test.de', 'baseDn' => 'dc=test,dc=de', ); $ldap = new Zend_Ldap($options); $ldap->bind();
Wir übergeben dem Konstruktor also die nötigen Daten und authentifizieren uns (bind()). Danach können wir, wenn die Authentifizierung geklappt hat und wir die entsprechenden Rechte in den OUs haben, Daten abfragen, zum Beispiel ein bestimmtes Objekt holen:
$user1 = $ldap->getEntry('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de'); /* array( * 'dn' => 'cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de', * 'cn' => array('user1'), * 'givenname' => array('Klaus'), * .... */
Ein Objekt verändern ist auch sehr einfach:
$user1 = $ldap->getEntry('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de'); Zend_Ldap_Attribute::setAttribute($user1, 'displayName', 'User Eins'); $ldap->update('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de', $user1);
Ein neues Objekt fügen wir folgendermaßen hinzu:
$user2 = array(); Zend_Ldap_Attribute::setAttribute($user2, 'cn', 'UserZwei'); Zend_Ldap_Attribute::setAttribute($user2, 'objectClass', 'inetorgPerson'); $ldap->add('cn=UserZwei,ou=michael,ou=Addressbook,dc=test,dc=de', $user2);
Ein Objekt löschen könnte einfacher nicht sein:
$ldap->delete('cn=UserZwei,ou=michael,ou=Addressbook,dc=test,dc=de');
Suchen können wir natürlich auch nach verschiedenen Kriterien, beispielsweise so:
$filter1 = Zend_Ldap_Filter::begins('cn', $searchString); $filter2 = Zend_Ldap_Filter::begins('sn', $searchString); $filter3 = Zend_Ldap_Filter::begins('gn', $searchString); $filter4 = Zend_Ldap_Filter::contains('displayname', $searchString); $filter5 = Zend_Ldap_Filter::contains('mail', $searchString); $filter = Zend_Ldap_Filter::orFilter($filter1, $filter2, $filter3, $filter4, $filter5); $results1 = $ldap->searchEntries($filter); $results2 = $ldap->search($filter);
search() und searchEntries() unterscheiden sich nur im Rückgabewert. Einmal erhalten wir ein Zend_Ldap_Collection Objekt und einmal ein einfaches Array mit den Ergebnissen.
Damit sollten die oft gebrauchten Anwendungsfälle abgedeckt sein. Weitere Informationen gibt es natürlich im Manual des Zend Frameworks zu Zend_Ldap.
Zwei Variablenwerte tauschen
Gestern bin ich auf eine interessante Aufgabe gestossen. Eigentlich war es ein sehr einfacher Test bei einem Bewerbungsgespräch an einen Software-Entwickler-Kandidaten. Die Aufgabe lautete:
„Du hast 2 Variablen mit 2 Werten belegt. Tausche die beiden Werte schnell und effektiv aus.“
Die Erwartung war: Wenn der Kandidat nicht sofort anfängt, eine temporäre dritte Variable zu erstellen, hat er sehr wenig Programmiererfahrung.
$a = 5; $b = 13; $c = $a; $a = $b; $b = $c;
Doch wenn man genauer überlegt, gibt es viele weitere Lösungen, um die Aufgabe zu bewältigen, auch ohne eine dritte Variable. Hier ein paar schöne Lösungen:
$a = 5; $b = 13; $a += $b; $b = $a - $b; $a -= $b;
Bei dem obigen Beispiel gab es eine kleine Diskussion, ob ein Integer-Overflow Probleme machen könnte, dem ist aber nicht so.
$a = 5; $b = 13; $a ^= $b; $b ^= $a; $a ^= $b;
Tricky, aber funktioniert: mit der XOR Funktion klappt es wunderbar. Achtung: Hier wir das bitweise XOR verwendet, nicht das logische XOR.
Aber aufgepasst: Die obigen zwei Lösungen funktionieren nur mit ganzzahligen Werten! Stünden in den Variablen Strings, Objekte, Arrays oder sonstwas drin, würden die Lösungen scheitern. Und streng genommen ist in der Aufgabenstellung nirgends von Zahlen die Rede.
Hier noch ein Beispiel, das mit nur einer Zeile auskommt und jegliche Werte tauschen kann:
$a = 5; $b = 13; list($a, $b) = array($b, $a);
—————-
Edit:
Lösung von Tyco aus den Kommentaren:
$a = 5; $b = 13; $b = $b + $a – ($a = $b);
—————-
Es gibt also auch Lösungen, die ohne eine temporäre dritte Variable auskommen. Von der Lesbarkeit und Wartbarkeit sind die erste und die vierte Lösung wohl auch vorn.
Wer kann noch weitere schöne Lösungen beisteuern?
Die große PHP-Blog-Sammlung
Ein Bekannter fragte mich letztens, wieviele halbwegs aktuelle deutsche PHP-Blogs es gibt, die auch etwas Niveau haben, und ich konnte nicht anders antworten als „Pff, öhh, gute Frage, ich würde schätzen X, aber ich selbst kenne nur 5 davon“.
Problematisch sind bei diesen Kriterien vor allem „halbwegs aktuell“ und „etwas Niveau“. Es gibt in diversen Link-Katalogen sicherlich einige Links zu finden, aber viele davon bringen einen zu Blogs, die seit vielen Monaten oder Jahren nicht mehr aktualisiert werden. Genauso findet man Blogs, die von PHP-Neulingen gestartet wurden und das Lernen von PHP dokumentieren. Nichts gegen diese Blogs, sie haben absolut ihre Daseinsberechtigung, aber wenn man selbst die Sprache halbwegs beherrscht, möchte man solche Blogs eigentlich nicht verfolgen.
Also, wieviele PHP-Blogs gibt es? Und welche?
Voraussetzungen:
- es muss ein Blog in deutscher Sprache sein
- mindestens 1 Artikel über PHP alle 2 Wochen
- der Blog muss mindestens 3 Monate alt sein
Ich möchte hier eine kleine Sammlung starten mit Links, die ich hier auflisten werde. Schreibt also in den Kommentaren die Links, eventuell auch das Alter, Spezialitäten usw. Ihr dürft also etwas Werbung machen.
Falls nach 3 Wochen meine 5 Favoriten noch nicht genannt wurden, werde ich sie selbst vorschlagen und ergänzen. Aber es geht ja darum, alle anderen kennenzulernen, die „man“ noch nicht kennt! Also her mit den Links!
_________________________________________________________
Liste deutscher PHP-Blogs (alphabetisch sortiert):
- http://daraff.ch
- http://blog.frontend-development.ch
- http://krsteski.de
- http://www.php-archiv.de
- http://www.phpblogger.net
- http://www.phpblogstars.de (deutscher PHP-Blog-Aggregator)
- http://phphacker.net
- http://www.phphatesme.com
- http://www.phpmonkeys.de
- http://ragtek.org/blog
- http://unite-it.at
- http://blog.zf-info.de
Entsprechen (noch) nicht ganz allen Kriterien:
HTML 5 und Javascript 5: Clientseitige Datenbanken
Nachdem sich die Web Hypertext Application Technology Working Group (WHATWG) 2004 gegründet hat, die aus einigen bedeutenden Internet-Riesen besteht (u.a. Apple, Mozilla, Opera), kommt wieder Fahrt in neue HTML- und Javascript-Standards. Die Gruppe hat viele Proposals erstellt, von denen jetzt einige vom W3C übernommen werden. Stichworte sind da HTML 5, ECMAScript 5, Web Workers, Web Storage, Web Sockets und einiges mehr.
Zu den Web Workern hatte ich ja bereits etwas geschrieben.
Web Sockets wird die Pushing-Technik werden, mit der Server bei Änderungen Nachrichten an den Browser schicken können, dann erübrigt sich das derzeitige Pullen und Nachfragen via AJAX, ob es Neuigkeiten gibt. Das entlastet die Server und spart Traffic, und Nachrichten kommen genau dann im Browser an wenn sie auf dem Server passieren, nicht erst beim nächsten Pull.
Heute soll es um den Web Storage gehen, die clientseitige Datenbank im Browser. In der Vergangenheit konnte man Daten nur auf der aktuellen Seite in Javascript-Variablen vorhalten, sobald aber der nächste Full-Page-Reload kommt sind die Daten futsch. Die zweite Möglichkeit waren Cookies, in denen man Daten speichern kann. Da aber Cookies bei jedem Request mitgesendet werden, ist das kein guter Speicherort für größere Datenmengen, Cookies sollte man höchstens für eine SessionID nutzen.
Vergleich der großen PHP-Frameworks: Anzahl Jobs
Wollte nur kurz einen Link in den Raum werfen, den man vielleicht mal länger beobachten kann, um zu sehen wie es mit den PHP Frameworks steht:
zend framework, cakephp, symfony, codeigniter Job Trends | zend framework jobs – cakephp jobs – symfony jobs – codeigniter jobs |
Das wars auch schon 😉