Könnte sich um diesen PHP Bug handeln, der u.a. hier auch aufgetreten ist: #1484880 (Attachments get corrupted on Ubuntu server 64bit 6.06.2 LTS) - RoundCube Webmail - Trac
-> PHP Bugs: #35859: fread limited to 8K
Das *.mo File wird am Stück geladen, wie dieser Auszug aus dem WP Core zeigt:
// Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends StringReader {
function CachedFileReader($filename) {
if (file_exists($filename)) {
$length=filesize($filename);
$fd = fopen($filename,'rb');
if (!$fd) {
$this->error = 3; // Cannot read file, probably permissions
return false;
}
$this->_str = fread($fd, $length);
fclose($fd);
} else {
$this->error = 2; // File doesn't exist
return false;
}
}
}
Alles anzeigen
Laut dem, was man in den Bugbeschreibungen im Netz findet (dazu gibt es eine Menge und auch neueren Datums!), gibt es einen Bug in PHP 5.1.1 (und höher ?) der statt der gesamten File Größe nur die ersten 8192 Bytes liest. Dies würde auch den Fehler erklären, warum dann 0 Bytes übrig sind, für die du eine Warnung bekommts.
Die WP Core Entwickler haben das auch für eine andere Klasse berücksichtigt und sogar kommentiert:
class FileReader {
.....
function read($bytes) {
if ($bytes) {
fseek($this->_fd, $this->_pos);
// PHP 5.1.1 does not read more than 8192 bytes in one fread()
// the discussions at PHP Bugs suggest it's the intended behaviour
while ($bytes > 0) {
$chunk = fread($this->_fd, $bytes);
$data .= $chunk;
$bytes -= strlen($chunk);
}
$this->_pos = ftell($this->_fd);
return $data;
} else return '';
}
....
Alles anzeigen
Ich werde mal die Datei patchen und das blockweise Lesen auch in den CachedFileReader einbauen, testen und bereitstellen.
Mal sehen, ob das des Pudels Kern ist.
[COLOR=Red] getesteter Patch [/COLOR]
Datei: /wp-includes/streams.php
Zeile: 148 ff.
WP Version: 2.5.1
// Preloads entire file in memory first, then creates a StringReader
// over it (it assumes knowledge of StringReader internals)
class CachedFileReader extends StringReader {
function CachedFileReader($filename) {
if (file_exists($filename)) {
$length=filesize($filename);
$fd = fopen($filename,'rb');
if (!$fd) {
$this->error = 3; // Cannot read file, probably permissions
return false;
}
// PHP 5.1.1 does not read more than 8192 bytes in one fread()
// the discussions at PHP Bugs suggest it's the intended behaviour
// ----- 2008-06-16 potential bug using *.mo Files -------------
// FIXED: adapted from method read out of FileReader class
while ($length > 0) {
$chunk = fread($fd, $length);
$this->_str .= $chunk;
$length -= strlen($chunk);
}
//dont try in any case full file! $this->_str = fread($fd, $length);
fclose($fd);
} else {
$this->error = 2; // File doesn't exist
return false;
}
}
}
Alles anzeigen
Im Normalfall liest dieser Patch weiterhin das File am Stück, aber in dem Moment, wo das 8192 Bytes Limit Problem erscheint, wird das jetzt blockweise trotzdem komplett gelesen.