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:
PHP-Code:
// 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;
}
}
}
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:
PHP-Code:
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 '';
}
....
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.
getesteter Patch
Datei: /wp-includes/streams.php
Zeile: 148
ff.
WP Version: 2.5.1
PHP-Code:
// 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;
}
}
}
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.