<?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>Stetix &#187; php</title>
	<atom:link href="http://stetix.de/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://stetix.de</link>
	<description>Gedanken über Web-Development, Webdesign, Technik, Handys, Musik, Vinyl, Gadgeds und mehr..</description>
	<lastBuildDate>Thu, 12 Apr 2012 20:35:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>WordPress langsam? PHP und WordPress schneller machen mit Nginx und Fast-CGI!</title>
		<link>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html</link>
		<comments>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html#comments</comments>
		<pubDate>Mon, 07 Mar 2011 23:27:05 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[webserver]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=932</guid>
		<description><![CDATA[Das der nginx-Webserver schneller und performanter als z.B. der Apache ist, hatte ich in meinem letzten Blogbeitrag zur Installation und Konfiguration von nginx bereits geschrieben. Wenn WordPress oder PHP auf dem Apache mit mod_php generell zu langsam werden, macht auch hier die Überlegung Sinn, auf einen anderen Webserver umzusteigen. In Sachen Performance und Performance-Optimierung nicht [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Das der <a href="http://nginx.org/" target="_blank">nginx-Webserver</a> schneller und performanter als z.B. der Apache ist, hatte ich in meinem letzten Blogbeitrag zur <a href="/nginx-eine-echte-apache-alternative.html">Installation und Konfiguration von nginx</a> bereits geschrieben. Wenn WordPress oder PHP auf dem <a href="http://httpd.apache.org/">Apache</a> mit <a href="http://php.net/manual/de/security.apache.php">mod_php</a> generell zu langsam werden, macht auch hier die Überlegung Sinn, auf einen anderen Webserver umzusteigen. In Sachen Performance und Performance-Optimierung nicht nur für WordPress und PHP ist nginx aktuell die erste Wahl. </p>
<p><img src="http://stetix.de/wp-content/uploads/2011/03/nginx-php-rocket.jpg" alt="nginx php rocket Wordpress langsam? PHP und Wordpress schneller machen mit Nginx und Fast CGI!" title="nginx-php-rocket" width="494" height="442" class="size-full wp-image-1795" /></p>
<p>Bei den meisten Installationen unter Apache läuft PHP als Modul. Das heisst, für das Ausführen von PHP muß kein neuer Prozess gestartet werden, sondern die Verarbeitung bzw. Parsen der PHP-Dateien übernimmt das beim Start des Apachen geladene PHP-Modul. Für nginx gibt es solch ein Modul nicht, weshalb wir auf die CGI-Version von PHP zurückgreifen müssen. Dies ist nicht weiter tragisch, da die Performance &#8211; eine halbwegs schnelle CPU vorausgesetzt &#8211; aus Erfahrung nicht darunter leidet. Doch wie konfiguriert man nginx, um ihn für das Ausliefern von dynamischen PHP-Scripts vorzubereiten? </p>
<p><span id="more-932"></span></p>
<h4>Installation von PHP5-CGI</h4>
<p>Zuallererst benötigen wir nun die CGI-Version von PHP. Falls sie noch nicht installiert ist, können wir sie entweder selbst kompilieren oder verwenden von der Linux-Distribution bestehende Pakete. Für Ubuntu ist die Installation hier mit einer Zeile erledigt:</p>
<p><code># apt-get install php5-cgi</code></p>
<p>Sofern man für WordPress zum Beispiel noch mehr Module wie MySQL oder GD benötigt, könnte die Zeile auch so aussehen:</p>
<p><code># apt-get install php5-cgi php5-dev php5-gd php5-mysql</code></p>
<h4>Die Verbindung zu nginx: Sockets für PHP</h4>
<p>Damit wir PHP mit nginx nutzen können, benötigen wir sogenannte <a href="http://de.wikipedia.org/wiki/Socket_%28Software%29">Sockets</a> unter denen das PHP auf Anfragen von nginx wartet, wahlweisse als TCP- oder UNIX-Domain-Socket. Da ein Socket ständig auf neue Verbindungen wartet, muß ein neuer Prozess erzeugt werden, der diese Arbeit übernimmt. Dieser Prozess erzeugt weitere Unterprozesse und leitet die PHP-Anfragen dann an diese weiter.</p>
<p>Es gibt nun mehrere Möglichkeiten die PHP-Prozesse zu starten. Die Aufgabe ist hier, die Prozesse als Daemon und unter einem anderen User laufen zu lassen, sowie die Standard- und Fehler-Ausgaben umzuleiten.<br />
Zwei Möglichkeiten möchte ich hier aufzeigen: Zum einen kann man die Prozesse ganz normal per Startscript starten, auf Ubuntu zum Beispiel mit dem start-stop-daemon. Zum anderen gibt es Tools wie spawn-fcgi, mit dem ich jedoch nicht so gute Erfahrungen gemacht habe, da es bei mir öfters, teilweisse sogar mit <a href="http://de.wikipedia.org/wiki/Schutzverletzung" target="_blank">Segfaults</a>, unter Last abstürzte. Da ich aber keine Zeit hatte, dem Grund auf die Spur zu gehen und PHP mit dem start-stop-daemon bei mir ziemlich gut läuft, möchte ich euch spawn-fcgi der Vollständigkeithalber nicht vorenthalten. Sicher auch hilfreich für andere Linux-Distributionen.</p>
<h4>PHP im FASTCGI-Modus mit Startscript</h4>
<p>Die in PHP mitgelieferte CGI-Version php5-cgi erledigt im <a href="http://de.wikipedia.org/wiki/FastCGI" target="_blank">FastCGI</a>-Modus die Socketbindung und das Erzeugen von neuen Prozessen selbstständig und sehr zuverlässig.  Zum Starten benötigen wir ein Startscript, welches wir unter /etc/init.d/fastcgi anlegen:</p>
<p><code># vi /etc/init.d/fastcgi</code></p>
<p>Inhalt:</p>
<p><code>#!/bin/bash<br />
BIND=127.0.0.1:8088<br />
USER=www<br />
PHP_FCGI_CHILDREN=15<br />
PHP_FCGI_MAX_REQUESTS=1000<br />
PHP_CGI=/usr/bin/php5-cgi<br />
<br />
PHP_CGI_NAME=`basename $PHP_CGI`<br />
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"<br />
RETVAL=0<br />
<br />
start() {<br />
&nbsp;&nbsp;&nbsp;  echo -n "Starting PHP FastCGI: "<br />
&nbsp;&nbsp;&nbsp;  start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS<br />
&nbsp;&nbsp;&nbsp;  RETVAL=$?<br />
&nbsp;&nbsp;&nbsp;  echo "$PHP_CGI_NAME."<br />
}<br />
stop() {<br />
&nbsp;&nbsp;&nbsp;  echo -n "Stopping PHP FastCGI: "<br />
&nbsp;&nbsp;&nbsp;  killall -q -w -u $USER $PHP_CGI<br />
&nbsp;&nbsp;&nbsp;  RETVAL=$?<br />
&nbsp;&nbsp;&nbsp;  echo "$PHP_CGI_NAME."<br />
}<br />
<br />
case "$1" in<br />
&nbsp;&nbsp;&nbsp;start)<br />
&nbsp;&nbsp;&nbsp;  start<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;stop)<br />
&nbsp;&nbsp;&nbsp;  stop<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;restart)<br />
&nbsp;&nbsp;&nbsp;  stop<br />
&nbsp;&nbsp;&nbsp;  start<br />
  ;;<br />
