nod32 скрипт для удаленного запуска обновления php + cron
Скрипт запускает на стороннем сервере «обновление антивирусных баз»
и уведомляет на почту только об ошибках и не удачных обновлениях.
Реагирует на прописанные Вами стоп слова, если найдено - отправит на почту все тело документа в виде массива.
Это достаточно удобно если на удаленном сервере отсутствует cron.
Короче...
Для запуска скрипта на удаленном сервере, достаточно запустить у себя кроном (cron) наш скрипт.
Cron:
0 12,18 * * * /usr/bin/php /home/%USERNAME%/www.DOMAIN.ru/cron/runNodUPD.php http://DOMAIN.RU/upd_prog/update.php
1 - адрес нашего скрипта.
2 - адрес удаленного сервера, который в дальнейшем будет парсить данные с этого сайта.
ниже скрипт который мы запускаем.
<?php
//ini_set('display_errors',1); error_reporting(E_ALL | E_STRICT);
$arrUri = $_SERVER['argv']; // консоль
//$arrUri[1] = 'http://DOMAIN.RU/upd_prog/update.php'; // для отладки без консоли
$stopWords = '/(Error|Can|Bad|Not|Denied|Fatal)/iu'; // реагировать на стоп слова в ответе от сервера nod32, для уведомление на емайл (preg_match)
$mail = 'myMail@domain.ru';
$mailSubject = 'сервер обновлений nod32';
function arrGetResource($uri,$timeOut,$body){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
curl_setopt($ch, CURLOPT_REFERER, 'https://www.google.com'); // если вдруг существует рефер то переназначим его чтоб скрыть откуда скрипт.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // возвращать результат работы
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // не проверять SSL сертификат
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // не проверять Host SSL сертификата
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // это необходимо, чтобы cURL не высылал заголовок на ожидание
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // переходит по редиректам
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // секунды попытки соединения
curl_setopt($ch, CURLOPT_TIMEOUT, $timeOut); // максимум выполнение скрипта
$HeaderResult = curl_exec($ch);
if($HeaderResult === false) {
$headers = array('error' => array('code'=>curl_errno($ch),'msg'=>curl_error($ch)));
} else {
$headers = array();
$arrRequests = explode("\r\n\r\n", $HeaderResult); // Split the string on every "double" new line.
for ($index = 0; $index < count($arrRequests) -1; $index++) { // Loop of response headers. The "count() -1" is to avoid an empty row for the extra line break before the body of the response.
foreach (explode("\r\n", $arrRequests[$index]) as $i => $line) {
if ($i === 0) {
$headers[$index]['http_code'] = $line;
} else {
list ($key, $value) = explode(': ', $line);
$headers[$index][$key] = $value;
}
}
}
if(isset($body)) {
$aHeaderInfo = curl_getinfo($ch);
$curlHeaderSize=$aHeaderInfo['header_size'];
$sBody = trim(mb_substr($HeaderResult, $curlHeaderSize));
$headers[]['content'] = "\n".htmlspecialchars($sBody)."\n";
}
}
curl_close($ch);
return $headers;
}
if (!filter_var($arrUri[1], FILTER_VALIDATE_URL)) {
exit('Invalid uri');
}
$hostUrl = parse_url($arrUri[1], PHP_URL_SCHEME) .'://'. parse_url($arrUri[1], PHP_URL_HOST); // адресс сервера
# проверяем доступность сервера
$arrHeader = arrGetResource(parse_url($arrUri[1],PHP_URL_HOST),10,0);
if(!(isset($arrHeader[0]['http_code']) and preg_match("/^HTTP\/([0-9\.]+) 200 ok$/i",$arrHeader[0]['http_code']))) {
mail($mail, $mailSubject, "Сервер: ". $hostUrl ." \n Сервер обновления не доступен; \n URI: ".$arrUri[1]." \n Event: ". __file__ .':'. __line__ ." \n\n\n" .var_export($arrHeader,true));
exit('error:'. __line__ );
}
# запускаем скрипт обновления
$arrHeader = arrGetResource($arrUri[1],55,1);
if(isset($arrHeader[0]['http_code']) and preg_match("/^HTTP\/([0-9\.]+) 200 ok$/i",$arrHeader[0]['http_code'])) {
if (preg_match($stopWords, $arrHeader[1]['content'], $matches) == 1) {
mail($mail, $mailSubject, "Сервер: ". $hostUrl ." \n Имеется сообщение об ошибках; \n Отреагированно на: ".$matches[0]."\n URI: ".$arrUri[1]." \n Event: ". __file__ .':'. __line__ ." \n\n\n" .var_export($arrHeader,true));
exit('error:'. __line__ );
} else {
mail($mail, $mailSubject, "Сервер: ". $hostUrl ." - обновлен \n\n" .var_export($arrHeader,true));
exit("OK! \n returned: \n\n". var_export($arrHeader,true));
}
} else {
# http ошибки 500, 403 и д.р.
mail($mail, $mailSubject, "Сервер: ". $hostUrl ." \n Скрипт запущен с последствием ошибки или по таймауту; \n URI: ".$arrUri[1]." \n Event: ". __file__ .':'. __line__ ." \n\n\n" .var_export($arrHeader,true));
exit('error:'. __line__ );
}
?>
Если скрипт рвет соединение раньше минуты то можно попробовать .htaccess файл с содержимым:
# .htaccess
php_value max_execution_time 120
php_value max_input_time 120