Einzelnen Beitrag anzeigen
Alt 09.09.2009, 20:50   #13
Nehoz
Gesperrt
Letzte Erfolge
 
Benutzerbild von Nehoz
 
Registriert seit: 12.10.2008
Beitr?ge: 27
Abgegebene Danke: 3
Erhielt 0 Danke für 0 Beiträge
Themenstarter Themenstarter
Downloads: 43
Uploads: 0
Nachrichten: 84
Renommee-Modifikator:
0 Nehoz befindet sich auf einem aufstrebenden Ast
Standard

Auch das habe ich versucht , bin mit den MB zahlen immer weiter nach oben gegangen,das problem ist das die Zahlen bei dem Fehler denn auch nach oben steigen....

Fatal error: Allowed memory size of 44040192 bytes exhausted (tried to allocate 35 bytes) in /var/www/html/BDecode.php on line 134

als beispiel nur mal eben am rande , es kann also nichts mit dem zugesicherten ram zu tun haben.

ich geb dir mal eben die Php, werde da derzeit nicht wirklich schlau draus...., hat aber irgendwas wenn ich es noch richtig im Kopf habe mit der DB zu tun. $ davor war ja db .....

PHP-Code:
<?php

/* $Id: BDecode.php 1076 2006-10-12 18:01:45Z b4rt $ */

/******************************************************************************/

/*

Programming info

All functions output a small array, which we'll call $return for now.

$return[0] is the data expected of the function
$return[1] is the offset over the whole bencoded data of the next
          piece of data.

numberdecode returns [0] as the integer read, and [1]-1 points to the
symbol that was interprented as the end of the interger (either "e" or
":").
numberdecode is used for integer decodes both for i11e and 11:hello there
so it is tolerant of the ending symbol.

decodelist returns $return[0] as an integer indexed array like you would use in C
for all the entries. $return[1]-1 is the "e" that ends the list, so [1] is the next
useful byte.

decodeDict returns $return[0] as an array of text-indexed entries. For example,
$return[0]["announce"] = "http://www.whatever.com:6969/announce";
$return[1]-1 again points to the "e" that ends the dictionary.

decodeEntry returns [0] as an integer in the case $offset points to
i12345e or a string if $offset points to 11:hello there style strings.
It also calls decodeDict or decodeList if it encounters a d or an l.


Known bugs:
- The program doesn't pay attention to the string it's working on.
 A zero-sized or truncated data block will cause string offset errors
 before they get rejected by the decoder. This is worked around by
 suppressing errors.

*/

// Protect our namespace using a class
class BDecode
{

    function 
numberdecode($wholefile$start)
    {
        
$ret[0] = 0;
        
$offset $start;

        
// Funky handling of negative numbers and zero
        
$negative false;
        if (
$wholefile[$offset] == '-')
        {
             
$negative true;
             
$offset++;
        }
        if (
$wholefile[$offset] == '0')
        {
            
$offset++;
            if (
$negative)
            {
                return array(
false);
            }
            if (
$wholefile[$offset] == ':' || $wholefile[$offset] == 'e')
            {
                
$offset++;
                
$ret[0] = 0;
                
$ret[1] = $offset;
                return 
$ret;
            }
            return array(
false);
        }
        while (
true)
        {
            if (
$wholefile[$offset] >= '0' && $wholefile[$offset] <= '9')
            {
                
$ret[0] *= 10;
            
//Added 2005.02.21 - VisiGod
            //Changing the type of variable from integer to double to prevent a numeric overflow
                
settype($ret[0],"double");
            
//Added 2005.02.21 - VisiGod
                
$ret[0] += ord($wholefile[$offset]) - ord("0");
                
$offset++;
            }
            
// Tolerate : or e because this is a multiuse function
            
else if ($wholefile[$offset] == 'e' || $wholefile[$offset] == ':')
            {
                
$ret[1] = $offset+1;
                if (
$negative)
                {
                    if (
$ret[0] == 0)
                    {
                        return array(
false);
                    }
                    
$ret[0] = - $ret[0];
                }
                return 
$ret;
            }
            else
            {
                return array(
false);
            }
        }
        return array(
false);
    }

    function 
decodeEntry($wholefile$offset=0)
    {
        if (
$wholefile[$offset] == 'd')
        {
            return 
$this->decodeDict($wholefile$offset);
        }
        if (
$wholefile[$offset] == 'l')
        {
            return 
$this->decodelist($wholefile$offset);
        }
        if (
$wholefile[$offset] == "i")
        {
            
$offset++;
            return 
$this->numberdecode($wholefile$offset);
        }
        
// String value: decode number, then grab substring
        
$info $this->numberdecode($wholefile$offset);

        if (
$info[0] === false)
        {
            return array(
false);
        }

        
$ret[0] = substr($wholefile$info[1], $info[0]);
        
$ret[1] = $info[1]+strlen($ret[0]);

        return 
$ret;
    }

    function 
decodeList($wholefile$start)
    {
        
$offset $start+1;
        
$i 0;
        if (
$wholefile[$start] != 'l')
        {
            return array(
false);
        }

        
$ret = array();

        while (
true)
        {
            if (
$wholefile[$offset] == 'e')
            {
                break;
            }

            
$value $this->decodeEntry($wholefile$offset);

            if (
$value[0] === false)
            {
                return array(
false);
            }

            
$ret[$i] = $value[0];
            
$offset $value[1];
            
$i ++;
        }

        
// The empy list is an empty array. Seems fine.
        
$final[0] = $ret;
        
$final[1] = $offset+1;

        return 
$final;
    }

// Tries to construct an array
    
function decodeDict($wholefile$start=0)
    {
        
$offset $start;

        if (
$wholefile[$offset] == 'l')
        {
            return 
$this->decodeList($wholefile$start);
        }
        if (
$wholefile[$offset] != 'd')
        {
            return 
false;
        }

        
$ret = array();
        
$offset++;

        while (
true)
        {
            if (
$wholefile[$offset] == 'e')
            {
                
$offset++;
                break;
            }
            
$left $this->decodeEntry($wholefile$offset);
            if (!
$left[0])
            {
                return 
false;
            }
            
$offset $left[1];
            if (
$wholefile[$offset] == 'd')
            {
                
// Recurse

                
$value $this->decodedict($wholefile$offset);

                if (!
$value[0])
                {
                    return 
false;
                }

                
$ret[addslashes($left[0])] = $value[0];
                
$offset$value[1];

                continue;
            }
            else if (
$wholefile[$offset] == 'l')
            {
                
$value $this->decodeList($wholefile$offset);

                if (!
$value[0] && is_bool($value[0]))
                {
                    return 
false;
                }

                
$ret[addslashes($left[0])] = $value[0];
                
$offset $value[1];
            }
            else
            {
                
$value $this->decodeEntry($wholefile$offset);

                if (
$value[0] === false)
                {
                    return 
false;
                }

                
$ret[addslashes($left[0])] = $value[0];
                
$offset $value[1];
            }
        }
        if (empty(
$ret))
        {
            
$final[0] = true;
        }
        else
        {
            
$final[0] = $ret;
        }

        
$final[1] = $offset;

        return 
$final;
    }

// End of class declaration.

// Use this function. eg:  BDecode("d8:announce44:http://www. ... e");
function BDecode($wholefile)
{
    
$decoder = new BDecode;
    
$return $decoder->decodeEntry($wholefile);

    return 
$return[0];
}

?>
Nehoz ist offline   Mit Zitat antworten Nach oben