Как переделать bash скрипт с curl'om в php?

192
07 мая 2018, 22:45

Был такой скрипт который сверял файлы на моём сайте и на другом, он смотрел вроде бы на дату скаченного файла и на дату с другого сайта, если файлы были одинаковые то скрипт ничего не качал, по заголовкам вроде определял. Если файлы были разными тогда качал. Работал он на баше (sh скрипте) раньше, сейчас хочу перевести на php.

Вот собственно он:

Скрипт скачивал file.json.gz другого сайта и распаковывал (или копировал) уже ко мне в папку с сайтом 
 
#!/bin/bash 
FNAME="file.json" 
URL="http://site2.ru/fff.json" 
GNAME="/home/user/bin/getdata/${FNAME}.gz" 
curl --fail -R -z "${GNAME}" -o "${GNAME}" -H "Accept-Encoding: gzip" "${URL}" && \ 
 gunzip -c "${GNAME}" > /home/user/mysite.ru/files/"${FNAME}"

А вот чуток не доработанный мой скрипт на PHP

<?php 
 
class getJson{ 
  static public function get($localFile,$urls,$remoteFile) 
{ 
 
$urls .=$remoteFile; 
 
if (file_exists($localFile)) { 
$timestamp = filemtime($localFile); 
} 
 
 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$urls); //conf 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //вывод строчкой 
curl_setopt($ch, CURLOPT_HEADER, true); // читать заголовок 
curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); // таймаут соединения 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // таймаут ответа 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, TRUE); //без кеша 
curl_setopt($ch, CURLOPT_FILETIME, TRUE); //получить timestamp файла 
curl_setopt($ch, CURLOPT_ENCODING, "gzip"); //установка кодировки 
 
curl_setopt($ch, CURLOPT_TIMEVALUE, $timestamp); //время изменения файла на моём сервере 
curl_setopt($ch, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE);  
 
  $content = curl_exec( $ch ); 
  $err     = curl_errno( $ch ); 
  $errmsg  = curl_error( $ch ); 
  $header  = curl_getinfo( $ch ); 
  curl_close( $ch ); 
  $header['errno']   = $err; 
  $header['errmsg']  = $errmsg; 
  $header['content'] = $content; 
  return $header; 
  //ответ на подобии такого 
  //array(25) { ["url"]=> string(42) "http://serv1.ru/files/11.json" ["content_type"]=> string(9) "text/html" ["http_code"]=> int(200) ["header_size"]=> int(185) ["request_size"]=> int(147) ["filetime"]=> int(1523617841) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0.188) ["namelookup_time"]=> float(0) ["connect_time"]=> float(0.094) ["pretransfer_time"]=> float(0.094) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(-1) ["upload_content_length"]=> float(0) ["starttransfer_time"]=> float(0.188) ["redirect_time"]=> float(0) ["certinfo"]=> array(0) { } ["redirect_url"]=> string(0) "" ["errno"]=> int(0) ["errmsg"]=> string(0) "" ["content"]=> string(185) "HTTP/1.1 200 Forbidden Referrer-Policy: same-origin Last-Modified: Mon, 07 May 2018 11:33:05 GMT Content-type: text/html Date: Mon, 07 May 2018 03:46:11 GMT Server: TrashServer 
   
} 
 
} 
 
?>

$getJsonLinks = array( 
  'http://serv1.ru/files', 
  'http://serv2.com/loadings/', 
  'http://serv3.jp/oth/' 
); 
 
 
getJsonPooling('localfile.json',$getJsonLinks,0,'remotefile.json'); 
 
function getJsonPooling($localFile,$arr,$num,$remoteFile){ 
$getJson = new getJson(); 
$gg = $getJson->get($localFile, $arr[$num] ,$remoteFile); 
if ( ($gg['errno']) && ($num <= count($arr)-2 ) ) { 
$num++; 
echo $num; 
getJsonPooling($localFile,$arr,$num,$remoteFile); 
} 
var_dump($gg); 
}

Answer 1

Лучше определяйте по md5 hash, если он разный то файл 100% изменялся на сервере.

Вот набросал пример, под себя думаю подгоните.

    // Локальный файл
    $filename_local = file_get_contents('http://site.com/test.txt');
    $md5file_local = md5_file($filename_local);
    // Файл на сервере
    $filename_dev = file_get_contents('http://site.com/dev/test.txt');
    $md5file_dev = md5_file($filename_dev);
    // Сверяем md5 hash и если он отличается, значит файл изменен, закачиваем его
    if ($md5file_local != $md5file_dev) {
        file_put_contents('test.txt', $md5file_dev);
    }
READ ALSO
Как правильно парсить контент AJAX-ом

Как правильно парсить контент AJAX-ом

Я совсем новичок в парсинге контента с сайтах прошу не кидать помидоры

184
PHP не принимает данные с формы

PHP не принимает данные с формы

есть страница с выводом всей таблицы из БД, в каждой ячейке кнопка для редактирования строки таблицыПо клику на кнопку назначаю обработчик...

199
ajax код для django

ajax код для django

Написал чат на django все работает отлично но с перезагрузкой отправил сообщение перезагрузка и для получение перезагружает страницу чтобы...

184
onclick по разным объектам [требует правки]

onclick по разным объектам [требует правки]

Как с помощью Js или jQuery сделать возможность взаимодействия с двумя разными объектами

211