Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8

    Problema script - Download si interrompe!

    Salve a tutti, come vedete sono un nuovo utente e sono contento di entrare a far parte di una community come questa. Mi sto avvicinando da poco al mondo del PHP, e diciamo che lo conosco pochissimo. In ogni caso avrei un piccolo grande problema con uno script che non sono riuscito a risolvere, quindi chiedo aiuto a voi geni

    In sostanza lo script serve a limitare la velocità di banda e impostare un intervallo di tempo tra un download e l'altro tramite riconoscimento dell'IP. Lo script funziona bene, il vero problema sta nei settaggi dell'hosting. Difatti, per quanto abbia potuto constatare, sull'hosting è settata la funzione di timeout che si attiva durante il download interrompendolo poichè pare che lo script rimanga in funzione fino a download terminato. Pertanto sono qui per chiedervi se esiste un metodo per raggirare tale problema. Di seguito vi posto il codice:

    Codice PHP:
    <?php

    set_time_limit
    (0);
    // change this value below
    $cs_conn mysql_connect('host''user''pass');
    mysql_select_db('database'$cs_conn);

    mysql_query("CREATE TABLE IF NOT EXISTS `downloaded` (
      `filepath` varchar(255) NOT NULL,
      `ipadres` varchar(15) NOT NULL,
      `last_access` datetime NOT NULL,
      UNIQUE KEY `filepath` (`filepath`,`ipadres`),
      KEY `ipadres` (`ipadres`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;"
    );

    $path '/nomefile.exe';
    $local_file 'nomefile.exe';
    $download_file 'nomefiledasalvare.exe';
    $download_rate 100.0// velocità massima di download
    $ip addslashes($_SERVER['REMOTE_ADDR']);
    $dl false;


    $sql sprintf("SELECT UNIX_TIMESTAMP(last_access) last_time FROM downloaded WHERE filepath = '%s' AND ipadres = '%s' ORDER BY last_access DESC"$path$ip);
    $res mysql_query($sql);
    if (
    mysql_num_rows($res) > 0) {
        
    $last_xs mysql_result($res0'last_time')+3600;
        if (
    $last_xs time()) {
            
    mysql_query(sprintf("REPLACE downloaded SET filepath = '%s', ipadres = '%s', last_access = NOW()"$path$ip));
            
    $dl true;
        } 
    } else {
        
    $sql sprintf("REPLACE downloaded SET filepath = '%s', ipadres = '%s', last_access = NOW()"$path$ip);
        
    mysql_query($sql);
        
    $dl true;
    }

    if (
    $dl) {

        
    header('Cache-control: private');
        
    header('Content-Type: application/octet-stream');
        
    header('Content-Length: '.filesize($local_file));
        
    header('Content-Disposition: filename='.$download_file);
     
        
    // flush content
        
    flush();
     
        
    // open file stream
        
    $file fopen($local_file"r");
     
        while (!
    feof($file)) {
     
            
    // send the current file part to the browser
            
    print fread($fileround($download_rate 1024));
     
            
    // flush the content to the browser
            
    flush();
     
            
    // sleep one second
            
    sleep(1);
        }
     
        
    // close file stream
        
    fclose($file);
    }
    else {
        echo(
    '<meta http-equiv="refresh" content="4;url=http://www.miosito.it">');
        die(
    'Hai già scaricato questo file negli ultimi 60 minuti... Riprova più tardi!');
    }

    ?>
    Se ho ben capito il download parte quando si arriva su
    codice:
    print fread($file, round($download_rate * 1024));
    e lo script termina quando il download è terminato, solo che Apache lo interrompe prima con il maledetto timeout.

    Conoscete un modo per far sì che magari lo script, durante il download, dia dei "segnali" per azzerare il timeout?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8
    Up.. Nessuno riesce a darmi una soluzione?

  3. #3
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Puoi provare con http://php.net/manual/en/function.set-time-limit.php, ma non è detto che funzioni... leggi la documentazione che ti ho linkato.
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8
    Grazie per la risposta, ma se vedi bene il codice noterai che ho settato il set_time_limit all'inizio, ma comunque non dipende da quello. Tuttavia oggi ho riprovato ad effettuare il download, e mi sà proprio che non è nemmeno il max_execution_time a rompere. Infatti quest'ultimo è settato a 120 secondi sul mio hosting (e non è possibile modificarlo), ma il download è avanzato per oltre 4 minuti cronometrati, quindi a questo punto non so proprio cosa pensare..

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8
    Grazie per la risposta, ma se vedi bene il codice noterai che ho settato il set_time_limit all'inizio, ma comunque non dipende da quello. Tuttavia oggi ho riprovato ad effettuare il download, e mi sà proprio che non è nemmeno il max_execution_time a rompere. Infatti quest'ultimo è settato a 120 secondi sul mio hosting (e non è possibile modificarlo), ma il download è avanzato per oltre 4 minuti cronometrati, quindi a questo punto non so proprio cosa pensare..

  6. #6
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Che figuraccia... vabbè, avrai capito che non avevo letto il tuo codice () convinto che quella era l'unica soluzione, ma che poteva non funzionare visto che stai su un hosting e qui php viene compilato in modalità safe mode... quindi il timeout è uno dei valori sui quali non puoi agire... e se il problema è proprio quello credo non ci sia soluzione... non puoi azzerare il computo del tempo di esecuzione di php.
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8
    Figurati, non preoccuparti

    Comunque, come ho detto, credo che non dipenda nemmeno dal timeout, ma a questo punto non capisco da cosa possa dipendere. Comunque l'hosting è un OVH e tutte le configurazioni del PHP sono qui.. Riuscite ad identificare qualche parametro che blocca lo script?

  8. #8
    Utente di HTML.it L'avatar di Secta
    Registrato dal
    May 2002
    Messaggi
    365
    Considera che ai 120 secondi di timeout devi aggiungere il tempo in cui "mandi a nanna php" con sleep(1) dentro al ciclo while... se il file è di grandi dimensioni potresti teoricamente raggiungere i 4 minuti. Ma a te restituisce qualche errore a video? Considera anche che apache probabilmente avrà settato un proprio timeout... forse è quello che eccedi, poiché solitamente php ti avverte quando superi il suo massimo tempo di esecuzione... a meno che tu non abbia silenziato gli errori.
    "Dai diamanti non nasce niente, dal letame nascon fiori."
    Fabrizio De Andrè

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    8
    Mmm no, non ho silenziato gli errori, e nei LOG non indica nessuna chiusura improvvisa dello script. Il file è di grandi dimensioni (circa 660mb) ma la cosa che tra l'altro non mi spiego è che il browser mi segna il download come completato, non come interrotto. Solo che poi il file non ha le dimensioni esatte.. Mah

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.