2016-06-06 2 views
2

У меня есть сценарий aa, который может загружать содержимое файла CSV и загружать ссылки в локальный каталог, файл CSV, который мне нужно загрузить, составляет около 4056 строк и 4056 FTP-файлов, сценарий отлично работает, но веб-сервер не работает, когда я его использую.Большой сценарий загрузки скриптов CSV

даже попытался установить_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> 

ответ

0

Необходимо увеличить время выполнения вашего скрипта, используя max_execution_time. Вы можете использовать этот пример, поместить его поверх скрипта:

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

Надеюсь, это вам поможет!

+0

Позвольте мне уйти –

+0

Дайте мне знать, если это сработало @GlennZealous – Jer

+0

Все еще получаю 500 ошибок, начиная думать, что я нахожусь, чтобы изменить это и установить его как задание cron, если я не могу найти способ его зацикливания. Я получил ubuntu на виртуальной машине и получил это, но это все еще двойная обработка и, похоже, тоже очень медленная. –

0

В моей практике я часто использую пошаговую загрузку, если я не могу загрузить данные через 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 

Но я уверен, что использование хрон является лучшим решением для вашей проблемы.

Смежные вопросы