Avatar billede jps2mt Nybegynder
11. september 2005 - 20:08 Der er 6 kommentarer og
1 løsning

Download script er begyndt at fejle

Nogen der kan sige mig hvorfor flg. script misser ca. 15 - 20 kb af filer man downloader såfremt filen er over ca. 8-9 mb i størrelse??

Det skal siges at den HAR virket før, men pga. et disknedbrud hos min webhost er sitet blevet flyttet til en anden server og siden det er sket er det begyndt af fejle...

Jeg kan dog ikke lige se noget i PHPInfo (http://www.tog-sim.dk/phpinfo.php) der skulle have nogen indflydelse på det...

Har desværre ikke en PHPInfo fra den gamle server så jeg kan ikke engang sammenligne hvad der er forskelligt...

<?php
if (!defined("LOADED_AS_MODULE")) {
    die ("You can't access this file directly...");
}

    global $ModName, $pntable, $prefix;
    set_time_limit( 0 );

    include_once("modules/$ModName/common.php");

    $_n = mktime(date("H"),date("i"),date("s"),date("m"),(date("d")-7),date("Y"));
    $dir = "/var/www/tog-sim.dk/public_html/modules/$ModName/tmp/";
    $dh = opendir($dir);
    while (($file = readdir($dh)) !== false) {
    if (is_file($dir.$file)) {
      $arrFile = explode(".",$file);
      if ($arrFile[(COUNT($arrFile)-1)] > $_n) {
      unlink($dir.$file);
      }
    }
    }
    closedir($dh);
    $_n = mktime((date("H")-5),date("i"),date("s"),date("m"),date("d"),date("Y"));
    mysql_query("DELETE FROM $prefix"._TSDL_DLBin." WHERE (tstamp > '$_n')");

    if (getUserStat() == 0) {
    define( 'DL_LIMIT_BANDWIDTH', 5120 ); // In Bytes - 0 = No limit!
    } else if (getUserStat() == 2) {
    define( 'DL_LIMIT_BANDWIDTH', 1024 ); // In Bytes - 0 = No limit!
    } else {
    define( 'DL_LIMIT_BANDWIDTH', 0 ); // In Bytes - 0 = No limit!
    }

    if (!defined('DL_DOWNLOAD_ROOT')) {
    define( 'DL_DOWNLOAD_ROOT', '/var/www/tog-sim.dk/public_html/xxxx' ); // Set this to where you store your files!

    $sql = mysql_query("SELECT pn_url,pn_type FROM $prefix"._TSDL_downloads." WHERE (pn_did = '$id')") or die(mysql_error());
    $row = mysql_fetch_array($sql) or die(mysql_error());

    $path = $row[pn_url];
    $type = $row[pn_type];

    if ( strlen( $path ) == 0 )
    {
        die('No download');
    }

    $file = DL_DOWNLOAD_ROOT . "/" . $path;
    mysql_query("UPDATE $prefix"._TSDL_downloads." SET pn_hits=pn_hits+1 WHERE (pn_did = '$id')") or die(mysql_error());
    $userfile = false;
    } else {
    $file = DL_DOWNLOAD_ROOT;
    $type = "application/zip";
    $userfile = true;
    }

    header( "Pragma: " );
    header( "Cache-Control: " );
    header( "Expires: 0" );

    if ( !file_exists( $file ) )
    {
        // The file does not exist
        die( 'File not found ('.$file.') (ID: '.$id.')' );
        exit;
    }

    $offset = false;
    $endset = false;

    if ( $_SERVER['HTTP_RANGE'] )
    {
        // User wants to resume download
        if ( preg_match( '/^bytes=([0-9]*?)-$/', $_SERVER['HTTP_RANGE'], $regs ) )
        {
            $offset = $regs[1];
        }
        else if ( preg_match( '/^bytes=([0-9]*?)-([0-9]*?)$/', $_SERVER['HTTP_RANGE'], $regs ) )
        {
            $offset = $regs[1];
            $endset = $regs[2];
        }
    }

    $length = filesize( $file );

    $fp = fopen( $file, 'rb' );

    if ( $offset )
    {
        if ( $offset > $length )
        {
            // User requested to resume beyond file size!
            header( 'HTTP/1.0 500 Internal Server Error' );
            exit;
        }
        // Resume download from somewhere
        fseek( $fp, $offset );
        $length -= $offset;
        if ( $endset )
        {
            $length = $endset-$offset;
        }
    }

    $filename = basename( $file );

    if (!$debug) {
    header( "Content-Length: $length" );
    header( "Content-Type: $type" );
    header( "X-Powered-By: TSDL Download System" );
    header( "Content-disposition: attachment; filename=$filename" );
    header( "Content-Transfer-Encoding: binary" );
    header( "Accept-Ranges: bytes" );

    if ( !$endset )
    {
        $endset = $length;
    }

    $cur = 0;
    $start = time();
    $len = ( ( $length - $cur ) > 1024 ? 1024 : ( $length - $cur ) );
    while ( $cnt = fread( $fp, $len ) )
    {
        $cur += $len;
        $len = ( ( $length - $cur ) > 1024 ? 1024 : ( $length - $cur ) );
        echo $cnt;
        $secs = time() - $start;
        $bsec = ( ( $cur / $secs ) / 1 );
        if ( DL_LIMIT_BANDWIDTH != 0 && $bsec > DL_LIMIT_BANDWIDTH )
        {
            sleep( 1 );
        }
        if ( connection_aborted() )
        {
            // User cancelled the download...
            if ($userfile) {
              fclose($fp);
              unlink(DL_DOWNLOAD_ROOT);
            }
            exit;
        }
    }

    fclose( $fp );
?>
Avatar billede jps2mt Nybegynder
11. september 2005 - 20:10 #1
if (!$debug) { skal lige fjernes ;)

Havde lige glemt det i farten ;)

Scriptet er altså:

<?php
if (!defined("LOADED_AS_MODULE")) {
    die ("You can't access this file directly...");
}

    global $ModName, $pntable, $prefix;
    set_time_limit( 0 );

    include_once("modules/$ModName/common.php");

    $_n = mktime(date("H"),date("i"),date("s"),date("m"),(date("d")-7),date("Y"));
    $dir = "/var/www/tog-sim.dk/public_html/modules/$ModName/tmp/";
    $dh = opendir($dir);
    while (($file = readdir($dh)) !== false) {
    if (is_file($dir.$file)) {
      $arrFile = explode(".",$file);
      if ($arrFile[(COUNT($arrFile)-1)] > $_n) {
      unlink($dir.$file);
      }
    }
    }
    closedir($dh);
    $_n = mktime((date("H")-5),date("i"),date("s"),date("m"),date("d"),date("Y"));
    mysql_query("DELETE FROM $prefix"._TSDL_DLBin." WHERE (tstamp > '$_n')");

    if (getUserStat() == 0) {
    define( 'DL_LIMIT_BANDWIDTH', 5120 ); // In Bytes - 0 = No limit!
    } else if (getUserStat() == 2) {
    define( 'DL_LIMIT_BANDWIDTH', 1024 ); // In Bytes - 0 = No limit!
    } else {
    define( 'DL_LIMIT_BANDWIDTH', 0 ); // In Bytes - 0 = No limit!
    }

    if (!defined('DL_DOWNLOAD_ROOT')) {
    define( 'DL_DOWNLOAD_ROOT', '/var/www/tog-sim.dk/public_html/xxxx' ); // Set this to where you store your files!

    $sql = mysql_query("SELECT pn_url,pn_type FROM $prefix"._TSDL_downloads." WHERE (pn_did = '$id')") or die(mysql_error());
    $row = mysql_fetch_array($sql) or die(mysql_error());

    $path = $row[pn_url];
    $type = $row[pn_type];

    if ( strlen( $path ) == 0 )
    {
        die('No download');
    }

    $file = DL_DOWNLOAD_ROOT . "/" . $path;
    mysql_query("UPDATE $prefix"._TSDL_downloads." SET pn_hits=pn_hits+1 WHERE (pn_did = '$id')") or die(mysql_error());
    $userfile = false;
    } else {
    $file = DL_DOWNLOAD_ROOT;
    $type = "application/zip";
    $userfile = true;
    }

    header( "Pragma: " );
    header( "Cache-Control: " );
    header( "Expires: 0" );

    if ( !file_exists( $file ) )
    {
        // The file does not exist
        die( 'File not found ('.$file.') (ID: '.$id.')' );
        exit;
    }

    $offset = false;
    $endset = false;

    if ( $_SERVER['HTTP_RANGE'] )
    {
        // User wants to resume download
        if ( preg_match( '/^bytes=([0-9]*?)-$/', $_SERVER['HTTP_RANGE'], $regs ) )
        {
            $offset = $regs[1];
        }
        else if ( preg_match( '/^bytes=([0-9]*?)-([0-9]*?)$/', $_SERVER['HTTP_RANGE'], $regs ) )
        {
            $offset = $regs[1];
            $endset = $regs[2];
        }
    }

    $length = filesize( $file );

    $fp = fopen( $file, 'rb' );

    if ( $offset )
    {
        if ( $offset > $length )
        {
            // User requested to resume beyond file size!
            header( 'HTTP/1.0 500 Internal Server Error' );
            exit;
        }
        // Resume download from somewhere
        fseek( $fp, $offset );
        $length -= $offset;
        if ( $endset )
        {
            $length = $endset-$offset;
        }
    }

    $filename = basename( $file );

    header( "Content-Length: $length" );
    header( "Content-Type: $type" );
    header( "X-Powered-By: TSDL Download System" );
    header( "Content-disposition: attachment; filename=$filename" );
    header( "Content-Transfer-Encoding: binary" );
    header( "Accept-Ranges: bytes" );

    if ( !$endset )
    {
        $endset = $length;
    }

    $cur = 0;
    $start = time();
    $len = ( ( $length - $cur ) > 1024 ? 1024 : ( $length - $cur ) );
    while ( $cnt = fread( $fp, $len ) )
    {
        $cur += $len;
        $len = ( ( $length - $cur ) > 1024 ? 1024 : ( $length - $cur ) );
        echo $cnt;
        $secs = time() - $start;
        $bsec = ( ( $cur / $secs ) / 1 );
        if ( DL_LIMIT_BANDWIDTH != 0 && $bsec > DL_LIMIT_BANDWIDTH )
        {
            sleep( 1 );
        }
        if ( connection_aborted() )
        {
            // User cancelled the download...
            if ($userfile) {
              fclose($fp);
              unlink(DL_DOWNLOAD_ROOT);
            }
            exit;
        }
    }

    fclose( $fp );
?>
Avatar billede polle007 Nybegynder
11. september 2005 - 20:54 #2
Måske scriptet tager for lang tid at afvikle?
max_execution_time bestemmer dette
Avatar billede jps2mt Nybegynder
11. september 2005 - 21:45 #3
Nope...Selvom jeg sætter den op til 300 er det stadig det samme...

Men set_time_limit( 0 ); burde vel også give scriptet frie tøjler, eller er jeg galt på den her??

Nevertheless så er det stadig samme resultat...

Har endda testet lidt vidre...

Filer på over 3 MB fejler genrelt, under 3 MB kommer NOGLE filer fint igennem mens andre fejler...
Avatar billede gertnissen Nybegynder
12. september 2005 - 17:41 #4
Kan man lave en set_time_limit( 0 ); hvis du kører med safe mode=on ?
Avatar billede jps2mt Nybegynder
12. september 2005 - 17:46 #5
Det virker da sådan...Den kommer i hvert fald med timeout hvis jeg fjerner den linie, men ikke med den...

Og så er fejlen forresten lokaliseret...Det var noget zLib Output Compression der var aktiveret på den ny server...Det blev slået fra og så virkede alt som før :)
Avatar billede olebole Juniormester
12. september 2005 - 17:47 #6
<ole>

Det tal, du skriver i set_time_limit, er max_execution_time fra det øjeblik, du foretager kaldet - så du skal nok prøve med et større tal  ;o)

/mvh
</bole>
Avatar billede olebole Juniormester
12. september 2005 - 17:50 #7
Sorry ... checkede lige manualen for at være sikker:
  "If seconds is set to zero, no time limit is imposed."

Så, jo ... set_time_limit( 0 ); burde give scriptet frie tøjler (selvom fejlen så viste sig at være en anden)  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester