<?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>Brusdeylins &#187; Pordpress</title>
	<atom:link href="http://brusdeylins.info/tag/pordpress/feed/" rel="self" type="application/rss+xml" />
	<link>http://brusdeylins.info</link>
	<description></description>
	<lastBuildDate>Thu, 26 Jan 2012 19:35:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Probleme mit gettext</title>
		<link>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/</link>
		<comments>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/#comments</comments>
		<pubDate>Sun, 21 Oct 2007 14:18:22 +0000</pubDate>
		<dc:creator>Matthias Brusdeylins</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pordpress]]></category>
		<category><![CDATA[Problem]]></category>

		<guid isPermaLink="false">http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/</guid>
		<description><![CDATA[Vor geraumer Zeit begegnete ich immer wieder einer nervigen Fehlermeldung:
Warning: unpack() [function.unpack]: Type V: not enough input,
need 4, have 0 in /***/wp-includes/gettext.php on line 85
ierbei handelt es sich um PHP-Dateien einer WordPress-Installation (Version 2.2.3 DE und Version 2.3 DE). Unter Unix ist GNU gettext eine weit verbreitete Bibliothek. Sie macht im Grunde nichts anderes, als [...]]]></description>
			<content:encoded><![CDATA[<p><!--:de-->Vor geraumer Zeit begegnete ich immer wieder einer nervigen Fehlermeldung:<br />
<code>Warning: unpack() [function.unpack]: Type V: not enough input,<br />
need 4, have 0 in /***/wp-includes/gettext.php on line 85</code><br />

<a href="http://brusdeylins.info/media/post-images/wordpress.jpg" title="WordPress-Logo" rel="lightbox[singlepic37]" >
	<img class="ngg-singlepic ngg-right" src="http://brusdeylins.info/media/cache/37__150x400_wordpress.jpg" alt="WordPress-Logo" title="WordPress-Logo" />
</a>
Hierbei handelt es sich um PHP-Dateien einer WordPress-Installation (Version 2.2.3 DE und Version 2.3 DE). Unter Unix ist <a href="http://www.gnu.org/software/gettext/" target="_blank">GNU gettext</a> eine weit verbreitete Bibliothek. Sie macht im Grunde nichts anderes, als einen &#252;bergebenen “originalen” String (in der Regel ein englischer Text) in einen entsprechenden String einer anderen Sprache zu &#252;bersetzen. Das Mapping zwischen diesen Strings befindet sich in so genannten MO-Dateien (z.B. “de_DE.mo”). Auch WordPress setzt solche Dateien f&#252;r die &#220;bersetzung ein.<!--:--><span id="more-47"></span><!--:de--></p>
<p><strong>(Gel&#246;st mit WordPress 2.6.1 &#8211; Details weiter unten</strong>&#8230;)<br />
PHP k&#246;nnte direkt mit gettext-Support kompiliert werden. Dadurch st&#252;nden entsprechende Funktionen direkt zur Verf&#252;gung. Doch w&#252;rde solch ein Programm nicht auf einem Rechner ohne entsprechende Unterst&#252;tzung laufen. Aus diesem Grund wurde in WordPress das Projekt <a href="https://savannah.nongnu.org/projects/php-gettext/" target="_blank">PHP gettext</a> integriert. Die Implementierung liegt in den Dateien “gettext.php” und “streams.php” im “wp-includes”-Verzeichnis. WordPress erh&#228;lt dadurch die F&#228;higkeit diese MO-Dateien einzulesen. Doch genau hier entstanden ab und zu Probleme.</p>
<h3>Betrachtung des Problems</h3>
<p>Die oben dargestellte Fehlermeldung kam bei mir sporadisch. Und ich kenne die Fehlerstelle genau. Sie befindet sich in der Datei “streams.php” in der Klasse <code>StringReader</code>. Und dort in der Funktion <code>read($bytes)</code>. Hier lieferte die Zeile <code>$data = substr($this-&gt;_str, $this-&gt;_pos, $bytes);</code> nicht immer den richtigen Teilstring zur&#252;ck. Manchmal war der Inhalt genau um ein Byte verschoben. Dadurch wurden in der Datei “gettext.php” in der Funktion gettext_reader(…) Strukturinformationen einer MO-Datei falsch interpretiert, was wiederum dazu f&#252;hrte, dass Mengenangaben komplett falsch eingelesen wurden. In solch einem Fehlerfall wurde die <code>seekto()</code> Funktion mit einem gro&#223;en negativen Wert aufgerufen, was dazu f&#252;hrte, dass der Stream-Positionszeiger an das Ende der Daten gesetzt wurde. Dadurch lieferte jeder weitere Aufruf der Lesemethode einen Leerstring zur&#252;ck. Und genau solch ein Leerstring wurde der Methode <code>unpack()</code> in der Datei “gettext.php” in der Zeile 85 &#252;bergeben, was zu der oben besagten Meldung f&#252;hrte.</p>
<p>Es ist zwar nicht wirklich eine L&#246;sung, doch hatte ich die oben benannte Codezeile tempor&#228;r mit folgenden Kommandos ausgetauscht:</p>
<p>Alter Code:</p>
<pre>$data = substr($this-&gt;_str, $this-&gt;_pos, $bytes);</pre>
<p>Neuer Code, der immer den richtigen Teilstring ermittelt:</p>
<pre>$data = "";
for ($i=0; $i&lt;$bytes; $i++) {
    $data .= $this-&gt;_str[$this-&gt;_pos+$i];
};</pre>
<p>Gibt man hier noch eine Meldung aus, sobald die beiden ermittelten Teilstrings unterschiedlich sind, dann merkte man, dass diese gleichzeitig mit dem hier beschriebenen Fehler auftauchte. Verglich man die Inhalte, sah man, dass bei einer Startposition &gt; 0 der Teilstring aus <code>substr()</code> um ein Zeichen/Byte verschoben war. Statt z.B. den Inhalt von Index 4-7 zu ermitteln, lieferte diese Methode dann die Zeichen 5-8. Wohl bemerkt, dies aber nur sehr sporadisch!</p>
<p>Eigentlich eine fatale Sache, wenn ein regul&#228;rer PHP-Befehl Probleme verursacht. Dieser Befehl, der Teile aus gegebenen Texten extrahiert, kommt in WordPress h&#228;ufiger zum Einsatz. Am sichtbarsten ist er in Kombination mit der Datei “gettext.php”, da hier ein Fehler geworfen wird. Aber mir ist ebenfalls aufgefallen, dass es auch Probleme mit dem Abspeichern geschriebener Inhalte gab. Hier kam es vor, dass an Stellen eingebundener Steuercodes (Links, Code-Tags) Teile des Inhaltes verschwanden. Man bemerkte die Fehlersituation, da der ber&#252;hmte gettext-Fehler auftrat. Aus diesem Grund lie&#223; ich die oben beschriebenen neuen Codezeilen auch nicht in meiner Installation. Mir sind mit diesem Code schon Inhalte verschwunden, ohne dass ich dies sofort bemerkte.</p>
<h3>L&#246;sungswege</h3>
<p>Auf jeden Fall musste die Problemursache an einer Server-Konfiguration oder –Komponente liegen. Ich verwalte noch eine weitere WordPress-Webseite und dort bekam ich noch keine Fehler. Zu erw&#228;hnen ist auch, das beide Seiten beim gleichen Provider gehostet werden, die gleiche PHP-Version installiert war und inzwischen bei beiden WordPress in der Version 2.3 vorlag.</p>
<p>Meine tempor&#228;re L&#246;sung bestand darin, dass ich auf meiner Seite die originale englische Version von WordPress installierte. Somit trat der Fehler seltener auf, da eine Sprachdatei weniger eingelesen werden musste. Er verschwand aber nicht komplett, weil noch PlugIns mit Sprachdateien installiert waren. Dies machte sich dann aber eher im Admin-Bereich, vor allem beim Speichern der Beitr&#228;ge bemerkbar.</p>
<p>Dank dem schnellen und motivierten Support meines Providers <a href="http://www.all-inkl.de/" target="_blank">All-Inkl.de</a> dachten wir zuerst, dass wir den Fehler eind&#228;mmen konnten. Der erste Versuch bestand darin, den ZEND-Optimizer zu installieren und weitere PHP-Parameter an den Parametern des Servers meiner anderen WordPress-Pr&#228;senz anzupassen. Leider ohne dem gew&#252;nschten Ergebnis. Ein Update der PHP-Installation von der Version 5.2.3 auf 5.2.4, sowie die Aktualisierung der Apache-Installation von der Version 2.2.4 auf 2.2.6 lie&#223;en den nervigen Fehler dann kurzzeitig doch verschwinden. Vermutlich besitzt <code>substr()</code> in PHP 5.2.3 nicht die erhoffte Stabilit&#228;t.</p>
<p><strong>Update 24.10.07:</strong><br />
Das Problem tritt seit heute leider wieder auf! Wom&#246;glich lag es doch nicht an der alten PHP-Version. Ich verfolge das weiter…</p>
<p><strong>Update 30.10.07:</strong><br />
Das ist schade, aber auch das Update auf Wordpress 2.3.1 DE brachte nicht den erhofften Erfolg. Wir sind leider so langsam am Ende mit dem Suchen, auch mit der Geduld. Der n&#228;chste Schritt besteht wohl darin, meinen Webspace innerhalb meines Providers auf einen anderen Server zu verschieben. Zur Zeit habe ich die Datei “/wp-includes/languages/de_DE.mo” entfernt, damit der Fehler nicht mehr so h&#228;ufig auftritt.</p>
<p><strong>Update 03.11.07:</strong><br />
Mein Provider All-Inkl hat nun meine Webseite auf einen anderen Server installiert. Seit dem scheint die Webseite ohne Probleme zu funktionieren. Schade ist nur, dass wir nun nicht genau wissen, welche Server-Einstellung / Hardware-Kombination hier wohl Probleme mit der Funktion <code>substr()</code> aus PHP 5 verursacht.</p>
<p><strong>Update:</strong><br />
Der Fehler taucht wieder auf&#8230;</p>
<p><strong>Update 15.11.07:</strong><br />
Heute wurde PHP 5.2.5 auf dem Webserver installiert. Laut All-Inkl bin ich der Erste, der diese Installation testen darf. Ich laufe nun auch wieder auf der originalen deutschen Version. Bis jetzt sind mir noch keine Probleme begegnet. Die Zeit wird zeigen, ob das die L&#246;sung war&#8230;</p>
<p><strong>Update 26.02.08:</strong><br />
Im <a href="http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/#comment-91">Kommentar Nr. 48</a> berichtet <em>Niko_K</em>, dass das Problem wohl durch nicht &#252;bereinstimmende Spracheinstellungen zwischen der WordPress-Configuration und dem Linux-System (Variable LANG) auftritt. Danke!</p>
<p>Ich <em>vermute</em> stark, dass PHP-String-Funktionen wie das <code>substr()</code> wohl abh&#228;ngig von den Systemeinstellungen sind und somit mit den richtigen Daten bef&#252;ttert werden m&#252;ssen.</p>
<p><strong>Update 25.04.08:</strong><br />
Im <a href="http://www.brusdeylins.info/wordpress/probleme-mit-gettextphp/#comment-271">Kommentar Nr. 60</a> berichtet <em>Kretzschmar </em>dar&#252;ber, dass der Fehler unter PHP 4 nicht mehr auftaucht. Die Umstellung von PHP 5 auf PHP 4 kann beim Provider All-Inkl wohl selbst vorgenommen werden.</p>
<p><strong>Ubdate 24.06.08:</strong><br />
Der Bug ist inzwischen schon bei Wordpress registriert (<a href="http://trac.wordpress.org/ticket/5599" target="_blank">Bug 5599</a> &#8211; danke an Codestyler f&#252;r den Hinweis). Hier wird aktuell eine Alternative zu <code>substr()</code> eingesetzt. Diese L&#246;sung ist eleganter als die oben beschriebene. Leider ist die korrigierte Stelle nicht die einzige mit dem Befehl <code>substr()</code>, weswegen man trotzdem ein Fehlverhalten bzw. Datenverlust in der Anwendung erwarten kann.</p>
<p><strong>Update 15.08.08:</strong><br />
Endlich! Wordpress 2.6.1 liefert nun ein <a href="http://blog.wordpress-deutschland.org/2008/08/15/aenderungen-in-wordpress-261.html" target="_blank">Bugfix</a> zu diesem Problem. Der Fehler tritt auf, sobald man in der <code>php.ini</code> den Eintrag <code>mbstring.func_overload</code> auf einen anderen Wert als 0 stellt. Meist erlauben die Provider es, diesen Wert f&#252;r die eigene Web-Pr&#228;senz zu &#228;ndern. Ein Bug im Apache-Modul <code>mod_php</code> sorgt allerdings bei dieser Art der Umstellung daf&#252;r, dass sie f&#252;r alle V-Hosts des Servers gilt! Sobald also ein User des gleichen V-Hosts an dieser Einstellung dreht, erscheinen bei den anderen WordPress-Pr&#228;senzen auf dem Server wohl diese Fehler, zumindes bis eine andere Pr&#228;senz diesen Wert wieder auf 0 stellt. N&#228;heres hierzu unter <a href="http://www.code-styling.de/deutsch/wordpress-fehler-durch-sprachdateien-die-ursache" target="_blank">code-styling.de</a>.</p>
<h3>Native L&#246;sung</h3>
<p>Es lief einige Tage gut, nun sind seit heute (06.11.2007) alle WordPress-Seiten auf dem neuen Server wohl auch betroffen&#8230;</p>
<p>Im <a href="http://forum.wordpress-deutschland.org/sprachdatei/24-wordpress-deutscher-sprache-7.html#post55919" target="_blank">deutschsprachigen WordPress-Forum</a> bin ich nun auf eine weitere L&#246;sung gesto&#223;en: Einsatz des originalen gettext() Kommandos. Diese L&#246;sung kann leider nur dann angewendet werden, wenn gettext auf dem entsprechenden Server installiert ist. Ein Blick in die PHP-Info liefert hierzu Informationen:<br />
<code>GetText Support enabled</code></p>
<p>Worin besteht die L&#246;sung? In der WordPress-Datei /wp-includes/l10n.php wird die WordPress-Version von gettext() aufgerufen. Der Code wird nun so ge&#228;ndert, dass die installierte Funktion gettext() anstelle der problematischen gettext-Vertretung aufgerufen wird. Dazu muss die Sprachdatei /wp-includes/languages/de_DE.mo zu wordpress.mo umbenannt und in ein neues Verzeichnis kopiert werden. Der Name des Verzeichnisses ist abh&#228;ngig von der eingestellten Codierung in der Datei wp-config.php:</p>
<p>Eine Sprachdefinition define (&#8217;WPLANG&#8217;, &#8216;de_DE.UTF-8&#8242;); ben&#246;tigt das Verzeichnis wp-includes/locale/de_DE.UTF-8/LC_MESSAGES/.</p>
<p>Lautet die Sprachdefinition define (&#8217;WPLANG&#8217;, &#8216;de_DE&#8217;); muss das Verzeichnis den Namen wp-includes/locale/de_DE/LC_MESSAGES/ tragen.</p>
<p>Wenn man will, kann man in der Datei wp-settings.php die Zeilen<br />
<code>include_once(ABSPATH . WPINC . ‘/gettext.php’);</code><br />
<code>include_once(ABSPATH . WPINC . '/streams.php');</code><br />
auskommentieren und die Dateien gettext.php und streams.php l&#246;schen.</p>
<p>Damit die Umstellung schnell vollzogen werden kann, hab ich f&#252;r WordPress 2.3.1 Deutsch ein kleines ZIP-File mit allen n&#246;tigen &#196;nderungen erstellt:</p>
<p><a href="http://brusdeylins.info/content/projects/native_gettext/native_gettext_WordPress_2.3.1.zip">Native_gettext_WordPress_2.3.1.zip</a></p>
<p>ACHTUNG:<br />
hier bitte auf die richtige Codierung achten, damit beim Posten keine Inhalte verloren gehen. Am Besten vorher ein Backup der Datenbank anlegen. Wenn eine andere Wordpress-Version unterst&#252;tzt werden soll, dann einfach die Sprachdateien aus dem ZIP-File entsprechend der obigen Anleitung selbst generieren.</p>
<p>Und nicht vergessen: somit ist das Anzeige-Problem gel&#246;st, der Fehler taucht nicht mehr auf, aber es gibt noch viele andere substr()-Aufrufe, welche schief laufen k&#246;nnen. Auff&#228;llig ist dabei Datenverlust an den Steuer-Tags aus der Code-Ansicht.<!--:--></p>
]]></content:encoded>
			<wfw:commentRss>http://brusdeylins.info/wordpress/probleme-mit-gettextphp/feed/</wfw:commentRss>
		<slash:comments>78</slash:comments>
		</item>
	</channel>
</rss>

