簡體   English   中英

大型CSV下載腳本超時

[英]Large CSV download script timing out

我有一個腳本,可以上載CSV文件的內容並將鏈接下載到本地目錄,我需要上載到它的CSV文件長約4056行,下載了4056 FTP,該腳本工作正常,但網絡服務器運行時間當我使用它。

甚至嘗試過set_time_limit(0);

有沒有一種方法可以讓我會話腳本並循環該過程,以便它可以在不中斷的情況下完成幾個小時的工作。

<?php  
/**
* Please change your upload directory according to your needs. Make sure you include the trailing slash!
*
* Windows    C:\tmp\
* Linux      /tmp/
*/
$uploaddir = '/tmp/';

if(isset($_FILES['userfile']['name'])){

    // Read uploaded file
    $lines  = file($_FILES['userfile']['tmp_name']);
    echo "Reading file ... <br/>";
    $linecount = 0;
    foreach($lines  as $line ){
        echo ++$linecount . ". FTP Url is : " .$line . "<br/>";
        echo "   Downloading " . $line . "<br/>";
        $parsed_url_values = parse_url($line);
        //TODO perhaps do a validation of the ftp url??

        if($parsed_url_values['scheme'] == 'ftp'){
                // set up basic connection
                $conn_id = ftp_connect($parsed_url_values['host']);

                // login with username and password
                $login_result = ftp_login($conn_id, $parsed_url_values['user'], $parsed_url_values['pass']);
                ftp_pasv($conn_id, true);
                $path = rtrim($parsed_url_values['path'], '_');
                $filename = basename($path);

                if (ftp_get($conn_id, $uploaddir . $filename, $path , FTP_BINARY)) {
                        echo "   Successfully downloaded the file " .$line . "<br/>";
                } else {
                        echo "   Could not save the file to " . $line . ". Please verify the url is correct and the file exists.<br/>";
                }
        } else {
                echo "   Sorry. This script was made for FTP downloads only.";
        }
    }
}
?>
<form enctype="multipart/form-data" action="" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
  Select the file to upload : <input name="userfile" type="file" />
  <input type="submit" value="Upload" />
</form>

您需要使用max_execution_time來增加腳本的執行時間。 您可以使用此示例,將其放在腳本頂部:

<?php
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
.. The rest of your script

希望這個能對您有所幫助!

在我的實踐中,如果我無法通過cron或php cli加載數據,則經常使用逐步加載。

那樣的東西(未經測試):

<?php
$newFileName = '/path/to/file.csv';
$line = isset($_REQUEST['csvline']) ? (int) $_REQUEST['csvline'] : 0;
$handle = fopen($newFileName, "r");

//10 seconds for each step
$stepTime = 10;
$startTime = time();
$lineCounter = 0;
while (($fileop = fgetcsv($handle)) !== false)
{
    //already loaded lines
    $lineCounter++;
    if ($lineCounter <= $line) continue;
    //here goes your script logic
    //stops when time goes out
    if (time() - $startTime >= $stepTime) break;
}
//next you need to query this script again 
//using js maybe (window.location or ajax call)
//so you can see loading progress or any other useful information
//like
if (!feof($handle)) {
    echo "<script>window.location = '/your.php?csvline={$lineCounter}'<script>";
}
//you even can start loading from last line before script fails

但是我敢肯定,使用cron是解決您問題的最佳解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM