Jump to content
  • 0

PHP мини-скрипты


D.S.Denton
 Share

Question

начнем-с скрипт-копилку для новичков делать? кому не лень, присоединяйтесь. комментарии в коде желательны.

во-первых скрипты тут будут малость сырые - чтоб место для фантазии оставалось.

во-вторых маленькие, каждый для одной задачи.

в-третьих без использования БД, либо две версии, т.к. надо разбираться со всем постепенно.

банальный скрипт, позволяющий в потенциале многое, но в первую очередь разобраться в базовых средствах PHP.

лучше всех счетчиков из учебников - потому что картинка нам нафиг не нужна, как раз чаще счетчик с картинкой ставят для получения информации о посетителях. в крайнем случае если надо будет и к этому нетрудно прикрутить графический вывод.

задача: собираем инфу по посетителям: запрошенные страницы и строка параметров, адрес, клиент, был ли пользователь раньше

используем: работу с глобальным массивом $_SERVER, чтение файла в массив, перезапись файла, установку куки, генерацию уникального идентификатора, кодирование и декодирование base64

<?php
// минимальный конфиг
$logfile = $_SERVER['DOCUMENT_ROOT'].'/userlogger.csv'; // задаем имя файла для лога.
$cookname = 'REQUEST_ID'; // имя куки
$cooktime = 7; // дни жизни куки


// сохраняем в переменных нужные нам вещи
$request_time = date(Y.'.'.M.'.'.d.' '.G.':'.i.':'.s); // текущее время на сервере
$request_UA = $_SERVER['HTTP_USER_AGENT']; // юзер-агент клиента
$request_IP = $_SERVER['REMOTE_ADDR']; // айпишник
$request_string = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // строка запроса полностью
if (!$request_cookie = $_COOKIE[$cookname]) {$request_cookie = '';} // кука если есть
$request_id = uniqid(); // уникальный айди запроса
$cookset = base64_encode($request_id); // в куку будем писать кодированный айди


// читаем в массив что есть в логе и дописываем еще строку с инфой по текущему запросу
$temp = file($logfile); // очень удобная функция, чтоб не использовать fopen+filesize+fclose (но удобна лишь для случая когда требуется полностью считать файл, не дополняя его)
// порядок полей в лог-файле
$log_write[] = $request_id; // айди запроса
$log_write[] = $request_time; // время запроса
$log_write[] = $request_string; // запрос
$log_write[] = $request_IP; // адрес
$log_write[] = $request_UA; // юзер-агент
$log_write[] = base64_decode($request_cookie); // декодированное значение куки = айди предыдущего запроса этого посетителя
$log_write = implode('^',$log_write); // объединяем все в строку с разделителем ^
$temp[] = $log_write; // добавляем эу строку последней в массив лога

// ставим куку с айди текущего запроса
@setcookie($cookname,$cookset,time() + $cooktime * 24 * 60 *60);

// сохраняем лог
$log = fopen($logfile,'w'); // открыли файл, стерев его
foreach($temp as $tmp) {fwrite($log,trim($tmp)."n");} // каждый элемент массива записали в строку
fclose($log); // закрыли лог
?>

пример использования:

обзываем этот файл logger.inc.php и кладем куда-нибудь. в файлах, обращение к которым требуется отслеживать, пишем <?php include_once(путь_к_этому_файлу); ?>

создаем пустой лог-файл (по умолчанию это userlogger.csv в корне сайта), ставим ему права 0777 (-rwxrwxrwx)

для просмотра можно качать этот файл к себе и открывать экселем... можно блокнотом... а можно написать небольшой просмотрщик (который выложу, если будет не лень).

возможное расширение функциональности:

+ вместо файла сохранять данные в БД

+ отсылка отчета на мейл

+ фильтр, защищающий от слишком быстрого разрастания лога

+ картинка-счетчик на основании лога

—————————————--

в его результатах очень интересно наблюдать подобные строки:

47947b4bd737b^2008.Jan.21 14:00:27^denton.msk.ru/CSShelp/?list=http%3A%2F%2Flnx.sarapica.net%2Fart%2Fufo%2Fuco%2F^69.61.61.146^Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)^
47947b4ca274b^2008.Jan.21 14:00:28^denton.msk.ru/CSShelp/?list=http%3A%2F%2Fwww.sfolly.net%2Fchat%2Fdata%2Fprivate%2Fchat%2Fasaz%2Fodofe%2F^69.61.61.146^Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)^
47947b51987cc^2008.Jan.21 14:00:33^denton.msk.ru/files/?showallfiles=http%3A%2F%2Fwww.ce-cioceoforum.com%2Ftalk%2Ft1%2Froda%2Filubov%2F^69.61.61.146^Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)^
47947b5487c46^2008.Jan.21 14:00:36^denton.msk.ru/files/?showallfiles=http%3A%2F%2Fsinzinuri.com%2Fimsi%2Fdb%2Fpic%2Fbezefi%2Fugoye%2F^69.61.61.146^Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)^

и потом блочить таких мегакрякеров по ипе, выдавая им что-нибудь вкусное типа "добро пожаловать в админ-панель". или просто нецензурно посылать, зависит от воображения

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0
$temp = file($logfile); // очень удобная функция, чтоб не использовать fopen+filesize+fclose

Далее вс? равно используется fopen, так что особого смысла использовать данную конструкцию нет(ИМХО). И если файл лога большой, то на создание массива уйд?т много памяти, что не хорошо.

Link to comment
Share on other sites

  • 0
$temp = file($logfile); // очень удобная функция, чтоб не использовать fopen+filesize+fclose

