P
P
Paltos2018-05-08 21:48:25
PHP
Paltos, 2018-05-08 21:48:25

Am I correct in converting the bash script to PHP?

There was such a script that checked the files on my site and on another, it seemed to look at the date of the downloaded file and the date from another site, if the files were the same (or the date of the downloaded file is greater than the date of the file from another site), then the script did not download anything , according to the headings like determined. If the files were different then downloaded. It worked on a bash (sh script) before, now I want to translate it into php.
The script downloaded file.json.gz from another site and unpacked it to my folder with the site

#!/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}"

Here is the modified PHP script:
<?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;
  }
}
?>

I run it like this:
$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>');
}

It seems to work)
What can be corrected here for optimization / conciseness, or is it all written in a couple of lines at all?

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question