2016-04-27 56 views
1

我有这样的代码,每天早上12点运行。它目前只能用于使用ftp_mdtm(修改时间)获取服务器中的最新文件。我面临的问题是,有时服务器将超过1个文件上传到服务器。我怎样才能下载当天的所有最新文件?我目前使用ftp_get如何在PHP中使用ftp_get下载超过1个文件

<?php 

$conn = ftp_connect('abc.com'); 
ftp_login($conn, 'lalala', '12345'); 

// get list of files on given path 
$files = ftp_nlist($conn, ''); 

$mostRecent = array(
    'time' => 0, 
    'file' => null 
); 

foreach ($files as $file) { 
    // get the last modified time for the file 
    $time = ftp_mdtm($conn, $file); 

    if ($time > $mostRecent['time']) { 
     // this file is the most recent so far 
     $mostRecent['time'] = $time; 
     $mostRecent['file'] = $file; 
    } 
} 

ftp_get($conn, "$file.zip", $mostRecent['file'], FTP_BINARY); 
ftp_close($conn); 

$file_open= $file . ".zip"; 
$path = "./zip/"; 

$zip = new ZipArchive; 
$res = $zip->open($file_open); 
if ($res === true) { 
    // extract it to the path we determined above 
    $zip->extractTo($path); 
    $zip->close(); 
    //echo "$file_open extracted to $path"; 
} else { 
    //echo "I couldn't open $file_open"; 
} 

$servername = "localhost";  //server IP or name 
$uname = "lalala";    //username 
$pword = "";     //password 
$dbname = "lalala";   //database name 

$db = new mysqli($servername, $uname, $pword, $dbname); 
// Check connection 
if ($db->connect_error) { 
    die("Connection failed: " . $db->connect_error); 
} 

//print_r (glob("test/*.txt")); 
//exit(); 

foreach (glob($path . "/*.TXT") as $file) { 
    $file_handle = fopen($file, "r"); 
    while (!feof($file_handle)) { 
     $line = fgets($file_handle); 
     $new_file = substr($file, 7); 
     //echo $line; 

     $query_check = "SELECT filename FROM fos_data WHERE filename = '$new_file'"; 
     $result=mysqli_query($db,$query_check); 
     $row = mysqli_fetch_assoc($result); 
     $exist = $row['filename'] . "<br>"; 
     $rowcount=mysqli_num_rows($result); 

     if ($rowcount > 0) { 
      $update = " UPDATE fos_data 
         SET  value  = '$line' 
         WHERE filename = '$new_file'"; 
      $result=mysqli_query($db,$update); 
      echo "Data " . $new_file . " Updated <br>"; 
     } 
     else{ 
      $insert = "INSERT INTO fos_data 
          (filename, 
           value) 
          VALUES 
          ('$new_file', 
           '$line')"; 
      $result=mysqli_query($db,$insert); 
      echo "Data " . $new_file . " Saved <br>"; 
     } 

     /**/ 
    } 
    fclose($file_handle); 

} 

mysqli_close($db); 

?> 

回答

0

嗯,我管理与@Dagon一些调整,以解决这里面下载代码

$contents = ftp_rawlist($conn, '.'); 
$results = array(); 
foreach ($contents as $line) { 
    list($perms, $links, $user, $group, $size, $d1, $d2, $d3, $name) = 
     preg_split('/\s+/', $line, 9); 
    $stamp = strtotime(implode(' ', array($d1, $d2, $d3))); 
    $datetime = date('d/m/Y', $stamp); 
    $results[] = array('name' => $name, 'timestamp' => $stamp, 'date' => $datetime); 
} 

usort($results, function($a, $b) { return $a['timestamp'] - $b['timestamp']; }); 
$today_date = date("d/m/Y"); 

$new_result = search($results, 'date', $today_date); 


function search($array, $key, $value){ 
$results = array(); 

if (is_array($array)) { 
    if (isset($array[$key]) && $array[$key] == $value) { 
     $results[] = $array; 
    } 

    foreach ($array as $subarray) { 
     $results = array_merge($results, search($subarray, $key, $value)); 
    } 
} 

return $results; 

}

然后循环阵列获得的那一天的多个数据使用ftp_get

为响应个
$array_count = 0; 
$temp_array = array(); 
foreach ($new_result as $new) { 
    //todo 
    $temp_array["name"] = $new_result["$array_count"]["name"]; 
    $temp_array["date"] = $new_result["$array_count"]["date"]; 
    echo "<br>"; 
    echo "File " . $temp_array["name"]; 
    echo "<br>"; 
    echo "Date " . $temp_array["date"]; 
    echo "<br>"; 

    // download the latest file using the filename from server 
    ftp_get($conn, "$array_count.zip", $temp_array["name"], FTP_BINARY); 
    //close connection 
    ftp_close($conn); 
    } 
0

您可以使用date function和比较,为$time

如果您创建一个数组,名字类似$todaysModifiedFiles,然后如果它已经自12修改,你可以推给它的$mostRecent对象: 00AM,当你通过比较现在的时间来检查它的修改时间。

然后遍历脚本中以下每个进程的数组。

+0

谢谢,我来试试,第一 –

0
$list = ftp_rawlist($conn, '.');//rawlist gets the dates, nlist does not 

$results = array(); 
foreach ($list as $line) {//loop the files 
    list($perms, $links, $user, $group, $size, $d1, $d2, $d3, $name) = 
     preg_split('/\s+/', $line, 9);//rip apart the returned data to get to the date 
    $stamp = strtotime(implode(' ', array($d1, $d2, $d3))); 
if($stamp < time() + 86400) {//beware of leap secounds 
    $results[] = $name); 
} 

} 

$results将所有的文件小于24小时老,循环,下载,或只是添加如果()子句

+0

感谢响应我来试试,第一 –

+0

我已经尝试的结果给我所有的文件,而不是当天的文件 –

+0

又是什么调试告诉你吗? – 2016-04-28 03:22:13