Был такой скрипт который сверял файлы на моём сайте и на другом, он смотрел вроде бы на дату скаченного файла и на дату с другого сайта, если файлы были одинаковые (или дата скаченного файла больше чем дата файла с другого сайта) то скрипт ничего не качал, по заголовкам вроде определял. Если файлы были разными тогда качал. Работал он на баше (sh скрипте) раньше, сейчас хочу перевести на php.
Скрипт скачивал file.json.gz c другого сайта и распаковывал уже ко мне в папку с сайтом
#!/bin/bash
FNAME="file.json"
URL="http://remotesite.ru/fff.json"
GNAME="/home/user/bin/getjson/${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
function getJsonPooling($localFile,$arr,$num,$remoteFile){
$numReq = $num+1;
echo 'ПОПЫТКА ПОДКЛЮЧЕНИЯ: '.$numReq.'<br>';
echo 'Подключаемся к: '.$arr[$num].'<br>';
$getJson = new getJson();
$gg= $getJson->get($localFile, $arr[$num] ,$remoteFile);
if ( ($gg['returnurl']['errno']) ||
($gg['returnfile']['errno']) &&
($num <= count($arr)-2 ) ) {
$num++;
getJsonPooling($localFile,$arr,$num,$remoteFile);
}
var_dump($gg);
}
class getJson{
static public function get($localFile,$url,$remoteFile)
{
$url .=$remoteFile;
if (file_exists($localFile)) {
$timestamp = filemtime($localFile);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url); //conf
/*curl_setopt($ch, CURLOPT_PROXY, '51.255.138.248:3128'); //PROXY's*/
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); //Если файл не изменился получаем код 304
curl_exec( $ch );
$returnurl = curl_getinfo( $ch );
$returnurl['errno'] = curl_errno( $ch );
$returnurl['errmsg'] = curl_error( $ch );
if(
($returnurl['http_code'] == '200') &&
($returnurl['errno'] == '0')
){
echo '<br> Файл изменился, качаем!';
echo '<hr>';
$ch2 = curl_copy_handle($ch); //Копируем предыдущий дескриптор
curl_setopt($ch2, CURLOPT_HEADER, false); // читать заголовок
curl_setopt($ch2, CURLOPT_NOBODY, false); // читать ТОЛЬКО заголовок без тела
$outData = curl_exec( $ch2 );
$isJSON = (is_string($outData) &&
(is_object(json_decode($outData)) ||
is_array(json_decode($outData)))) ? true : false;
$returnfile = curl_getinfo( $ch2 );
$returnfile['errno'] = curl_errno( $ch2 );
$returnfile['errmsg'] = curl_error( $ch2 );
$returnfile['valid'] = $isJSON;
curl_close($ch2);
if ($returnfile['http_code'] != '200') {
echo 'Ошибка на сервере при получении файла: '.$returnfile['http_code'];
}
if ($returnfile['errno'] != '0'){
echo '<br> Ошибка при получении файла: '.$returnfile['errno'].'<br>';
echo '<br>'.$returnfile['errmsg'].'<br>';
}
if($isJSON) {
echo '<br>Полученный файл корректный, записываем! <br>';
file_put_contents($localFile, $outData);
$GLOBALS['data'] = $outData;
unset($outData);
} else {
echo '<br>Полученный файл НЕ корректный <br>';
die();
}
} else if ($returnurl['http_code'] == '304'){
echo '<br> Файл не изменился <br>';
} else if ($returnurl['errno'] != '0'){
echo '<br> Ошибка: '.$returnurl['errno'].'<br>';
echo '<br>'.$returnurl['errmsg'].'<br>';
}
curl_close($ch);
$return['returnurl'] = $returnurl;
$return['returnfile'] = $returnfile;
return $return;
}
}
?>
Запускаю так:
$localFile = './files/local.json';
$remoteFile = 'remotefile.json';
//Зеркала
$getJsonLinks = array(
'http://serv1.ru/',
'http://serv2.com/',
'http://serv3.org/'
);
//локальный файл, массив с ссылками на сайт, номер ссылки из масива (если не работает ссылка идём к следующей ссылке), файл который качаем по ссылке
getJsonPooling($localFile,$getJsonLinks,0,$remoteFile);
if($data){
$data = json_decode($data, true);
} else {
die('<br> $data не получена die(); <br>');
}
Вроде работает )
Что тут можно подправить для оптимизации/лаконичности, или это всё в пару строк пишется вообще ?