2009-05-10 42 views

Respuesta

14

De php's article:

<?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() es la clave aquí. Pero no estoy seguro de si puede obtener la última fecha de modificación de un archivo remoto, ya que el servidor debería enviársela ... ¿Quizás en los encabezados HTTP?

+2

Del manual: "A partir de PHP 5.0.0, esta función también se puede usar con * algunos * contenedores de URL." – nickf

+3

Para mi experiencia este método no funciona siempre (depende de tu php.ini) así que get_headers nativos funcionó mejor para mí. – Pons

+0

@Pons, estoy de acuerdo, no funciona conmigo –

36

Probablemente se podría hacer algo como esto utilizando 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 
} 
+1

Me he dado cuenta de que este código a veces no funciona, funciona nativo php get_headers mejor para mi. – Pons

0

sería algo así como este trabajo, desde web developer forum

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

// OR 

$last_modified = filemtime(__FILE__); 

el enlace proporciona algunos insite útil sobre los podrá utilizar

3

Puede activar la recepción de los encabezados de la respuesta con curl_setopt($handle, CURLOPT_HEADER, true). También puede activar CURLOPT_NOBODY para recibir solo los encabezados, y luego explotar el resultado por \ r \ n e interpretar los encabezados individuales. La cabecera Last-Modified es el que está interesado en

+0

Sí, solo solicite los encabezados –

+1

Suponiendo que envían el encabezado Last-Modified –

18

En PHP puede utilizar la función nativa 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 
} 
+5

"Si" la condición no funcionó correctamente ... 'if (! $ H || strpos ($ h [0], '200')! == falso) {'funciona mejor para mí! – dino

+0

dino es correcto. Parece que un operador '!' Se omitió en el código anterior por accidente. La instrucción if realmente debería ser 'if (! (! $ H || strstr ($ h [0], '200') === FALSE)) {' – Steven

+2

Puede que desee combinar y agregar el código en minúscula de Pons a este también. 'if (strtolower (trim ($ k)) == 'last-modified')' – Armstrongest

3

veces Header vienen con diferentes letras minúsculas superior, esto debería ayudar:

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; 
     } 
    } 
} 
1

por la respuesta de la edición h4kuna creé esto:

$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>'; 
0

Tuve que resolver un problema similar, pero para mí descargarlo una vez al día era suficiente, así que solo comparé el día de modificación del archivo de caché local (descargado). El archivo remoto no tenía encabezado Last-Modified.

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