<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Simlau.net Blog &#187; PHP</title>
	<atom:link href="http://blog.simlau.net/category/programmieren/php/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.simlau.net</link>
	<description>Mein Blog über Linux, Coding und Web Development.</description>
	<lastBuildDate>Sat, 26 Jun 2010 21:33:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Zend Server Community Edition</title>
		<link>http://blog.simlau.net/zend-server-ce.html</link>
		<comments>http://blog.simlau.net/zend-server-ce.html#comments</comments>
		<pubDate>Wed, 19 May 2010 08:00:02 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=2028</guid>
		<description><![CDATA[Der Zend Server CE ist komplettes Webserver Paket mit PHP 5.3.2, etwa vergleichbar mit dem Projekt XAMPP. Der Vorteil liegt hier daran, dass bereits fast alle Komponenten von Zend mitgeliefert werden. So ist Out of the Box bereits Zend Data Cache, der Zend Debugger und Zend Optimizer+ installiert. Netterweise ist sogar das Zend Framework schon [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.simlau.net/wp-files/zendserver1-300x193.png" alt="" title="Zend Server" width="300" height="193" class="alignright size-medium wp-image-2264" />Der <a href="http://www.zend.com/de/products/server-ce/">Zend Server CE</a> ist komplettes Webserver Paket mit PHP 5.3.2, etwa vergleichbar mit dem Projekt <a href="http://www.apachefriends.org/de/xampp.html">XAMPP</a>.</p>
<p>Der Vorteil liegt hier daran, dass bereits fast alle Komponenten von Zend mitgeliefert werden. So ist Out of the Box bereits Zend Data Cache, der Zend Debugger und Zend Optimizer+ installiert. Netterweise ist sogar das Zend Framework schon mit an Board.</p>
<p>Der Zend Server ist vorallem in Zusammenarbeit mit Zend Studio ein ziemlich mächtiges Entwicklerwerkzeug. Aber auch sonst bekommt man eine deutlich schönere Vorkonfiguration als bei XAMPP.</p>
<p>Der Zend Server arbeitet dabei mit dem Apache2 zusammen &#8211; unter Windows besteht auch die Möglichkeit ihn mit einem IIS laufen zu lassen.</p>
<p>Neben diesen Features liefert der Zend Server noch ein webbasiertes Konfigurationsinterface an. Dort lassen sich etwa PHP Erweiterungen per Klick aktivieren/deaktivieren, Direktiven in der php.ini setzen und die Zend Komponenten laden oder entladen.</p>
<p>Sehr schön ist dort auch der Logging Bereich, in dem man seine PHP Applikationen auf Errors und Warnings überwachen kann. Hier sind die Funktionen in der Community Edition gegenüber dem großen (kostenpflichtigen) Bruder recht beschränkt. Als Entwicklungsumgebung und für kleinere Projekte reicht die Community Edition aber durchaus aus.</p>
<p><strong>Installation des Zend Servers CE</strong><br />
Für Debian werden bereits fertige Pakete von der Firma Zend selbst angeboten. Zur Installation führt man folgende hier Befehle aus:</p>
<pre class="brush: plain;">wget http://repos.zend.com/deb/zend.key -O- | apt-key add -
deb http://repos.zend.com/zend-server/deb server non-free &gt;&gt; /etc/apt/sources.list
apt-get update
apt-get install zend-server-ce-php-5.3</pre>
<p>Für Windows, Mac und andere Linux Distributionen kann man den Server <a href="http://www.zend.com/de/products/server-ce/downloads">hier</a> herunterladen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/zend-server-ce.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DHL-Tracking API mit PHP abrufen</title>
		<link>http://blog.simlau.net/dhl-tracking-api-php.html</link>
		<comments>http://blog.simlau.net/dhl-tracking-api-php.html#comments</comments>
		<pubDate>Sat, 15 May 2010 17:00:30 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1977</guid>
		<description><![CDATA[Lange habe ich schon danach gesucht und endlich bin ich doch mal fündig geworden &#8211; die Tracking-API von DHL. Tatsächlich gibt es im Netz nahezu keine offizielle Dokumentation dieser mysteriösen API. Die public API dient zum Abrufen des Status eines Pakets, mit der privaten API können Firmen sich z. B. Paketaufkleber etc. ausdrucken lassen. Die [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/package.png"><img src="http://blog.simlau.net/wp-files/package.png" alt="" title="DHL Tracking API" width="120" height="120" class="alignright size-full wp-image-2130" /></a>Lange habe ich schon danach gesucht und endlich bin ich doch mal fündig geworden &#8211; die Tracking-API von DHL. Tatsächlich gibt es im Netz nahezu keine offizielle Dokumentation dieser mysteriösen API. Die public API dient zum Abrufen des Status eines Pakets, mit der privaten API können Firmen sich z. B. Paketaufkleber etc. ausdrucken lassen.</p>
<p>Die Public API reicht allerdings für die meisten Zwecke vollkommen, mit ihr kann man z. B. per Script die Sendung eines Pakets überwachen. Hier meine kleine, beispielhafte-Funktion:</p>
<pre class="brush: php;">function dhl_tracking($trackingnumber)
{
	$data  = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;';
	$data .= '&lt;data appname=&quot;nol-public&quot; password=&quot;anfang&quot; request=&quot;get-status-for-public-user&quot; language-code=&quot;de&quot;&gt;';
	$data .= '  &lt;data piece-code=&quot;'.$trackingnumber.'&quot;&gt;&lt;/data&gt;';
	$data .= '&lt;/data&gt;';

	// URL bauen und File hohlen
	$xml = simplexml_load_file(sprintf(
		'http://nolp.dhl.de/nextt-online-public/direct/nexttjlibpublicservlet?xml=%s', $data
	));

	// FALSE, wenn Syntax oder HTTP Error
	if ($xml === false) return false;

	// Wandelt das SimpleXML Objekt in ein Array um
	foreach ($xml-&gt;data-&gt;data-&gt;attributes() as $key =&gt; $value) {
		$return[$key] = (string) $value;
	}
	return $return;
}

// Aufruf der Funktion
print_r(dhl_tracking($tracking_number));
</pre>
<p>Sollte die Funktion false zurück liefern gab es einen Problem mit dem Tomcat Server und der Anfrage (etwa falscher Syntax, fehlerhaftes XML). Wenn piece-status einen anderen Wert als 0 enthält liegt ein Problem mit dem Datensatz selbst vor (z. B. keine Daten vorhanden).</p>
<p><span id="more-1977"></span><br />
Als Ergebnis erhält man dann ein Array, etwa mit folgenden Werten (hier etwas gekürzt, tatsächlich sind es einiges mehr an Infos):</p>
<pre class="brush: plain;">Array
(
    [status] =&gt; Die Sendung wurde erfolgreich zugestellt.
    [recipient-id-text] =&gt; Nachbar
    [product-name] =&gt; DHL PAKET
    [pan-recipient-name] =&gt; SIMON LAUGER
)</pre>
<p>Insbesondere für Shop-Betreiber, die ihren Kunden die Möglichkeit geben wollen in ihrem Shop den Status der Lieferung anzusehen sollte das recht interessant sein. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/dhl-tracking-api-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ZendFramework: Basic/Digest-Auth über Zend_Db</title>
		<link>http://blog.simlau.net/zendframework-http-auth.html</link>
		<comments>http://blog.simlau.net/zendframework-http-auth.html#comments</comments>
		<pubDate>Sat, 01 May 2010 12:30:36 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1983</guid>
		<description><![CDATA[Möchte mit dem ZendFramework eine HTTP Basic oder Diggest Authentifaktion erstellen bietet das Framework und die Klasse Zend_Auth_Adapter_Http derzeit nur die Möglichkeit die Userdaten mit Textdateien abzugleichen. Doch gerade Basic und Diggest Authentifikation über Datenbanken ist so ein Fall, denn ich derzeit viel zu oft brauche. Um es kurz für andere festzuhalten, die eventuell auch [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/zendframework.png"><img src="http://blog.simlau.net/wp-files/zendframework.png" alt="Zend Framework" title="Zend Framework" width="181" height="93" class="alignright size-full wp-image-1986" /></a>Möchte mit dem ZendFramework eine HTTP Basic oder Diggest Authentifaktion erstellen bietet das Framework und die Klasse Zend_Auth_Adapter_Http derzeit nur die Möglichkeit die Userdaten mit Textdateien abzugleichen.</p>
<p>Doch gerade Basic und Diggest Authentifikation über Datenbanken ist so ein Fall, denn ich derzeit viel zu oft brauche. Um es kurz für andere festzuhalten, die eventuell auch mal in die Situation kommen: Das ganze zu implementieren sind effektiv ~5 Zeilen Code:</p>
<pre class="brush: php;">class Zend_Auth_Adapter_Http_Resolver_DbTable implements Zend_Auth_Adapter_Http_Resolver_Interface
{
	public function resolve($username, $realm)
	{
		$stmt = Zend_Registry::get('Zend_Db')-&gt;prepare(
			'SELECT password FROM users WHERE username = :username LIMIT 1'
		);
		$stmt-&gt;bindParam(':username', $username);
		$stmt-&gt;execute();

		// Gibt das Passwort des Users zurueck
		return $stmt-&gt;fetch(PDO::FETCH_OBJ)-&gt;password;
	}
}</pre>
<p>Benutzt wird das ganze dann wie folgt:</p>
<pre class="brush: php;">// Zend_Db kommt in die Registry um später darauf zuzugreifen
Zend_Registry::set('Zend_Db', Zend_Db::factory($config));

$auth = new Zend_Auth_Adapter_Http(array(
	'accept_schemes'	=&gt; 'basic',
	'realm'				=&gt; 'area51'
));

// Unsere Helferklasse als Resolver für das Passwort einbinden.
$auth-&gt;setBasicResolver(new Zend_Auth_Adapter_Http_Resolver_DbTable());

// Benötigte Response und Request Klassen starten
$auth-&gt;setRequest($request = new Zend_Controller_Request_Http());
$auth-&gt;setResponse($response = new Zend_Controller_Response_Http());

// Die eigentliche Authentifikation
$result = $auth-&gt;authenticate();

// Erscheint beim klick auf &quot;abbrechen&quot;
if (!$result-&gt;isValid()) die(&quot;Try again!&quot;);

$response-&gt;sendResponse();</pre>
<p>Das ganze funktioniert natürlich auch mit HTTP Digest. Da hier das Passwort aber verschlüsselt übertragen wird, muss eine Kleinigkeit angepasst werden:</p>
<pre class="brush: php;">
public function resolve($username, $realm) {
	...
	// MD5 Hash von &quot;benutzername:realm:passwort&quot;
	return md5($username.':'.$realm.':'.$stmt-&gt;fetch(PDO::FETCH_OBJ)-&gt;password);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/zendframework-http-auth.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Anwendungen lokalisieren mit Gettext</title>
		<link>http://blog.simlau.net/php-anwendungen-lokalisieren.html</link>
		<comments>http://blog.simlau.net/php-anwendungen-lokalisieren.html#comments</comments>
		<pubDate>Tue, 23 Feb 2010 08:00:21 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Lokalisierung]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1724</guid>
		<description><![CDATA[Viele standen mit Sicherheit schon einmal vor dem Problem: eine Web-Anwendung muss in mehreren Sprachen bereitgestellt werden. Dabei möchte man es denn Übersetzern natürlich möglichst einfach gestalten und das Script so schreiben, dass eine weitere Sprache im Nachhinein im System einzupflegen einen möglichst geringen Aufwand bereitet. Ansätze gibt es mehrere. Eine Möglichkeit ist die Sprachvariablen [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.simlau.net/wp-files/PHP_Logo.png"><img src="http://blog.simlau.net/wp-files/PHP_Logo.png" alt="Anwendungen lokalisieren mit gettext" title="Anwendungen lokalisieren mit gettext" width="145" height="77" class="alignright size-full wp-image-1604" /></a>Viele standen mit Sicherheit schon einmal vor dem Problem: eine Web-Anwendung muss in mehreren Sprachen bereitgestellt werden. </p>
<p>Dabei möchte man es denn Übersetzern natürlich möglichst einfach gestalten und das Script so schreiben, dass eine weitere Sprache im Nachhinein im System einzupflegen einen möglichst geringen Aufwand bereitet.</p>
<p>Ansätze gibt es mehrere. Eine Möglichkeit ist die Sprachvariablen in ein Array auszulagern&#8230;</p>
<p><span id="more-1724"></span></p>
<pre class="brush: php;">&lt;?php

if (!is_array($lang) || empty($lang)) {
  $lang = array();
}

$lang = array_merge(
  'post_geloescht' =&gt; 'Dieser Eintrag wurde leider geloescht',
  'post_hinzufuegen' =&gt; 'Einen neuen Eintrag hinzufuegen',
);

?&gt;</pre>
<p>Und im Maincode dann beispielsweise&#8230;</p>
<pre class="brush: php;">&lt;?php
// Natürlich ist dieser Code in echten Projekten tödlich für die Sicherheit
// Nur als Beispiel, es fehlen diverse Checks gegen Remote Inclusions

$user_lang = (isset($_SESSION['user_language']) &amp;&amp; !empty($_SESSION['user_language'])) ? $_SESSION['user_language'] : '';

$user_lang = (!empty($user_lang) &amp;&amp; is_file(dirname(__FILE__) . '/language/main_' . $user_lang . '.php')) ? $user_lang : 'de';

include_once dirname(__FILE__) . '/language/main_' . $user_lang . '.php';

echo $lang['post_geloescht']);

?&gt;</pre>
<p>Jeder Entwickler muss, sofern er eine neue Sprachvariable braucht, diese in zwei verschiedenen Teilen des Codes einfügen. Dann natürlich noch jeweils eine zusätzliche Änderung pro weiteres Sprachpaket &#8211; nicht allzu komfortabel. Zudem ist dieses Konzept auch noch recht fehleranfällig, insbesondere weil wir Programmierer ja meistens eher Schreibfaul sind. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Zusätzlich muss man den Fall absichern, dass ein Übersetzer ein Feld im Array komplett aus seiner Übersetzung vergessen hat.</p>
<p>Bei kleinen Projekten ist das alles durchaus akzeptabel. Problematisch wird es eher, wenn man mehrere hundert Variablen speichern muss.</p>
<p><strong>Lokalisierung mit setlocale</strong></p>
<p>Diese Methode wird bei diversen größeren quell offenen Scripten wie auch Beispielsweise WordPress verwandt.</p>
<p>Mit den gettext Tools kann automatisch ein Übersetzungstemplate generiert werden. Dieses kann man dem Übersetzungsteam bei jedem neuen Release einfach zusenden und fertig. </p>
<p>Eine schöne Sache ist dabei, dass man sich auch nicht mehr um einen Fallback kümmern muss. Falls ein Feld in der Sprachdatei nicht existiert oder im worst case das Sprachfile nicht gelesen werden kann wird der &#8220;Standard&#8221; (nicht übersetzte) Text ausgegeben.</p>
<p>Der größte Vorteil liegt jedoch darin, dass man, sofern man gettext von Anfang an in seine Scripte einpflegt, mit niedrigsten Aufwand eine Anwendung auch noch später lokalisieren kann &#8211; vielleicht ohne das dies Anfangs überhaupt geplant war.</p>
<pre class="brush: php;">&lt;?php

setlocale(LC_ALL, 'de_DE'); // Sprache auf Deutsch stellen
bindtextdomain('messages', './locale'); // Pfad der Uebersetzungstabellen
textdomain('messages'); // Domain auswaehlen

echo _('Hello World'); // Beispiel Ausgabe (_() ist der Alias zu gettext())

?&gt;</pre>
<p>Aus diesem Code kann man sich nun mittels des folgenden Befehls ein Übersetzungstemplate generieren lassen:</p>
<pre class="brush: bash;">root@localhost: xgettext index.php</pre>
<p>Dieses File kann man nun seinen Übersetzern zukommen lassen. Wichtig ist hier vor allem, dass der der Zeichensatz angepasst wird. Fertig sieht das ganze etwa so aus:</p>
<pre class="brush: plain;"># German Translation for MyProject
# Copyright (C) 2010 MyProject Translation Team
# This file is distributed under the same license as the MyProject package.
# Tom Riddle &amp;gtn;foobar@example.com&amp;ltn;, 2010.
#
#, fuzzy
msgid &quot;&quot;
msgstr &quot;&quot;
&quot;Project-Id-Version: 1.0\n&quot;
&quot;Report-Msgid-Bugs-To: bugs@example.com\n&quot;
&quot;POT-Creation-Date: 2010-02-22 22:42+0100\n&quot;
&quot;PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n&quot;
&quot;Last-Translator: Tom Riddle foobar@example.com\n&quot;
&quot;Language-Team: de_DE foo@li.org\n&quot;
&quot;MIME-Version: 1.0\n&quot;
&quot;Content-Type: text/plain; charset=utf-8\n&quot;
&quot;Content-Transfer-Encoding: 8bit\n&quot;

#: index.php:14
msgid &quot;Hello World&quot;
msgstr &quot;Hallo Welt&quot;</pre>
<p>Ist das geschafft muss das Template &#8220;kompiliert&#8221; werden, sprich in Maschinensprache übersetzt werden. Das geschieht mit diesem Befehl:</p>
<pre class="brush: bash;">root@localhost: msgfmt -o messages.mo messages.po</pre>
<p>Man erhält nun eine Datei messages.mo. Diese verschiebt man nach locale/de_DE/LC_MESSAGES/messages.mo.</p>
<p>Wenn man nun die Anwendung startet sollte &#8220;Hallo Welt&#8221; auf dem Schirm erscheinen. Gibt es irgendeinen Fehler, oder wurde das File nicht gefunden erscheint &#8220;Hello World.&#8221;</p>
<p><strong>Alternative Tools für das bearbeiten der Sprachfiles</strong></p>
<ul>
<li><a href="http://www.poedit.net/">PoEdit</a> &#8211; Windows, Mac OS X and UNIX/Linux</li>
<li><a href="http://kbabel.kde.org/">KBabel</a> &#8211; Linux (KDE)</li>
</ul>
<p>Weitere Infos gibt es in der PHP Doku auf den Seiten zu <a href="http://de3.php.net/manual/de/ref.gettext.php">Gettext</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/php-anwendungen-lokalisieren.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.3 und PHP 6.0 auf Debian Lenny 5.0</title>
		<link>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html</link>
		<comments>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html#comments</comments>
		<pubDate>Thu, 24 Sep 2009 08:00:36 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Debian]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=1599</guid>
		<description><![CDATA[PHP 5.3 und PHP 6.0 enthalten viele Neuerungen, die vorallem im Bereich der Objektorientierung teilweise recht praktisch sind. So wurden mit PHP 5.3 Beispielweise Namespaces und Late Static Bindings integriert. In PHP 6.0 werden überflüssige Funktionen wie register_globals, magic_quotes, register_long_arrays und der safe_mode abgeschafft, dafür gibt es einen vollständigen Unicode Support. Leider kommt man bei [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://php.net/"><img src="http://blog.simlau.net/wp-files/PHP_Logo.png" alt="PHP Logo" title="PHP Logo" width="145" height="77" class="alignright size-full wp-image-1604" style="float: right;" /></a>PHP 5.3 und PHP 6.0 enthalten viele Neuerungen, die vorallem im Bereich der Objektorientierung teilweise recht praktisch sind.</p>
<p>So wurden mit PHP 5.3 Beispielweise Namespaces und Late Static Bindings integriert. In PHP 6.0 werden überflüssige Funktionen wie register_globals, magic_quotes, register_long_arrays und der safe_mode abgeschafft, dafür gibt es einen vollständigen Unicode Support.</p>
<p>Leider kommt man bei diversen Linux Distributionen als PHP Entwickler immer nur mit recht viel Geduld zum Genuss der teilweise recht praktischen Neuerungen.<br />
Deshalb gibt es die Möglichkeit PHP manuell aus dem Quellcode heraus zu installieren, bzw. sich selbst ein kleines .deb-Paket zu basteln.</p>
<p>Das ganze wurde auf einem Debian Lenny getestet, sollte sich aber mit kleineren Änderungen (ggf. andere Paketnamen bei den Abhängigkeiten) auch auf ähnliche Systeme wie Ubuntu übertragen lassen.</p>
<p><span id="more-1599"></span></p>
<p><strong>Vorarbeiten</strong><br />
Vor einer manuellen Installation sollten alle Pakete von PHP komplett entfernt werden.</p>
<blockquote><p><code>apt-get --purge remove php5 php5-* libapache2-mod-php5</code></p></blockquote>
<p>Der folgende Prozess erstellt ein &#8220;All-in-One&#8221; Paket, welches bereits alle zusätzlichen Erweiterungen (wie php5-curl, php5-mysql usw.) enthält.</p>
<p>Aufgrund dessen kann es eventuell zu mehren Abhänigkeitsproblemen bei Applikationen wie phpMyAdmin und anderen aus den Repositorys installieren Paketen kommen. Als Workaround kann man diese Pakete mit mittels &#8211;force Parameter installieren, oder aber sie einfach nur mehr komplett per Hand pflegen.</p>
<p><strong>Bau des Paketes</strong><br />
Um PHP kompilieren zu können, werden für die Abhängigkeiten zunächst einige Pakete benötigt. </p>
<blockquote><p><code>apt-get install gcc automake make checkinstall libjpeg62-dev libpng12-dev apache2-prefork-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libxpm-dev libxft-dev libt1-dev libgd2-xpm-dev libgmp3-dev libsasl2-dev freetds-dev libmysqlclient15-dev unixodbc-dev libpspell-dev librecode-dev libsnmp-dev libsqlite0-dev libtidy-dev libxslt1-dev x11proto-core-dev libxau-dev libpthread-stubs0 libpthread-stubs0-dev libxdmcp-dev libxcb1-dev libxcb-xlib0-dev x11proto-input-dev x11proto-kb-dev xtrans-dev libx11-dev libxpm-dev libexpat1-dev libfreetype6-dev pkg-config libfontconfig1-dev apache2-mpm-prefork apache2-utils apache2.2-common comerr-dev libapr1 libapr1-dev libaprutil1 libaprutil1-dev libaspell-dev freetds-common libdb4.6-dev libgmpxx4ldbl libice-dev libidn11-dev libkadm55 libkrb5-dev libldap2-dev libodbcinstq1c2 libpcre3-dev libpq-dev libsensors-dev libsm-dev libsnmp-perl libsqlite3-dev libssl-dev libsybdb5 libt1-5 libtidy-0.99-0 libwrap0-dev libxaw7-dev libxaw7-dev libxext-dev libxmu-dev libxmu-headers libxrender-dev libxt-dev uuid-dev x11proto-render-dev x11proto-xext-dev libmcrypt4 libmcrypt-dev libmhash-dev</code></p></blockquote>
<p>Zusätzlich, wenn PHP6 installiert wird ist noch das folgende Paket von nöten:</p>
<blockquote><p><code>apt-get install libicu-dev</code></p></blockquote>
<p>Nun kann man den Sourcecode von PHP 5.3 herunterladen und entpacken.</p>
<blockquote><p><code>cd /usr/src &#038;&#038; wget http://de3.php.net/get/php-5.3.0.tar.gz/from/de.php.net/mirror<br />
tar xf php-5.3.0.tar.gz &#038;&#038; cd php-5.3.0</code></p></blockquote>
<p>Bzw. wenn man PHP 6.0 aus den täglichen Snapshots installieren möchte:</p>
<blockquote><p><code>cd /usr/src &#038;&#038; wget http://snaps.php.net/php6.0-latest.tar.gz<br />
tar xf php6.0-latest.tar.gz &#038;&#038; cd php6.0-*/</code></p></blockquote>
<p>Nun ist es Zeit für das configure Script. Für PHP 5.3 führt man hier folgendes aus:</p>
<blockquote><p><code>./configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php5/apache2 --with-config-file-scan-dir=/etc/php5/apache2/conf.d --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --with-pear=/usr/share/php --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --with-exec-dir=/usr/lib/php5/libexec --without-mm --with-curl=shared,/usr --with-zlib-dir=/usr --with-gd=shared,/usr --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-t1lib=shared,/usr --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mhash=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite=shared,/usr --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr --enable-gd-native-ttf --enable-dba=shared --with-openssl-dir=shared,/usr --enable-gd-jis-conv --enable-json --with-mcrypt=shared,/usr --enable-pcntl --with-pdo-mysql --with-pdo-odbc=unixODBC,/usr --with-pdo-pgsql=shared,/usr --with-pdo-sqlite --enable-xmlreader --with-tsrm-pthreads</code></p></blockquote>
<p>Für PHP 6.0, mit minimalen Änderungen:</p>
<blockquote><p><code>./configure --prefix=/usr --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php6/apache2 --with-config-file-scan-dir=/etc/php6/apache2/conf.d --mandir=/usr/share/man --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-db4 --without-gdbm --with-iconv --enable-exif --enable-ftp --with-gettext --enable-mbstring --with-pcre-regex=/usr --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --with-openssl=/usr --enable-soap --enable-zip --libexecdir=/usr/lib/php6/libexec --without-mm --with-curl=shared,/usr --with-zlib-dir=/usr --with-gd --enable-gd-native-ttf --with-gmp=shared,/usr --with-jpeg-dir=shared,/usr --with-xpm-dir=shared,/usr/X11R6 --with-png-dir=shared,/usr --with-freetype-dir=shared,/usr --with-t1lib=shared,/usr --with-ldap=shared,/usr --with-ldap-sasl=/usr --with-mhash=shared,/usr --with-mysql=shared,/usr --with-mysqli=shared,/usr/bin/mysql_config --with-pspell=shared,/usr --with-unixODBC=shared,/usr --with-xsl=shared,/usr --with-snmp=shared,/usr --with-sqlite=shared,/usr --enable-sqlite-utf8 --with-mssql=shared,/usr --with-tidy=shared,/usr --with-xmlrpc=shared --with-pgsql=shared,/usr --enable-gd-native-ttf --with-icu-dir=/usr --enable-dba=shared --with-openssl-dir=shared,/usr --enable-gd-jis-conv --enable-json --with-mcrypt=shared,/usr --enable-pcntl --with-pdo-mysql --with-pdo-odbc=unixODBC,/usr --with-pdo-pgsql=shared,/usr --with-pdo-sqlite --enable-xmlreader --with-tsrm-pthreads</code></p></blockquote>
<p>Jetzt kann man den make Befehl ausführen. Hat man einen Dualcore/Quadcore Prozessor, kann man den Prozess mittels dem Parameter -jX (X für die Anzahl an Kernen) beschleunigen.</p>
<blockquote><p><code>make -j2</code></p></blockquote>
<p>Um im letzten Schritt das Debian Paket zu erstellen, gibt man für PHP 5.3 den folgenden Befehl ein:</p>
<blockquote><p><code>checkinstall -D --install=no --fstrans=no --maintainer=root@example.org --reset-uids=yes --nodoc --pkgname=php5 --pkgversion=5.3.0 --pkgrelease=`date +%Y%m%d%H%M` --arch=amd64</code></p></blockquote>
<p>Oder für Version 6.0:</p>
<blockquote><p><code>sudo checkinstall -D --install=no --fstrans=no --maintainer=root@example.org --reset-uids=yes --nodoc --pkgname=php6 --pkgversion=6.0.0-dev --pkgrelease=`date +%Y%m%d%H%M` --arch=amd64</code></p></blockquote>
<p>Sollte man kein 64 Bit Debian/Ubuntu betreiben, so muss man &#8211;arch=amd64 entsprechend anpassen (auf i386, i486 oder i586 usw.). Der Switch &#8211;maintainer sollte auch noch an die eigene E-Mail Adresse angepasst werden.</p>
<p>checkinstall frägt auch noch nach einer Beschreibung des Paketes und zusätzlichen Infos. Dies kann man aber alles getrost ignorieren und mit Enter bestätigen. </p>
<p><strong>Fehler bei checkinstall</strong><br />
Bricht checkinstall mit einem Fehler ala &#8220;Error: At least one `LoadModule&#8217; directive already has to exist&#8230;&#8221;, liegt das daran, dass die httpd.conf des Apache2 Webservers leer ist. Hier gibt es einen kleinen Workaround:</p>
<blockquote><p><code>echo "#LoadModule directive to aid module installations" >> /etc/apache2/httpd.conf<br />
echo "#LoadModule dummy_module /usr/lib/apache2/modules/mod_dummy.so" >> /etc/apache2/httpd.conf</code></p></blockquote>
<p>Anschließend checkinstall erneut ausführen.</p>
<p><strong>Installation und Test</strong><br />
Ist der Prozess abgeschlossen befindet sich im aktuellen Verzeichnis ein Paket, welches man wie folgt installieren kann:</p>
<blockquote><p><code>dpkg -i *.deb</code></p></blockquote>
<p>Um zu testen ob PHP korrekt installiert wurde kann man in der Shell den Befehl &#8220;php -v&#8221; ausführen. Angezeigt werden sollte die entsprechende Version und das Build Datum, z. B. &#8220;PHP 5.3.0 (cli) (built: Sep 23 2009 00:00:00)&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/php-5-3-und-php-6-0-auf-debian-lenny-5-0.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Engagierte Coder gesucht</title>
		<link>http://blog.simlau.net/engagierte-coder-gesucht.html</link>
		<comments>http://blog.simlau.net/engagierte-coder-gesucht.html#comments</comments>
		<pubDate>Mon, 02 Mar 2009 20:09:27 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/?p=417</guid>
		<description><![CDATA[Ein Freund sucht für diverse kleinere, kommerzielle Projekte Unterstützung für sein Team: Wir würden gerne unser Team vergrößern und suchen dafür: 3 Programmierer/in (m/w) Anforderungen: Sehr gute Kenntnisse von PHP 5 &#038; MySQL, XHTML, CSS, OOP, gute Kenntnisse in JavaScript (inkl. Ajax), SVN, Websicherheit. Von Vorteil wären Kenntnisse von PDO, XML, JSON &#038; Co. Du [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Freund sucht für diverse kleinere, kommerzielle Projekte Unterstützung für sein Team:</p>
<blockquote><p>Wir würden gerne unser Team vergrößern und suchen dafür:</p>
<p><strong>3 Programmierer/in (m/w)</strong><br />
Anforderungen: Sehr gute Kenntnisse von PHP 5 &#038; MySQL, XHTML, CSS, OOP, gute Kenntnisse in JavaScript (inkl. Ajax), SVN, Websicherheit. Von Vorteil wären Kenntnisse von PDO, XML, JSON &#038; Co.</p>
<p>Du solltest teamfähig und flexibel sein und nach Möglichkeit dein 15. Lebensjahr vollendet haben. Außerdem solltest du genügend Zeit mitbringen, (wenn du nebenbei viel Stress mit Schule, UNI etc. hast, dann ist das ganze vllt. nicht so geeignet) und Spaß an der Programmierung haben.</p>
<p><strong>Designer/in (m/w)</strong><br />
natürlich auch teamfähig, flexibel und min. 16 Jahre alt.</p>
<p>Wenn du Interesse an diesem Angebot hast, dann kontaktiere mich einfach per Mail, telefonisch oder &#8211; für die gemütlicheren &#8211; per ICQ. Deine Bewerbung sollte mehrere Referenzen und eine ungefähre Lohn-Vorstellung enthalten.</p></blockquote>
<p>Sofern euch das ganze anspricht und/oder Ihr mehr Informationen haben möchtet, meldet euch einfach bei mir, ich werde dann umgehend den Kontakt herstellen. Schreibt mir dazu am besten eine E-Mail (siehe <a href="http://blog.simlau.net/impressum/">Impressum</a>) oder schreibt mir via IRC/ICQ (siehe rechts).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/engagierte-coder-gesucht.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rhythmbox HTTP-Fernsteuerung</title>
		<link>http://blog.simlau.net/rhythmbox-fernsteuerung.html</link>
		<comments>http://blog.simlau.net/rhythmbox-fernsteuerung.html#comments</comments>
		<pubDate>Fri, 21 Mar 2008 11:04:37 +0000</pubDate>
		<dc:creator>Simon</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[remote control]]></category>
		<category><![CDATA[rhythmbox]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.simlau.net/2008/03/21/rhythmbox-fernsteuerung/</guid>
		<description><![CDATA[Heute habe ich mich mal etwas umgeschaut, in wie fern es möglich ist, Rhythmbox fernzusteuern. Leider habe ich nur Möglichkeiten via Bluetooth gefunden. Da ich aber weder Bluetooth am Computer, noch ein Gerät zum steuern habe, habe ich mich mal hingesetzt und eine HTTP-Fernsteuerung geschrieben. Das ganze funktioniert folgendermaßen: Via PHP Script wird ein Bash-Script [...]]]></description>
			<content:encoded><![CDATA[<p>Heute habe ich mich mal etwas umgeschaut, in wie fern es möglich ist, Rhythmbox fernzusteuern. Leider habe ich nur Möglichkeiten via Bluetooth gefunden. Da ich aber weder Bluetooth am Computer, noch ein Gerät zum steuern habe, habe ich mich mal hingesetzt und eine HTTP-Fernsteuerung geschrieben.</p>
<p>Das ganze funktioniert folgendermaßen: Via PHP Script wird ein Bash-Script aufgerufen, dass per Shell das Kommando <strong>rhythmbox-client</strong> aufruft. Jeweils mit einem Parameter, z. B. next (für den nächsten Song), previous (für den vorherigen Song) usw. Dieser Umweg ist nötig, da zuerst die DBUS-Session bzw. die Prozess ID gesucht werden muss.</p>
<p><a href="http://blog.simlau.net/wp-files/rythmcontrol.png" rel="lightbox[groupname]" title="Rythmbox Webinterface"><img src="http://blog.simlau.net/wp-files/rythmcontrol.png" alt="Rhythmbox per iPod touch und Safari steuern" style="float: right; padding-left: 10px; padding-bottom: 10px;" /></a>Hier mal ein kleiner Screenshot, wie das ganze auf meinen iPod aussieht. Und ich muss sagen, es ist doch recht komfortabel. Einfacher kann man Rythmbox nicht per Remote bedienen. <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>So kann man mal eben schnell ein Lied am Rythmbox-Player am PC überspringen, wenn man mal wieder zu faul ist, vom Sofa aufzustehen. Einfach den iPod raus, Safarai an, und los. </p>
<p>Das einzige Problem besteht natürlich darin, dass mit diesem Webinterface der Rythmbox Player, der Apache2 Webserver sowie der PHP Interpreter auf einem System installiert sein müssen.</p>
<p>Somit läuft ein unnötiger Dienst, den man normal im Desktop-Betrieb eigentlich in der Regel nicht brauchen würde (zumindest kein normaler User, lediglich Webdesigner und -entwickler). Wer das verkraften kann, und wem keine Bluetooth Möglichkeiten zur Verfügung stehen, ist mit diesem Script ganz gut bedient. </p>
<p>Das Paket einfach herunterladen und in den Webroot entpacken. Danach mit einem Editor das Bashscript rythmcontrol.sh anpassen und dort die 2 Variablen $USER und $PASSWORD ändern. Der User und das Passwort ist das, des Users unter dem der Rythmbox Mediaplayer läuft. Anschließend das Script ausführbar machen und testen, voila! <img src='http://blog.simlau.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Update, Mai 2009:</strong> Ich habe das Script noch auf meinem PC gefunden und aktualisiert. <a href="http://blog.simlau.net/wp-files/rythmcontrol.zip">Hier ein komplettes Paket</a>, mit dem fertigen Webinterface. Viel Spaß!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simlau.net/rhythmbox-fernsteuerung.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
