LINUX.ORG.RU
решено ФорумAdmin

Найти ошибку в php скрипте

 , ,


1

1

Люди добрые, помогите найти ошибку в php скрипте. Конец дня, моск уже распух :(

#!/usr/local/bin/php
<?php
$rks_url = 'http://reestr.rublacklist.net/api/current'; //URL файла блокировок
$out_ips = '/usr/local/etc/squid/ks_ips.acl'; //файл, куда мы запишем все IP, упомянутые в списке
$out_urls = '/usr/local/etc/squid/rks_urls.acl'; //Файл, куда пишутся URL-ы
$strGen = '# Generated by an0maly on ' . date('l jS \of F Y h:i:s A'); //Строка с датой создания
 
$strTmp = file_get_contents ( $rks_url );
 
// Если начало полученных данных не соответствует ожидаемому - мы что-то не то получили
if ( substr ( $strTmp, 0, 9 ) != '"Updated:') {
    echo "Получены неверные входные данные" . PHP_EOL;
    die();
}
 
$arrTmp = explode ( ';', $strTmp ); //Разбиваем список на куски, разделитель - ";"
 
foreach ( $arrTmp as $strKey ) {
    // Удаляем всё до символа перевода строки
    $intTmp = strpos ( $strKey, '\n' );
    if ( $intTmp  !== false ) {
        $strKey = substr ( $strKey, $intTmp+2);
    }
    // Удалили
    // Раскодируем
    $tmp = preg_replace_callback( '/\\\\u([0-9a-fA-F]{4})/', function ( $match ) { return mb_convert_encoding( pack( 'H*', $match[1] ), 'UTF-8', 'UCS-2BE' ); }, $strKey );
    // И продолжаем обработку строки только если в ней есть полезная информация (строка не перекодирвалась - русских букв нет)
    if ( $strKey == $tmp ) {
            // Если в строке нет точки - это не IP и не URL, не обрабатываем
            if ( strpos ( $strKey, '.' ) !== false ) {
                //Если в строке есть | - это перечисление, разбираем
                if ( strpos ( $strKey, '|' ) ) {
                    $arrTmp1 = explode ( '|', $strKey );
                    foreach ( $arrTmp1 as $strKey1 ) {
                        // Удалим пробелы в начале и конце строки
                        $strKey1 = trim ( $strKey1 );
                        // и проверим, не чистый ли IP у нас
                        $bVld = filter_var ( $strKey1, FILTER_VALIDATE_IP );
                        // если IP - в массив айпишниками его, иначе обработаем как URL
                        if ( $bVld != false ) {
                            $arrIPs[] = $strKey1;
                        } else {
                            // если в строке нет указания протокола - это название блокировки (меня интересует только http и https)
                            if ( strpos ( $strKey1, 'http' ) !== false ) {
                                $strWL = modUrl ( $strKey1 ); //Обработаем URL
                                $arrURLs[] = $strWL;
                            }
                        }
                    }
                } else {
                    // аналогичный кусок прокомментирован выше
                    $strKey = trim ( $strKey );
                    $bVld = filter_var ( $strKey, FILTER_VALIDATE_IP );
                    if ( $bVld != false ) {
                        $arrIPs[] = $strKey;
                    } else {
                        if ( strpos ( $strKey, 'http' ) !== false ) {
                            $strWL = modUrl ( $strKey);
                            $arrURLs[] = $strWL;
                        }
                    }
                }
            }
    }
}
 
 
sort ( $arrIPs ); // Отсортируем массив
$arrIPsSort = array_unique ( $arrIPs, SORT_STRING ); // И удалим дубли
array_unshift ( $arrIPsSort, $strGen ); // Добавим в начало строку с временем создания
$strOut = implode ( PHP_EOL, $arrIPsSort ); // Сделаем из массива строку
file_put_contents ( $out_ips, $strOut ); // И запишем её в файл
 
sort ( $arrURLs );
$arrURLsSort = array_unique ( $arrURLs, SORT_STRING ); // Всё тоже самое сделаем со списком URL
array_unshift ( $arrURLsSort, $strGen );
$strOut = implode ( PHP_EOL, $arrURLsSort );
file_put_contents ( $out_urls, $strOut );
 
function modUrl ( $strBuff ) {
// В этой функции обработаем URL
 
    // Если в URL встречаются квадратные скобки - squid считает это регулярным выражением и матерится
    // Соответственно, обрежем URL до первого включения квадратной скобки.
    $intTmp = strpos ($strBuff , '[');
    if ( $intTmp === false ) {
        $intTmp = strpos ( $strBuff , ']' );
    }
    if ( $intTmp !== false ) {
        $strBuff = substr ( $strBuff, 0, $intTmp );
    }
    // Уберём слеши в конце строки
    if ( substr ( $strBuff, strlen ($strBuff)-1, 1) == '/') {
        $strBuff = substr ( $strBuff, 0, strlen ( $strBuff )-1);
    }
    // Один и тот же ресурс может быть заблокирован как по http, так и по https - лишние строки
    $intTmp = strpos ( $strBuff, '//' );
    if ( $intTmp !== false ) {
        $strBuff = substr ($strBuff, $intTmp + 2);
    }
    // Вернём результат.
    return $strBuff;
}
?>

пишет что в 53й строке неопределённая функция:

$bVld = filter_var ( $strKey, FILTER_VALIDATE_IP );
Call to undefined function filter_var()

Call to undefined function filter_var

Дык не установлено расширение, вот и всё.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

заработался... в голову не пришло что, на этом сервере тупо не установлен PHP. Старею... Спасибо, люди добрые :)

DesCod ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.