&nbsp;&nbsp;&nbsp;*)<br />
&nbsp;&nbsp;&nbsp;  echo "Usage: php-fastcgi {start|stop|restart}"<br />
&nbsp;&nbsp;&nbsp;  exit 1<br />
  ;;<br />
esac<br />
exit $RETVAL<br />
</code></p>
<p>Die ersten fünf Variablen werden zur Konfiguration benötigt und bedeuten folgendes:</p>
<p>BIND:  IP-Adresse und Port,  unter denen auf Verbindungen gewartet wird<br />
USER: Benutzer, unter dem die Prozesse laufen<br />
PHP_FCGI_CHILDREN: Anzahl der zu forkenden bzw. erstellenden Prozesse<br />
PHP_FCGI_MAX_REQUESTS: Anzahl von Requests, nach denen der Prozess stirbt (neue werden automatisch erstellt)<br />
PHP_CGI: Pfad zu php5-cgi</p>
<p>Evtl. muß nun noch der Pfad zu php5-cgi und der Benutzer angepasst werden und wir können das Script nach einem chmod ausführen:</p>
<p><code># chmod 700 /etc/init.d/fastcgi<br />
# /etc/init.d/fastcgi start<br />
</code></p>
<p>Mit dem Befehl &#8220;ps ax&#8221; sollten wir nun in der Prozessliste unsere PHP-Prozesse laufen sehen und gehen jetzt  zur <a href="#nginx-config">nginx-Konfiguration</a> über.</p>
<h4>Fast-CGI mit spawn-fcgi</h4>
<p><a href="http://redmine.lighttpd.net/projects/spawn-fcgi" target="_blank">spawn-fcgi</a> macht eigentlich auch nichts anderes als das Startscript unter Ubuntu. Es erstellt einen TCP/Unix-Domain-Socket und die gewünschte Anzahl von Prozessen unter einem bestimmten Benutzer und leitet die Ausgaben ensprechend um. Zur Installation benötigen wir natürlich die aktuellen Sourcen von spawn-fcgi, deren Link wir auf der <a href="http://redmine.lighttpd.net/projects/spawn-fcgi/news" target="_blank">News-Seite des Projektes</a> erhalten. Download, Entpacken und ins Verzeichnis wechseln:</p>
<p><code># wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz<br />
# tar -xvzf spawn-fcgi-1.6.3.tar.gz<br />
# cd spawn-fcgi-1.6.3<br />
</code></p>
<p>Nun folgt das bekannte Zweiergespann zum Kompilieren. spawn-fcgi besitzt keine Install-Routine, weshalb wir dies selbst vornehmen müssen:</p>
<p><code># ./configure<br />
# make<br />
# cp ./src/spawn-fcgi /usr/bin/spawn-fcgi<br />
</code></p>
<p>Nun können wir das Tool das erste mal starten.</p>
<p><code>/usr/bin/spawn-fcgi -a 127.0.0.1 -p 8088 -F 3 -u www -f /usr/bin/php5-cgi</code></p>
<p>Die Bedeutung der Optionen:</p>
<pre>
-a    IP-Adresse, an der auf Verbindungen gewartet wird
-p    Port, an dem auf Verbindungen gewartet wird
-w    User unter dem die Prozesse laufen sollen
-f    Pfad zum PHP-CGI
-F    Anzahl der Prozesse, die geforkt werden sollen
</pre>
<p style="margin-top: 10px;">
<p><a name="nginx-config"></a></p>
<h3>Konfiguration des nginx für PHP mit Fast-CGI</h3>
<p>Wenn wir bereits einen fertigen nginx am Laufen haben, sind nur wenige Zeilen in der Konfiguration zu ergänzen. Ansonsten lies bitte zuerst meine <a href="/nginx-eine-echte-apache-alternative.html">Anleitung zur Installation und Konfiguration des nginx</a>.</p>
<p>Innerhalb des Vhosts, also innerhalb von server {} fügen wir eine neue Location-Direktive für PHP-Files hinzu:</p>
<p><code>&nbsp;&nbsp;&nbsp;location ~ .*\.php$ {<br />
&nbsp;&nbsp;&nbsp;  root /var/www/meinedomain.de/htdocs;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_pass  127.0.0.1:8088;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_index index.php;<br />
&nbsp;&nbsp;&nbsp;  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;<br />
&nbsp;&nbsp;&nbsp;  include fastcgi_params;<br />
&nbsp;&nbsp;&nbsp;}<br />
</code></p>
<p>Hier darauf achten, das die Angaben in fastcgi_pass mit denen der vorhin konfigurierten übereinstimmen. include fastcgi_params inkludiert eine Datei, die bei der nginx-Installation enthalten ist, möchte Sie hier jedoch abbilden für den Fall das&#8230;</p>
<p><code>fastcgi_param  QUERY_STRING       $query_string;<br />
fastcgi_param  REQUEST_METHOD     $request_method;<br />
fastcgi_param  CONTENT_TYPE       $content_type;<br />
fastcgi_param  CONTENT_LENGTH     $content_length;<br />
<br />
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br />
fastcgi_param  REQUEST_URI        $request_uri;<br />
fastcgi_param  DOCUMENT_URI       $document_uri;<br />
fastcgi_param  DOCUMENT_ROOT      $document_root;<br />
fastcgi_param  SERVER_PROTOCOL    $server_protocol;<br />
<br />
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br />
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;<br />
<br />
fastcgi_param  REMOTE_ADDR        $remote_addr;<br />
fastcgi_param  REMOTE_PORT        $remote_port;<br />
fastcgi_param  SERVER_ADDR        $server_addr;<br />
fastcgi_param  SERVER_PORT        $server_port;<br />
fastcgi_param  SERVER_NAME        $server_name;<br />
<br />
# PHP only, required if PHP was built with --enable-force-cgi-redirect<br />
fastcgi_param  REDIRECT_STATUS    200;<br />
</code></p>
<p>Damit nginx auch beim Aufruf der Domain ohne Dateiname in der <a href="http://de.wikipedia.org/wiki/Uniform_Resource_Locator" target="_blank">URL</a> die Startseite als PHP ausführt, müssen wir zwei Parts in der bestehenden Konfiguration unter server {} anpassen bzw neu einsetzen:</p>
<p>Als erstes machen wir die Datei index.php zur ersten Wahl beim Aufruf ohne Dateiname:</p>
<p><code>index   index.php index.html index.htm;<br />
</code></p>
<p>Alles andere was nicht gefunden wird, leiten wir ebenfalls auf index.php weiter:</p>
<p><code>        # this sends all non-existing file or directory requests to index.php<br />
        if (!-e $request_filename) {<br />
            rewrite . /index.php last;<br />
        }<br />
