Einzelnen Beitrag anzeigen
Alt 16.06.2008, 02:45   #17 (permalink)
codestyling
WPD-Team
 
Benutzerbild von codestyling
 
Registriert seit: 30.03.2008
Ort: Leipzig
Beiträge: 1.133
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.
__________________
It's not a bug, it's always a feature. | Code Styling

Geändert von codestyling (16.06.2008 um 03:08 Uhr).
codestyling ist offline   Mit Zitat antworten