Jacek Kowalski
2019-06-22 a255d6af5519895fa22d592dcff06944111abba3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php
function ftp_fetch_if_newer($url, $file = NULL) {
    $url = parse_url($url);
    if(!isset($url['scheme']) || $url['scheme'] != 'ftp') {
        throw new Exception('Only FTP URLs are supported');
    }
    if(!isset($url['host'])) {
        throw new Exception('Hostname not present in the URL');
    }
    if(!isset($url['path'])) {
        throw new Exception('Path component not present in the URL');
    }
    if(!isset($url['port'])) {
        $url['port'] = 21;
    }
    if(!isset($url['user'])) {
        $url['user'] = 'anonymous';
    }
    if(!isset($url['pass'])) {
        $url['pass'] = 'anonymous@mpk.jacekk.net';
    }
    if($file == NULL) {
        $file = basename($url['path']);
    }
    
    $localTime = -1;
    $localSize = -1;
    if(is_file($file)) {
        $localTime = filemtime($file);
        $localSize = filesize($file);
    }
    
    $ftp = ftp_connect($url['host'], $url['port'], 10);
    if($ftp === FALSE) {
        throw new Exception('FTP connection failed');
    }
    if(!ftp_login($ftp, $url['user'], $url['pass'])) {
        throw new Exception('FTP login failed');
    }
    if(!ftp_pasv($ftp, TRUE)) {
        throw new Exception('Passive FTP request failed');
    }
    $remoteSize = ftp_size($ftp, $url['path']);
    if($remoteSize < 0) {
        throw new Exception('FTP file size fetch failed');
    }
    $remoteTime = ftp_mdtm($ftp, $url['path']);
    if($remoteTime < 0) {
        throw new Exception('FTP modification time fetch failed');
    }
    
    $updated = FALSE;
    
    if($localTime < $remoteTime || ($localTime == $remoteTime && $localSize != $remoteSize)) {
        if(file_exists($file.'.tmp')) {
            unlink($file.'.tmp');
        }
        if(ftp_get($ftp, $file.'.tmp', $url['path'], FTP_BINARY)) {
            touch($file.'.tmp', $remoteTime);
            if(!rename($file.'.tmp', $file)) {
                throw new Exception('Temporary file rename failed');
            }
            $updated = TRUE;
        }
    }
    
    ftp_close($ftp);
    
    return $updated;
}
 
function fetch($url, $file = NULL) {
    if($file == NULL) {
        $file = basename($url['url']);
    }
    $data = file_get_contents($url);
    if($data === FALSE) {
        throw new Exception('URL fetch failed');
    }
    if(file_put_contents($file.'.tmp', $data) === FALSE) {
        throw new Exception('Temporary file creation failed');
    }
    if(!rename($file.'.tmp', $file)) {
        throw new Exception('Temporary file rename failed');
    }
}