Прочитать файл в массив, чтобы добавить что-то в конец - жестоко! Зря разработчики php ввели эту функцию =

Link to comment
Share on other sites

  • 0

стоп-стоп... раскритиковали, ух блин, покусаю всех недовольных:)

внимательнее надо быть...

во-первых скрипты тут будут малость сырые - чтоб место для фантазии оставалось.

что полезного будет изучающему - тупо скопировать код (пусть даже с комментариями) и не трогать, раз он работает отлично, или же искать пути улучшения?

Прочитать файл в массив, чтобы добавить что-то в конец - жестоко!

хм... а какой вариант предлагаешь? так в одном скрипте охватывается на практическом примере использование дополнительно еще одной функции

Link to comment
Share on other sites

  • 0

Предлагаю заменить

// сохраняем лог
$log = fopen($logfile,'w'); // открыли файл, стерев его
foreach($temp as $tmp) {fwrite($log,trim($tmp)."n");} // каждый элемент массива записали в строку
fclose($log); // закрыли лог

на

// сохраняем лог
$log = fopen($logfile,'a+');
fwrite($log,implode('^',$log_write)."n");
fclose($log);

И убрать весь ненужный код выше.

Link to comment
Share on other sites

  • 0
что полезного будет изучающему - тупо скопировать код (пусть даже с комментариями) и не трогать, раз он работает отлично, или же искать пути улучшения?

Обычно, когда нович?к думает что вс? работает, то зачем что-то менять, вдруг он поменяет и скрипт перестанет работать...

Link to comment
Share on other sites

  • 0
что полезного будет изучающему - тупо скопировать код (пусть даже с комментариями) и не трогать, раз он работает отлично, или же искать пути улучшения?

Обычно, когда нович?к думает что вс? работает, то зачем что-то менять, вдруг он поменяет и скрипт перестанет работать...

Это скрипт был написан для того чтобы нович?к в н?м разобрался, а не пользовался как есть. :D

Но сама строка неудачна. А так-же реклама е? в комментарии. :)

Link to comment
Share on other sites

  • 0
Обычно, когда нович?к думает что вс? работает, то зачем что-то менять, вдруг он поменяет и скрипт перестанет работать...

это плохой новичок, такого не жалко.

бэкапы кто--то отменял? перед изменением файла берем его правым кликом - "винрар" - "добавить в архив name.rar". первый есть. левый клик на архиве, приписали в конец цифру 0. работаем с файлом. в процессе делаем бэкапы, увеличивая счетчик. готово! чуть что можно вернуться на любой шаг.

аналогично можно просто зажав кнопку контрол потянут немного файл, он скопируется в эту же папку с именем "Copy of name.ext".

так что если новичок не додумывается до элементарных действий (бэкап он же и просто пользователю необходим) и при том уже долез до программирования, это - повторюсь - плохой новичок. ИМХО.

скажу по себе - только начав изучать хтмл, ни о каких языкаж программирования речи не шло, любой полученный хтмл код переписывал в блокноте два раза. неважно работает или нет. если работает - тем лучше из структуры будет понятно каким образом работает. если нет - глядишь и разберусь что не так, уж минимум хуже не сделаю. первый раз переписывал в форму

<html>
<head>
<title>,,,</title>
...
</head>
<body>
<a href="...">
<b>
text
</b>
</a>
...
</body>
</html>

для идеальной лесенки. понимая что это не самое удобное для восприятия когда каждый тэг на новой строке, потом уже приводил к более компактному варианту.

позднее аналогично паскаль, делфи, php, perl.

и между прочим, живу в таком поселке что и сейчас инет здесь проблема. а во время когда изучал хтмл, выход в сеть имел только полчаса в две недели из МФТИ куда ездил собстно ради этого. ничего как видишь, понял и не помер от того что была только одна книжка Гончарова + желание понять, без доступа к форумам где можно спросить. соседей/друзей/родственников/старших у кого можно спросить тоже не имелось, да и сейчас не имеется. с паскалем совершенно также, только книжка была потолще (Немнюгин самоучитель + практикум)

Link to comment
Share on other sites

  • 0

Парсер фида. Вещь простая, но многие не могут понять как ее сделать.

<?php
header("Content-type:text/html;charset:utf-8"); //определяем кодировку страницы.
function getValue( $node, $name ) //функция для получения текста с поля
{
$nl = $node->getElementsByTagName( $name );
$co = mb_detect_encoding($nl->item(0)->nodeValue, 'auto');
return iconv($co, "windows-1251", $nl->item(0)->nodeValue);
}
ob_start( ); //начинаем беферизацию
$ch = curl_init( ); //начинаем парсить
curl_setopt($ch, CURLOPT_URL, 'http://ppiskun.com/feed'); //определяем адрес фида
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt( $ch, CURLOPT_USERAGENT, "Internet Explorer" ); //подделываем браузер
curl_exec($ch); //выводим готовенький фид в буфер
curl_close($ch); //закрываем сеанс
$rsstext = ob_get_clean( ); //получаем фид из буфера
$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadXML($rsstext); //подгружаем xml
$il = $doc->getElementsByTagName( "item" ); //список записей
for( $i = 0; $i < $il->length; $i++ )
{
$item = $il->item( $i );
$title = getValue( $item, "title" );
$link = getValue( $item, "link" );
$desc = getValue( $item, "description" );
$html[$i] = "<h4><a href=\"$link\">$title</a></h4>";
$html[$i] .= "<p>$desc</p>";
}
foreach($html as $w){
echo $w; //выводим записи поштучно
}
?>

Edited by -=PSU=-
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy