Code Styling Project

It’s not a bug, it’s always a feature.
  • Deutsch
  • English
  • rss
  • Home
  • Blog
  • Impressum
  • Entwicklungen
  • Fehlerbehebungen
  • Anleitungen

WordPress Sprachdateiverarbeitung Betatest - erste Analysen

codestyling | 25. Juli 2009 | 12:42

Nachdem nun eine Menge Rückmeldungen eingegangen sind, habe ich ein paar Auswertungen vorgenommen. Die komplette Analyse folgt noch, denn ich hoffe noch auf weitere Meldungen. Dennoch zeigen sie 3 Sachen deutlich:

  • auf vielen Systemen gibt es eine Verbesserung
  • auf 64Bit Systemen gibt es Probleme
  • PHP 4 Support ist notwendig und gewünscht

Ich hab noch Forschungen in Richtung PHP Bugs betrieben und dort interessante Dinge entdeckt.

PHP 4 Support

Ich habe bereits Schnurpsel zum Test eine an PHP 4 angepasste Variante geschickt, bei positivem Testergebnis wird diese als nächstes verfügbar gemacht. Damit sollte es auch unter PHP 4 laufen.

Probleme mit 64bit Versionen

Die Probleme scheinen auf Systemen aufzutreten, auf denen PHP in 64bit läuft und dessen Version kleiner ist als 5.2.10, zumindest nach den Testdaten. Ich habe mich also auf die Suche begeben, ob der Bug Trac von PHP dazu etwas hergibt. Hier die Liste der für 64bit Systeme relevanten Bugs, die gefixt wurden:

ID Version Titel Details
47564 5.2.10 unpacking unsigned long 32bit bit endian returns wrong result Bugfix
47365 5.2.10 ip2long: 32bit vs. 64bit Bugfix
45877 5.2.10 Array key ‘2147483647′ left as string Bugfix
47422 5.2.9 modulus operator returns incorrect results on 64 bit linux Bugfix
44209 5.2.6 strtotime doesn’t support 64 bit timestamps Bugfix
42512 5.2.5 ip2long(’255.255.255.255′) should return 4294967295 on 64-bit PHP Bugfix
41765 5.2.4 Recode crashes/does not work on amd64 Bugfix
38770 5.2.1 pack/unpack is broken on 64bit Bugfix

Die angegebene PHP Version ist diejenige, in welcher der Fehler laut Changelog von PHP behoben wurde.
Da die Pack/Unpack sowie Integer Probleme direkt beim Verwenden von Sprachdateien zum Tragen kommen, würde ich davon ausgehen, das die beobachteten Phänomene auf 64bit Systemen (Sprachdateien werden nicht mehr geladen) in direktem Zusammenhang mit einem oder mehreren dieser Bugs steht. Dies werde ich noch eingehender untersuchen, denn die Sprachdateiverarbeitung beruht stark auf den o.g. Funktionen.

grundsätzliche Probleme im Umgang mit Speicher

Auch hier ist es nicht nur allein die “Schuld” von WordPress, Speicher zu verschwenden (auch wenn man sicher einiges effizienter programmieren könnte) sondern PHP selbst trägt auch je nach Version gehörig dazu bei, das der Speicher knapp wird. Auch hier erstmal eine Liste der Probleme, die ich ausgegraben hab:

ID Version Titel Details
48643 5.3.0 String functions memory issue (was:Memory not freed with FilterIterator) Bugfix
47038 5.3.0 Memory leak in include() Bugfix
46711 5.3.0 cUrl leaks memory Bugfix
46115 5.3.0 Memory leak when calling a method using Reflection Bugfix
45392 5.2.7
(scheinbar noch offen)
ob_start()/ob_end_clean() and memory_limit Bugfix
42663 5.2.10 gzinflate() try to allocate all memory with truncated $data Bugfix
46889 5.2.9 Memory leak in strtotime() Bugfix
44798 5.2.7 Memory leak assigning value to attribute (Fixed in PHP_5_3 branch!) Bugfix
44069 5.2.6 Huge memory usage with concatenation using . instead of .= Bugfix
42818 5.2.5 $foo = clone(array()); leaks memory Bugfix
41713 5.2.4 Persistent memory consumption since 5.2 Bugfix
37864 5.2.0 file_get_contents leaks memory on empty file Bugfix

Die meisten hier aufgezählten Bugs haben direkt mit der Verarbeitung von Daten in WordPress zu tun. Mit 2.8 wurden ja teilweise PHP 5 Funktionalitäten eingebaut wie Reflections für die Feeds (deshalb ist das Dashboard u.a. so hungrig). Auch gzinflate zum Packen von Scripten oder CSS gibt es ja jetzt neu, auch das ist also relevant. Da curl nun der Standard für den Transport im Backend ist (Feeds lesen, Updates holen etc), ist auch der beteiligt. Und das Beste ist der Bug 44069 in PHP 5.2.6 erst gefixt. Den sollte ich näher erläutern.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
$string = str_repeat('This is a teststring.', 50);
 
echo 'Length: '.strlen($string).'<br>';
echo 'Memory Before:'.memory_get_usage(true).'<br>';
 
for($i = 1; $i <= 2000; $i++)
{
//	$newstring .= $string; //This uses an expected amount of mem.
	$newstring = $newstring . $string; //This uses very much mem.
 
	for($j = 1; $j <= 10; $j++)
	{
		$array[] = 'test';
	}
}
echo 'Memory After:'.memory_get_usage(true).'<br>';
echo 'Total Length of String: '.strlen($newstring).'<br>';
 
?>
timing: 0.032s

Erwartetes Ergebnis:

Length: 1050
Before:262144
After:4456448
Length: 2100000

Aktuelles Ergebnis:

Length: 1050
Before:262144
After:161742848
Length: 2100000

Erster Kommentar eines PHP Entwickler zu einem anderen:

Dmitry, can you check this out please? The example script kills my
machine totally if I don’t use the .=

Um es nochmal klar zu formulieren:

  • erwarteter Speicherverbrauch: 4456448 Bytes = 4,25MB
  • tatsächlicher Speicherverbrauch: 161742848 = 154,25 MB !

Das o.g. Script macht nichts anderes, als die meisten WordPress Templates, Plugins oder der Core: Texte verketten und zwischendurch ein paar Aktionen mit Arrays veranstalten, also ganz normale Sachen, wie man sie in PHP Scripten zu Hunderten finden kann.
Das dabei die Maschine förmlich platzen kann, war mir so nicht klar. Zumal hier offensichtlich die Speicherveraltung von PHP einen deutlichen Knacks weg hatte. Ab der PHP Version 5.2.6 sollte dies behoben sein, es würde u.a. auch erklären, warum einige Server sehr viel mehr Speicher brauchen als andere mit den gleichen Plugins/Themes.

Soviel erstmal von der Analysefront, ich bin weiter an dem Thema dran, um das mal in brauchbare Bahnen zu bekommen. Bitte nicht ungeduldig werden, wenn ich nicht gleich Kommentare freigebe, bin auch mal auf einer Feier …
Und das Thema subscribe to comments ist in Planung, nur kollidiert es im Moment mit meinem Multi-Lingual Theme und der Kommentarbehandlung, wie sie mein Blog derzeit vornimmt. Wird aber demnächst möglich sein.

Update: Eine neue Version (v2) der Sprachdatei Speicherminimierung steht zum Download bereit, die Historie kann man jetzt vor dem Download mitlesen.

Kategorien
Deutsch, WordPress (DE)
RSS Kommentare
RSS Kommentare

« WordPress 2.8 - Sprachdatei Speicherverbrauch minimieren Wiederbelebung von Kubrick für WordPress 3.x Versionen »

Keine Antwort    Schreib einen Kommentar

Du kannst diese Tags verwenden : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Navigation

  • Allgemein
  • jQuery in WordPress
  • Politik
  • WordPress (DE)

Suche

Neuere Beiträge ...

  • Die Zukunft von BuddyPress und bbPress
  • Codestyling Localization und PoEdit sind wieder kompatibel
  • Chaos bei der WordPress Theme Übersetzung
  • Codestyling Localization beherrscht jetzt BuddyPress und bbPress
  • Wiederbelebung von Kubrick für WordPress 3.x Versionen

Ältere Beiträge ...

  • WordPress 2.8 - Sprachdatei Speicherverbrauch minimieren
  • Sprache der Administration - wie hätten Sie es denn gern ?
  • WordPress Lokalisierung - entdecke die Möglichkeiten
  • Neue Profile für Plugin Autoren auf wordpress.org
  • WordPress Plugins und “Changelog” - eine sinnvolle Erweiterung
rss RSS Kommentare valid xhtml 1.0 design by jide powered by Wordpress get firefox