web-dev-qa-db-fra.com

Obtenir la dernière date de modification d'un fichier distant

Je voudrais obtenir la date de dernière modification d'un fichier distant au moyen de curl. Est-ce que quelqu'un sait comment faire ça? 

32
Mark Henry

De article de php :

<?php
// outputs e.g.  somefile.txt was last modified: December 29 2002 22:16:23.

$filename = 'somefile.txt';
if (file_exists($filename)) {
    echo "$filename was last modified: " . date ("F d Y H:i:s.", filemtime($filename));
}
?>

filemtime () est la clé ici. Mais je ne suis pas sûr si vous pouvez obtenir la dernière date de modification d'un éloigné fichier, puisque le serveur doit vous l’envoyer ... Peut-être dans les en-têtes HTTP?

13

Vous pourriez probablement faire quelque chose comme ceci en utilisant curl_getinfo() :

<?php
$curl = curl_init('http://www.example.com/filename.txt');

//don't fetch the actual page, you only want headers
curl_setopt($curl, CURLOPT_NOBODY, true);

//stop it from outputting stuff to stdout
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

// attempt to retrieve the modification date
curl_setopt($curl, CURLOPT_FILETIME, true);

$result = curl_exec($curl);

if ($result === false) {
    die (curl_error($curl)); 
}

$timestamp = curl_getinfo($curl, CURLINFO_FILETIME);
if ($timestamp != -1) { //otherwise unknown
    echo date("Y-m-d H:i:s", $timestamp); //etc
} 
39
Tom Haigh

Dans PHP, vous pouvez utiliser la fonction native get_headers():

<?php
$h = get_headers($url, 1);

$dt = NULL;
if (!($h || strstr($h[0], '200') === FALSE)) {
    $dt = new \DateTime($h['Last-Modified']);//php 5.3
}
22
h4kuna

Parfois, les en-têtes viennent avec des majuscules différentes, cela devrait aider:

function remoteFileData($f) {
    $h = get_headers($f, 1);
    if (stristr($h[0], '200')) {
        foreach($h as $k=>$v) {
            if(strtolower(trim($k))=="last-modified") return $v;
        }
    }
}
4
Pons

Vous pouvez activer la réception des en-têtes de la réponse avec curl_setopt($handle, CURLOPT_HEADER, true). Vous pouvez également activer CURLOPT_NOBODY pour ne recevoir que les en-têtes, puis exploser le résultat de\r\n et interpréter les en-têtes simples. L'en-tête Last-Modified est celui qui vous intéresse.

3
Patrick Glandien

En modifiant la réponse de h4kuna, j'ai créé ceci:

$fileURL='http://www.yahoo.com';
$headers = get_headers($fileURL, 1);
$date = "Error";
//echo "<pre>"; print_r($headers); echo "</pre>";
if ( $headers && (strpos($headers[0],'200') !== FALSE) ) {
    $time=strtotime($headers['Last-Modified']);
    $date=date("d-m-Y H:i:s", $time);
}
echo 'file: <a href="'.$fileURL.'" target="_blank">'.$fileURL.'</a> (Last-Modified: '.$date.')<br>';
1
trante

J'ai dû résoudre un problème similaire, mais pour moi, le téléchargement une fois par jour suffisait, alors je n'ai comparé que le jour de modification du fichier de cache local (téléchargé). Le fichier distant n'a pas d'en-tête Last-Modified.

$xml = 'test.xml';
if (is_file($xml) || date('d', filemtime($xml)) != date('d')) {
    $xml = file_get_contents(REMOTE_URL);
}
0
michalzuber

serait quelque chose comme ce travail, de forum de développeur Web

<? $last_modified = filemtime("content.php"); print("Last Updated - ");
print(date("m/d/y", $last_modified)); ?

// OR

$last_modified = filemtime(__FILE__); 

le lien fournit quelques conseils utiles sur vous pouvez les utiliser

0
dassouki