</code></p>
<p>Das komplett Konfigfile könnte nun so aussehen:</p>
<p><code>server {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# IP-Adresse und Port, an denen für Web-Zugriffe gelauscht wird<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listen&nbsp;&nbsp;&nbsp;&nbsp;   1.2.3.4:80;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Domains, auf die dieser Server hören soll<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_name  www.meinedomain.de meinedomain.de;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Hauptverzeichnis für Dokumente<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/www/meinedomain.de/htdocs;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Ort des Access-Logfiles<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_log /var/www/meinedomain.de/logs/access_log vhosts;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Definition des Index-Files (Startseite, für Anfragen ohne Dateiname)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index index.php index.html index.htm;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Wenn Zugriff auf andere als Standarddomain,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# auf diese per 301 permanent weiterleiten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($host != 'www.meinedomain.de' ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rewrite  ^/(.*)$  http://www.meinedomain.de/$1  permanent;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Für Bilder und einige andere Dateitypen Access-Log ausschalten und<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Expire-Zeit  auf 7 Tage erhöhen (sendet den entspr. Expire-Header)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~* ^.+\.(js|css|jpg|jpeg|gif|png|pdf|zip|rar)$ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  access_log   off;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  expires&nbsp;&nbsp;&nbsp;&nbsp;  7d;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location / {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Nützlich für SSL und evtl. später hinzukommende Scriptsprachen<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Real-IP  $remote_addr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_set_header Host $http_host;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  proxy_redirect off;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # Wenn die angeforderete statische Datei existiert, diese ausliefern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # ohne die anderen Regeln weiter unten zu beachten<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (-f $request_filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  # this sends all non-existing file or directory requests to index.php<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (!-e $request_filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rewrite . /index.php last;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location ~ .*.php$ {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  root /var/www/meinedomain.de/htdocs;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_pass 127.0.0.1:8088;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_index index.php;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  include fastcgi_params;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
</code></p>
<p>Jetzt heißt es den nginx mit <code>/etc/init.d/nginx restart</code> neu starten und PHP ist einsatzbereit.</p>
<p>WordPress kann nun ganz normal installiert und verwendet werden.</p>
<p>Insofern man ein Cache-Modul wie <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP-Super-Cache</a> nutzt, sollte man noch die entsprechenden RewriteRules für die statischen HTML-Dateien setzen. Für WP-Super-Cache beispielsweisse einfach folgende Zeilen innerhalb location / {} und vor der Einstellung für die .php-Dateien kopieren:</p>
<p><code>      if (-f $document_root/cache$fastcgi_script_name) {<br />
        rewrite (.*) /cache$1 break;<br />
      }<br />
      if (-f $document_root/cache/$fastcgi_script_name/index.html) {<br />
        rewrite (.*) /cache/$1/index.html break;<br />
      }<br />
      if (-f $document_root/cache$fastcgi_script_name.html) {<br />
        rewrite (.*) /cache$1.html break;<br />
      }<br />
</code></p>
<p>Geschafft! Jetzt haben wir nginx mit PHP laufen und können uns über die bessere Performance freuen. Wenn du noch weitere Beispiele für Konfigurationen, auch für andere Sprachen und Einsatzmöglichkeiten suchst, empfiehlt sich ein Blick auf die <a href="http://wiki.nginx.org/Configuration" target="_blank">Configuration-Seite von nginx</a>.</p>
<p>Sicher folgen noch einige Artikel mehr über den nginx, um meine Begeisterung kund zu tun ;-) Solltest Du also Fragen, Wünsche, Vorschläge oder sonstiges haben, ab damit in die Kommentare, ich freue mich!</p>
<p style="margin-top: 40px;">
<strong>Credits:</strong></p>
<p>Original-Foto <a href="http://www.flickr.com/photos/jurvetson/2261734491/" target="_blank">Strap-On Video Rocket</a> unter Creative Commons von <a href="http://www.flickr.com/photos/jurvetson" target="_blank">jurvetson auf Flickr</a>. Danke!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/wordpress-langsam-php-und-wordpress-schneller-machen-mit-nginx-und-fast-cgi.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP-Einzeiler</title>
		<link>http://stetix.de/php-einzeiler.html</link>
		<comments>http://stetix.de/php-einzeiler.html#comments</comments>
		<pubDate>Wed, 22 Dec 2010 13:05:39 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[einzeiler]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1666</guid>
		<description><![CDATA[Ich liebe Einzeiler und in einer Zeile Code das zu machen, wofür andere oder man selbst vorher ganze 20 Zeilen oder mehr benötigte. Um sich diese Einzeiler zu merken, fange ich hier einfach mal eine Liste an, die ich ständig erweitern werde. Auch wenn die Zeichen aufgrund mangelnder Breite in meinem Layout umbrechen, sind dies [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Ich liebe Einzeiler und in einer Zeile Code das zu machen, wofür andere oder man selbst vorher ganze 20 Zeilen oder mehr benötigte. Um sich diese Einzeiler zu merken, fange ich hier einfach mal eine Liste an, die ich ständig erweitern werde.</p>
<p>Auch wenn die Zeichen aufgrund mangelnder Breite in meinem Layout umbrechen, sind dies alles Einzeiler ;-)</p>
<h3>Zufallsstring mit PHP &#8211; Einzeiler</h3>
<h4>Variante 1</h4>
<p><code>echo substr(str_shuffle("23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"), 0, 8);<br />
</code><br />
Ja, ich kann zählen und das Alphabet auch. Unnötige und für Passwörter ungeeignete Zeichen habe ich hier weg gelassen.</p>
<h4>Variante 2</h4>
<p>Wer es noch kürzer braucht, kann auch md5 nehmen. Danke an Jonathan für den Hinweis. Aber Achtung, hier sind nur die Zeichen 0-9 und a-f enthalten.<br />
<code>echo substr(md5(time()),0,8);</code><br />
Du hast auch schöne Einzeiler, die richtig Sinn und das PHP-Entwickler-Leben leichter machen? Bitte ab damit in die Kommentare oder per E-Mail an mich. Danke!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/php-einzeiler.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Auf WordPress entwickeln oder lieber eigene Anwendungen z.B. in Ruby on Rails schreiben?</title>
		<link>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html</link>
		<comments>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html#comments</comments>
		<pubDate>Thu, 16 Dec 2010 15:48:13 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1613</guid>
		<description><![CDATA[Aktuell stelle ich mir oft die Frage, ob ich Software für WordPress entwickle oder eine eigene Anwendung in Ruby on Rails schreibe. Beides hat seine Vor- und Nachteile. Ich entwickle seit 10 Jahren Software in PHP, seit etwa 5 Jahren auch in Ruby on Rails, was ich aufgrund seiner vielen bekannten positiven Eigenschaften bei komplett [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2010/12/wordpress-oder-rails.jpg" alt="wordpress oder rails Auf Wordpress entwickeln oder lieber eigene Anwendungen z.B. in Ruby on Rails schreiben?" title="wordpress-oder-rails" width="351" height="186" class="alignright size-full wp-image-1622" />Aktuell stelle ich mir oft die Frage, ob ich Software für WordPress entwickle oder eine eigene Anwendung in Ruby on Rails schreibe. Beides hat seine Vor- und Nachteile. Ich entwickle seit 10 Jahren Software in PHP, seit etwa 5 Jahren auch in Ruby on Rails, was ich aufgrund seiner vielen bekannten positiven Eigenschaften bei komplett neuen Anwendungen auf jeden Fall vorziehen würde. Aus diesem Grund stellt sich mir diese Frage, obwohl Rails und WordPress auf den ersten Blick ja nicht unbedingt in der gleichen Kategorie von Tools anzusiedeln sind, auf den zweiten aber beides Frameworks mit ähnlichen Voraussetzungen sind.</p>
<p><a href="http://wordpress.org/">WordPress</a> hat eine riesige Community, viele Nutzer und einen hohen Bekanntheitsgrad. Wenn man beispielsweisse ein <a href="http://codex.wordpress.org/Plugins">WordPress-Plugin</a> schreiben möchte, kann man sich <a href="http://wordpress.org/extend/plugins/">durch schon vorhandene Plugins</a> wuseln und von bestehendem Code Anregungen holen und evtl. sogar Teile verwenden &#8211; natürlich nur unter Einhaltung des Copyrights. Möchte man dieses Plugin verkaufen, hat man mit WordPress eine sehr große und täglich wachsende Menge an potenziellen Kunden. Ein weiterer Vorteil ist die große Menge an Einsatzgebieten von WordPress. WordPress kann als Blog verwendet werden, als normale Webseite mit oder ohne CMS, als Forum, als Gallery, als Community und und und. Das meiste natürlich mit fertigen Plugins. Warum also etwas eigenes entwickeln, wenn es alles schon gibt? Zumal ja fast jede Webseite sowieso einen Blog und somit auch WordPress hat und benötigt. Die Nachteile bei WordPress liegen ganz klar bei der mangelnden Performance und &#8211; für mich persönlich &#8211; an der  etwas veralteten Scriptsprache <a href="http://de.php.net/">PHP</a>. Logisch kann man die Performance mit ein paar Tricks, passenden Plugins und besserer Server-Hardware tunen, dennoch ist WordPress den eigenen Lösungen in PHP oder Ruby On Rails klar unterlegen. Gerade wenn der Content in der Datenbank wächst &#8211; und ich meine hiermit eine Menge von 1000+ Artikeln &#8211; wird WordPress zur Slow-Motion-Bremse.</p>
<p><a href="http://rubyonrails.org/">Ruby on Rails</a> ist hingegen, wenn man es richtig anstellt, ein richtiger Turbo und Spaßfaktor. Das Coden in Ruby macht einfach einen Riesenspaß, was die Produktivität um einiges steigert. Das <a href="http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself">DRY-Prinzip</a> richtig angewendet, muß hier bei gleicher Funktionalität auch weniger Code geschrieben werden. Man kann also sagen, das mit Rails einfacher in hoher Qualität Software entwickelt werden kann. Ebenso gibt es für fast alle Belange fertige Plugins und Librarys, die man beliebig erweitern und verwenden kann. Die Menge der Entwickler ist zwar hoch und wird immer höher, aber es gibt lange noch nicht so viele wie für WordPress. Ruby On Rails wird eher von Profis eingesetzt, Hobby-Entwickler hingegen greifen schnell zu PHP und WordPress. Desweiteren benötigt man für Rails immer eine gesonderte Server-Konfiguration, weshalb die meisten bekannten Webhoster hier ausscheiden. Noch ein negativer Punkt ist, das es für Rails keine gute Blog-Software gibt. Zwar sind <a href="https://github.com/fdv/typo/wiki/">einige</a> <a href="http://radiantcms.org/">wenige</a> <a href="https://github.com/halorgium/mephisto">Versuche</a> <a href="https://github.com/xaviershay/enki">vorhanden</a>, die an WordPress jedoch bei weitem nicht heranreichen. Schade eigentlich, eine gute Blog-Software in Ruby wär was feines und sicher ein schönes Projekt.</p>
<p>Also bleibt ganz klar eines zu sagen. Möchte man Software vielen Millionen Menschen verfügbar machen oder womöglich verkaufen, empfiehlt sich der Einsatz von WordPress. Legt man jedoch Wert auf Performance,  Spaß beim Coden und hat Profis zur Hand, ist Rails eine gute Wahl. Also ist meine erste Überlegung in der Richtung ab jetzt: &#8220;Möchte ich die Software nur für mich oder auserwählte Kunden nutzen oder an tausende Kunden verkaufen?&#8221;.</p>
<p><strong>Was meint Ihr dazu?</strong> Lieber WordPress oder Rails bzw. anderen Sprachen oder Frameworks? Freu mich über Kommentare!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/auf-wordpress-entwickeln-oder-lieber-eigene-anwendungen-z-b-in-ruby-on-rails-schreiben.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP Session Garbage Collection in anderen Verzeichnissen unter Ubuntu und Debian</title>
		<link>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html</link>
		<comments>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 11:10:41 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sessions]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=1371</guid>
		<description><![CDATA[Eben entdeckt: Bei Ubuntu und Debian ist in PHP standardmässig die Garbage Collection deaktiviert. Diese sorgt dafür, das die Sessionfiles für abgelaufene Sessions automatisiert gelöscht werden. Bei Ubuntu und Debian löst ein Cronjob diesen Löschvorgang. Ein Problem entsteht allerdings, wenn man eigene Verzeichnisse für die Sessionfiles definiert. Hier werden die Files dann nicht gelöscht und [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2009/10/php-icon.jpg" alt="php icon PHP Session Garbage Collection in anderen Verzeichnissen unter Ubuntu und Debian" title="php-icon" width="150" height="150" class="alignright size-full wp-image-1040" />Eben entdeckt: Bei <a href="http://www.ubuntu.com/">Ubuntu</a> und <a href="http://www.de.debian.org/">Debian</a> ist in <a href="http://php.net/index.php">PHP</a> standardmässig die <a href="http://de.wikipedia.org/wiki/Garbage_Collection">Garbage Collection</a> deaktiviert. Diese sorgt dafür, das die Sessionfiles für abgelaufene Sessions automatisiert gelöscht werden. Bei Ubuntu und Debian löst ein Cronjob diesen Löschvorgang. </p>
<p>Ein Problem entsteht allerdings, wenn man eigene Verzeichnisse für die Sessionfiles definiert. Hier werden die Files dann nicht gelöscht und bleiben bestehen, was das Verzeichnis &#8211; je nach Traffic &#8211; schnell auf ein paar Tausende Dateien anwachsen lassen kann.</p>
<p>Um die Garbage Collection in PHP zu aktivieren, muss folgender Eintrag in der php.ini (für Apache unter /etc/php5/apache2/php.ini) geändert werden:</p>
<p>VORHER</p>
<p><code>;session.gc_probability = 0<br />
session.gc_divisor     = 100</code></p>
<p>NACHHER</p>
<p><code>session.gc_probability = 1<br />
session.gc_divisor     = 100</code></p>
<p>Diese Änderung bewirkt, das bei jedem hundertsten Start einer Session die Sessionfiles gelöscht werden.</p>
<p>Zusätzlich muss dann noch der Cronjob deaktiviert werden. Hierzu einfach /etc/cron.d/php5 mit dem Editor deiner Wahl bearbeiten und die letzte Zeile auskommentieren:</p>
<p><code># /etc/cron.d/php5: crontab fragment for php5<br />
#  This purges session files older than X, where X is defined in seconds<br />
#  as the largest value of session.gc_maxlifetime from all your php.ini<br />
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime<br />
<br />
# Look for and purge old sessions every 30 minutes<br />
#09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] &#038;&#038; [ -d /var/lib/php5 ] &#038;&#038; find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm<br />
</code></p>
<p>Was der Grund für diese Deaktivierung bei Ubuntu oder Debian war konnte ich auf die Schnelle nicht herausfinden, werde es aber in einem Update nachliefern. </p>
<p>Wenn in Linux-Distributionen solche Änderungen vorgenommen werden, sollte man aber passende Toolsets liefern, um alle Variationen abzufangen. So ist das nur eine halbe Sache, wenn ich nichts übersehen habe. Der Bug wurde auch schon <a href="https://bugs.launchpad.net/ubuntu/+source/php5/+bug/316441">im Ubuntu-Bugtracker aufgenommen</a>, aber noch keinem zugeordnet.</p>
<p>Weiterführende Links:</p>
<ul style="margin-bottom: 40px;">
<li><a href="http://de.php.net/manual/de/session.configuration.php#ini.session.gc-probability">PHP Dokumenation: session.gc-probability</a></li>
<li><a href="https://bugs.launchpad.net/ubuntu/+source/php5/+bug/316441">Bug bei Ubuntu</a></li>
</ul>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/php-session-garbage-collection-in-anderen-verzeichnissen-unter-ubuntu-und-debian.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress: PHP-Code und PHP-Script einbinden</title>
		<link>http://stetix.de/wordpress-phpcode-und-phpscript-einbinden.html</link>
		<comments>http://stetix.de/wordpress-phpcode-und-phpscript-einbinden.html#comments</comments>
		<pubDate>Thu, 08 Oct 2009 15:45:36 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=986</guid>
		<description><![CDATA[Wenn man PHP-Code bzw. bestehende oder neue PHP-Dateien in WordPress einbinden möchte, macht man das am besten im aktuellen Theme von WordPress. Man legt ein sogenanntes Seiten-Template an, welches man bei der Bearbeitung der Seite in WordPress wählen kann. In diesem Template befindet sich dann das gewünschte PHP-Script. Seiten-Template mit PHP-Code im Theme Ordner von [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img src="http://stetix.de/wp-content/uploads/2009/10/php-icon.jpg" alt="php icon Wordpress: PHP Code und PHP Script einbinden" title="php-icon" width="150" height="150" class="alignright size-full wp-image-1040" /><img src="http://stetix.de/wp-content/uploads/2009/10/wp-icon-150x150.gif" alt="wp icon 150x150 Wordpress: PHP Code und PHP Script einbinden" title="wp-icon-150x150" width="150" height="150" class="alignright size-full wp-image-1041" />Wenn man PHP-Code bzw. bestehende oder neue PHP-Dateien in WordPress einbinden möchte, macht man das am besten im aktuellen Theme von WordPress. Man legt ein sogenanntes Seiten-Template an, welches man bei der Bearbeitung der Seite in WordPress wählen kann. In diesem Template befindet sich dann das gewünschte PHP-Script. </p>
<p><span id="more-986"></span></p>
<h3>Seiten-Template mit PHP-Code im Theme Ordner von WordPress anlegen</h3>
<p>Lege eine neue Datei im Theme-Ordner unter <em>wp-content/theme/&lt;themename&gt;/deintemplate.php</em> mit folgendem Inhalt an:</p>
<p><code>&lt;?<br />
/*<br />
Template Name: DeinTemplate-Name<br />
*/<br />
?&gt;<br />
&lt;?php get_header(); ?&gt;<br />
<br />
&lt;?php if (have_posts()) : ?&gt;<br />
&lt;?php while (have_posts()) : the_post(); ?&gt;<br />
<br />
&lt;div class="post page"&gt;<br />
&lt;h2&gt;&lt;?php the_title(); ?&gt;&lt;/h2&gt;<br />
&lt;?php the_content(); ?&gt;<br />
&lt;/div&gt;<br />
<br />
&lt;?php endwhile; ?&gt;<br />
&lt;?php endif; ?&gt;<br />
<br />
&lt;?php echo &quot;Hier kommt mein tolles PHP-Script bzw. der PHP-Code rein!&quot;; ?&gt;<br />
<br />
&lt;?php get_footer(); ?&gt;<br />
</code></p>
<p>Wichtig hierbei ist der Kommentar, der unbedingt enhalten sein muss. WordPress erkennt anhand des Strings &quot;Template Name&quot;, das es sich um ein Template handelt. Die Funktion <a href="http://codex.wordpress.org/Function_Reference/get_header">get_header</a> bindet das Header Template ein (wie gewohnt) und die Funktion <a href="http://codex.wordpress.org/Function_Reference/get_footer">get_footer</a> das Footer-Template. Nach dem Header wird mit den <a href="http://codex.wordpress.org/The_Loop">Post-Funktionen</a> der Inhalt der Seite, also die Headline und der Text, ausgelesen.<br />
Anstelle des echo-Befehles (Hier kommt mein&#8230;) kann jetzt gewünschter PHP-Code eingefügt werden.</p>
<h3>Seiten-Template auswählen und Seite mit PHP-Code anlegen</h3>
<p>Jetzt kannst du im WordPress-Admin in der Seiten-Verwaltung unter &quot;Seiten&quot; ganz normal eine Seite anlegen und auf der rechten Seite neben dem Formular das erstellte Seiten-Template mit dem Namen aus dem Kommentar auswählen. Seite veröffentlichen und schon wird der Code (der hoffentlich fehlerfrei ist) auf der erstellten Seite ausgeführt.</p>
<p>Das Verfahren kann man natürlich beliebig weiterführen und komplexere Anwendungen in das Template einbinden. Das kurze Tutorial hier soll lediglich als Einstieg in dieses Thema dienen.</p>
<p>Mehr Info bei WordPress: <a href="http://codex.wordpress.org/Pages#Default_Theme_Page_Templates">Theme-Page-Templates</a></p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/wordpress-phpcode-und-phpscript-einbinden.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>301 Weiterleitung einer Website per mod-rewrite</title>
		<link>http://stetix.de/301-weiterleitung-einer-website-per-mod-rewrite.html</link>
		<comments>http://stetix.de/301-weiterleitung-einer-website-per-mod-rewrite.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 19:12:49 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://stetix.de/?p=191</guid>
		<description><![CDATA[Wenn sich die Domain oder Url einer Website geändert hat, empfiehlt sich eine Weiterleitung auf die neue Adresse mit dem HTTP-Statuscode 301 (Moved Permanently). Der Code 301 deshalb, damit auch Suchmaschinen wie Google wissen, das sich die Adresse für immer geändert hat und nur die neue Url verwendet werden soll. Google berücksichtigt hier auch den [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Wenn sich die Domain oder Url einer Website geändert hat, empfiehlt sich eine Weiterleitung auf die neue Adresse mit dem <a href="http://de.wikipedia.org/wiki/HTTP-Statuscode">HTTP-Statuscode</a> 301 (Moved Permanently). Der Code 301 deshalb, damit auch Suchmaschinen wie <a href="http://www.google.de">Google</a> wissen, das sich die Adresse für immer geändert hat und nur die neue Url verwendet werden soll. Google berücksichtigt hier auch den Pagerank und ordnet diesen der neuen URL zu.</p>
<h3>Die Technik</h3>
<p>Technisch gesehen werden vom Webserver im HTTP 2 Zeilen an den Client (Nutzer mit Browser, Suchmaschine) gesendet. Eine mit dem Statscode und eine mit dem Ziel der Weiterleitung:</p>
<p><code>HTTP/1.1 301 Moved Permanently<br />
Location: http://www.neue-url.de/pfad/zur/datei.htm<br />
</code></p>
<p>Eine HTTP-Sitzung per Telnet auf Port 80 sieht dann zum Beispiel so aus:</p>
<p><code># telnet alte-domain.de 80<br />
Trying 12.34.56.78...<br />
Connected to alte-domain.de.<br />
Escape character is '^]'.<br />
GET / HTTP/1.1<br />
Host: alte-domain.de<br />
<br />
HTTP/1.1 301 Moved Permanently<br />
Date: Thu, 25 Feb 2009 20:06:55 GMT<br />
Server: Apache/2.2.11<br />
Location: http://neue-domain.de/<br />
Content-Length: 225<br />
Connection: close<br />
Content-Type: text/html; charset=iso-8859-1<br />
<br />
&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;<br />
&lt;html&gt;&lt;head&gt;<br />
&lt;title&gt;301 Moved Permanently&lt;/title&gt;<br />
&lt;/head&gt;&lt;body&gt;<br />
&lt;h1&gt;Moved Permanently&lt;/h1&gt;<br />
&lt;p&gt;The document has moved &lt;a href="http://neue-domain.de/"&gt;here&lt;/a&gt;.&lt;/p&gt;<br />
&lt;/body&gt;&lt;/html&gt;<br />
Connection closed by foreign host.<br />
</code></p>
<h3>mod_rewrite &#8211; die Lösung</h3>
<p>Um dies mit Hilfe des Webservers Apache zu lösen, hilft uns das Modul Rewrite, kurz <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a>. Hat man Zugriff auf die Konfigurationsdatei des Webservers, kann man die Rewrite-Weiterleitung im <a href="http://httpd.apache.org/docs/2.2/mod/core.html#virtualhost">VirtualHost</a>, in der <a href="http://httpd.apache.org/docs/2.2/mod/core.html#directory">Directory</a>- oder <a href="http://httpd.apache.org/docs/2.2/mod/core.html#location">Location</a>-Direktive vornehmen. Anonsten erstellt man eine <a href="http://httpd.apache.org/docs/2.2/howto/htaccess.html">.htaccess</a>-Datei und nimmt die Konfiguration hier vor.<br />
Um mod_rewrite zu aktivieren, benötigen wir folgende zwei Zeilen:</p>
<p><code>RewriteEngine on<br />
RewriteBase /<br />
</code><br />
<span id="more-191"></span>Die erste Zeile aktiviert das Modul und die zweite setzt den Basis-Pfad, für den die folgende Rewrite-Konfiguration dienen soll. Möchten wir beispielsweise nur für das Verzeichnis <em>/homepage/blog/</em> eine Weiterleitung erstellen, benötigen wir folgende Einstellung:</p>
<p><code>RewriteEngine on<br />
RewriteBase /homepage/blog/<br />
</code></p>
<p>Als nächstes definieren wir unsere Regel für die Weiterleitung. Diese beinhaltet das Suchmuster und den Ersatz, d.h. die Original-Url und die neue Adresse der URL-Weiterleitung. Das tolle ist, das hier <a href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck">Reguläre Ausdrücke</a> verwendet werden können. Die Syntax ist wie folgt:</p>
<p><code>RewriteRule &lt;suchmuster&gt; &lt;ersatz&gt;<br />
</code></p>
<p>Eine Domain-Weiterleitung mit mod_rewrite würde zum Beispiel so aussehen:</p>
<p><code>RewriteRule ^(.*)$ http://www.neuedomain.de/$1 [R=301,L]<br />
</code></p>
<p>Eine Weiterleitung eines Verzeichnisses so:</p>
<p><code>RewriteRule ^homepage/blog(.*)$ http://www.neuedomain.de/homepage/blog$1 [R=301,L]<br />
</code></p>
<p>Das mit dem Modul Rewrite noch mehr Möglichkeiten z.B. dynamischer Weiterleitungen bestehen, verdeutlicht folgendes Beispiel:</p>
<p><code>RewriteRule ^([a-z\-]+)/([a-z\-]+)/(.*)$ http://www.neuedomain.de/$3?site=$1&amp;sub=$2 [R=301,L]<br />
</code></p>
<p>Jede Regel ist aber vorher gut zu durchdenken, da bei Fehlkonfiguration die Performance des Apache in Mitleidenschaft gezogen oder sogar zum Absturz, z.B. durch Endlosschleifen, gebracht werden kann. Mehr Informationen und viele Möglichkeiten mehr gibt es in der <a href="http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule">mod_rewrite Apache-Doku</a>.</p>
<h3>Andere Möglichkeiten einer Weiterleitung</h3>
<p>Ist mod_rewrite nicht installiert, oder keine Berechtigung zur Benutzung gegeben, müssen andere Lösungen her.</p>
<h4>Weiterleitung mit PHP</h4>
<p>Mit PHP könnte man oben beschriebene Weiterleitungen mit Hilfe der <a href="http://de.php.net/manual/de/function.header.php">header</a>-Funktion lösen.</p>
<pre name="code" class="php">&lt;?php
header('HTTP/1.1 301 Moved Permanently', true);
header('Location: http://www.neue-url.de/pfad/zur/datei.htm', true);
?&gt;</pre>
<h4>Weiterleitung mit Perl / CGI</h4>
<p>Auch mit Perl könnte man die Weiterleitung mit Hilfe eines Headers direkt per print lösen:</p>
<pre name="code" class="ruby">#!/usr/bin/perl

print "HTTP/1.1 301 Moved Permanently\n";
print "Location: http://www.neue-url.de/pfad/zur/datei.htm\n";</pre>
<h4>Weiterleitung mit Ruby</h4>
<p>In Ruby kann man dies zum Beispiel so realisieren:</p>
<pre name="code" class="ruby">#!/usr/bin/env ruby

require 'cgi'
cgi.header({'HTTP/1.1 301 Moved Permanently','Location'=&gt;'http://www.neue-url.de/pfad/zur/datei.htm'})</pre>
<h4>Clientseitig ohne 301-Status: Javascript</h4>
<p>Eine clientseitige Weiterleitung könnte mit Javascript realisiert werden. Nachteil ist hier, das bei deaktiviertem Javascript die Weiterleitung nicht funktioniert.</p>
<pre name="code" class="javascript">&lt;script type="text/javascript"&gt;
&lt;!--
window.location.replace("http://www.neue-url.de/pfad/zur/datei.htm");
// --&gt;
&lt;/script&gt;</pre>
<h4>Clientseitig ohne 301-Status: Weiterleitung per Meta-Tag</h4>
<p>Hierfür wird im Head Bereich des HTML-Codes ein Meta-Tag eingefügt, der durch Semikolon getrennt die Zeit angibt, die der Browser bis zur Weiterleitung warten soll und die URL des Ziels der Weiterleitung. Auch diese methode empfehle ich nicht, da dies wie auch Javascript Interpretationssache des Browsers ist, diesen tag zu beachten (Wobei alle Standard-Browser dies tun).</p>
<pre name="code" class="html">&lt;head&gt;
&lt;meta http-equiv="refresh" content="3; url=http://www.neue-url.de/pfad/zur/datei.htm"&gt;
&lt;!-- andere Tags im Header --&gt;
&lt;/head&gt;</pre>
<p>Meine Empfehlung: Immer mod-rewrite nutzen, da serverseitig, gut konfigurierbar und vielseitig einsetzbar. Sollte dies nicht vorhanden oder möglich sein, können die anderen genannten Möglichkeiten einer Weiterleitung (PHP oder andere serverseitige Script- bzw. Programmiersprache, Javascript, Meta-Tag &#8211; in der Reihenfolge) weiterhelfen.</p>
<p>Happy Redirecting!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/301-weiterleitung-einer-website-per-mod-rewrite.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Selectbox mit Prototype per Ajax befüllen</title>
		<link>http://stetix.de/selectbox-mit-prototype-per-ajax-befuellen.html</link>
		<comments>http://stetix.de/selectbox-mit-prototype-per-ajax-befuellen.html#comments</comments>
		<pubDate>Tue, 16 Dec 2008 17:22:49 +0000</pubDate>
		<dc:creator>Nico</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.mediashake.de/?p=14</guid>
		<description><![CDATA[Ich habe gestern mit einem Kollegen versucht, eine Selectbox mit dem Javascript-Framework Prototype per Ajax zu füllen. Mit jQuery &#8211; was wir in letzter Zeit mehr einsetzen &#8211; keine grössere Sache. Mit Prototype aber mussten wir etwas grübeln. Da ich in Google nicht wirklich fündig geworden bin, gibt es hier nun ein Beispiel. (Und ich [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-45" title="prototype" src="http://www.mediashake.de/wp-content/uploads/2008/12/prototype.png" alt="prototype Selectbox mit Prototype per Ajax befüllen" width="177" height="108" />Ich habe gestern mit einem Kollegen versucht, eine Selectbox mit dem <a href="http://www.prototypejs.org/">Javascript-Framework Prototype</a> per Ajax zu füllen. Mit jQuery &#8211; was wir in letzter Zeit mehr einsetzen &#8211; keine grössere Sache. Mit Prototype aber mussten wir etwas grübeln. Da ich in Google nicht wirklich fündig geworden bin, gibt es hier nun ein Beispiel. (Und ich kann gleich das Syntax-Highlighting in WordPress testen :-)  </p>
<p><span id="more-14"></span></p>
<p>Es soll anhand des Wertes einer Select-Box Daten per Ajax von einem PHP-Script geladen und in eine zweite Select-Box als Optionen hinzugefügt werden.</p>
<p>Zuerst benötigen wir zwei Select-Boxen:</p>
<pre name="code" class="html">

<label for="kategorie-select">Kategorie</label>
<select id="kategorie-select" name="kategorie">
<option>Bitte wählen</option>
<option value="1">Bücher</option>
<option value="2">Elektronik</option>
<option value="3">Spielwaren</option>
</select>

<label for="artikel-select">Artikel</label>
<select id="artikel-select" name="artikel">
</select>
</pre>
<p>Das Javascript (Prototype muss eingebunden sein):</p>
<pre name="code" class="javascript">
<script type="text/javascript">

$('kategorie-select').observe('change', function(event){

 var url = 'getartikel.php?kategorie=' + $('kategorie-select').value;
 new Ajax.Request(url,
 {
  method: 'get',
  onSuccess: function(transport, json)
  {
   var json = transport.responseText.evalJSON(true);

   // Selectbox reset
   $('artikel-select').length = 0;

   // Artikel der Selectbox hinzufuegen
   json.each(function(artikel)
   {
    newoption = new Option(artikel.name, artikel.id, false, false);
    $('artikel-select').options[$('artikel-select').length] = newoption;
   }); 
  }
 });

 });
</script>
</pre>
<p>Und hier noch das PHP-Script als Beispiel:</p>
<pre name="code" class="php">

/**
 * Artikel-Array, wuerde im echten Leben aus
 * einer Datenbank kommen.
 */
$artikel_data = array
(
  1 => array
      (
        array("id" => 1, "name" => "Artikel Nummer 1"),
        array("id" => 2, "name" => "Artikel Nummer 2"),
        array("id" => 3, "name" => "Artikel Nummer 3"),
      ),
  2 => array
      (
        array("id" => 4, "name" => "Artikel Nummer 4"),
        array("id" => 5, "name" => "Artikel Nummer 5"),
        array("id" => 6, "name" => "Artikel Nummer 6"),
      ),
  3 => array
      (
        array("id" => 7, "name" => "Artikel Nummer 7"),
        array("id" => 8, "name" => "Artikel Nummer 8"),
        array("id" => 9, "name" => "Artikel Nummer 9"),
      ),
);

/**
 * Als Json ausgeben
 */
if($_GET['kategorie'])
{
  echo json_encode($artikel_data[$_GET['kategorie']]);
}
</pre>
<p><a href="/examples/prototype_ajax_selectbox/index.htm">Hier</a> das <a href="/examples/prototype_ajax_selectbox/index.htm">gesamte Beispiel</a>. Viel Spass! Wenn jemand eine schnellere Lösung hat, nur her damit.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://stetix.de/selectbox-mit-prototype-per-ajax-befuellen.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using apc
Database Caching 1/80 queries in 0.030 seconds using apc
Object Caching 1710/1835 objects using apc

Served from: stetix.de @ 2012-05-22 00:53:30 -->
