Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сохранение времени
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Сохранение времени

Страниц (2): [1] 2 »
 

1. vaam - 02 Сентября, 2011 - 08:24:00 - перейти к сообщению
Всем привет

Помогите накатать функцию времени, которая будет запоминаться при определённом условии. Т.е. например если сервер выключен, то время выключения запоминается и выдаётся отдельной строкой

Вот скрипт для монитора сервера игры
PHP:
скопировать код в буфер обмена
  1. echo "<BR> ";
  2.  
  3.         $img_online = "Themes/default/images/8_on.png";
  4. $img_offline = "Themes/default/images/8_off.png";
  5.  
  6. $alt_online = "Включен";
  7. $alt_offline = "Выключен";
  8.  
  9.  
  10.      $host = "здесь IP сервера";
  11.      $port = "80";
  12.      $timeout = 3;
  13.      
  14.      $connect=fsockopen($host, $port, &$errno, &$errstr, $timeout);
  15.      if($connect)
  16.           {
  17.            echo "<img src='$img_online' alt='$alt_online' title='$alt_online'>";
  18.           }  else
  19.               {
  20.                echo "<img src='$img_offline' alt='$alt_offline' title='$alt_offline'>";
  21.               }
  22.              
  23.      fclose ($connect);
  24.          
  25.          ?>
2. MrBeard - 02 Сентября, 2011 - 14:11:06 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo "<BR> ";
  2.  
  3. $img_online = "Themes/default/images/8_on.png";
  4. $img_offline = "Themes/default/images/8_off.png";
  5.  
  6. $alt_online = "Включен";
  7. $alt_offline = "Выключен";
  8.  
  9. $lastOffline = "./offline.txt";
  10. $date = "";
  11. $host = "здесь IP сервера";
  12. $port = "80";
  13. $timeout = 3;
  14.  
  15. $connect=fsockopen($host, $port, &$errno, &$errstr, $timeout);
  16. if($connect)
  17. {
  18.         if(file_exists($lastOffline))
  19.                 unlink($lastOffline);
  20.         echo "<img src='$img_online' alt='$alt_online' title='$alt_online'>";
  21. }  
  22. else
  23. {
  24.         if(file_exists($lastOffline))
  25.                 $date = file_get_contents($lastOffline);
  26.         else
  27.         {
  28.                 $date = date("r");
  29.                 file_put_contents($lastOffline, date("r"));
  30.         }
  31.         echo "<img src='$img_offline' alt='$alt_offline' title='$alt_offline'>";
  32.         echo "<div> $date <//div>";
  33. }
  34. fclose ($connect);
  35. ?>


но это не красиво(
стоило бы создать табличку в БД и хранить там все переходы
online -> offline
offline -> online
3. vaam - 04 Сентября, 2011 - 08:59:05 - перейти к сообщению
А как осуществить вывод сохранённого времени ( в этом коде) из текстового документа offline.txt на постоянной основе. Т.е. сейчас он показывает время, когда сервер офф и когда сервер вкл, то время пропадает. Хотелось бы чтобы он выводил запомненное время постоянно
4. MrBeard - 04 Сентября, 2011 - 18:19:59 - перейти к сообщению
vaam пишет:
А как осуществить вывод сохранённого времени ( в этом коде) из текстового документа offline.txt на постоянной основе. Т.е. сейчас он показывает время, когда сервер офф и когда сервер вкл, то время пропадает. Хотелось бы чтобы он выводил запомненное время постоянно

В бд сохраняй все переходы, это будет лучше всего.
5. vaam - 04 Сентября, 2011 - 19:49:24 - перейти к сообщению
MrBeard пишет:
vaam пишет:
А как осуществить вывод сохранённого времени ( в этом коде) из текстового документа offline.txt на постоянной основе. Т.е. сейчас он показывает время, когда сервер офф и когда сервер вкл, то время пропадает. Хотелось бы чтобы он выводил запомненное время постоянно

В бд сохраняй все переходы, это будет лучше всего.


Яс Бд совсем не дружу Огорчение
6. vaam - 07 Сентября, 2011 - 10:10:57 - перейти к сообщению
Поможет кто организовать это всё через бд?
7. MrBeard - 07 Сентября, 2011 - 16:38:03 - перейти к сообщению
vaam пишет:
Поможет кто организовать это всё через бд?

вечером напишу, наверно, или через бд, или через файл)
8. MrBeard - 08 Сентября, 2011 - 17:00:28 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo "<BR> ";
  2.  
  3. define("STATES_FILE","./server_state.txt");
  4. $date = "";
  5. $iServerState = 0;
  6. $iLastState = 0;
  7. $sLastOffline = "";
  8. $lines = getLastLines(STATES_FILE,2);
  9. $sLastOffline = getLastOffline($lines);
  10. $iLastState = getLastState($lines);
  11.  
  12. $img_online = "Themes/default/images/8_on.png";
  13. $img_offline = "Themes/default/images/8_off.png";
  14.  
  15. $alt_online = "Включен";
  16. $alt_offline = "Выключен";
  17.  
  18. $host = "здесь IP сервера";
  19. $port = "80";
  20. $timeout = 3;
  21.  
  22. $connect=fsockopen($host, $port, &$errno, &$errstr, $timeout);
  23. if($connect)
  24. {
  25.         if ($iLastState === 0)
  26.                 file_put_contents(STATES_FILE, "1 | " . date("r") . "\n", FILE_APPEND);
  27.         echo "<img src='$img_online' alt='$alt_online' title='$alt_online'>";
  28. }  
  29. else
  30. {
  31.         if ($iLastState === 1)
  32.         {
  33.                 file_put_contents(STATES_FILE, "0 | " . date("r") . "\n", FILE_APPEND);
  34.                 $sLastOffline = date("r");
  35.         }
  36.         echo "<img src='$img_offline' alt='$alt_offline' title='$alt_offline'>";
  37. }
  38. echo "<div> Last Offline - $sLastOffline <//div>";
  39. fclose ($connect);
  40.  
  41. function getLastState($lines)
  42. {
  43.         $s = explode("|", $lines[count($lines) - 1]);
  44.         $iLastState = 0 + $s[0];
  45.         return $iLastState;
  46. }
  47.  
  48. function getLastOffline($lines)
  49. {
  50.         $sLastOffline = "";
  51.         for($i = count($lines)-1; $i>=0; --$i)
  52.         {
  53.                 $s = explode("|", $lines[$i]);
  54.                 if (trim($s[0]) == false)
  55.                 {
  56.                         $sLastOffline = $s[1];
  57.                         break;
  58.                 }
  59.         }
  60.         return $sLastOffline;
  61. }
  62.  
  63. function getLastLines($file, $linesNumber=1)
  64. {
  65.         if (!file_exists($file))
  66.                 return "";
  67.         $handle = fopen(STATES_FILE, "r");
  68.         $position = -1;
  69.         $t = "";
  70.         $lines = Array();
  71.         while ($linesNumber > 0)
  72.         {
  73.                 do
  74.                 {
  75.                         --$position;
  76.                         if (fseek($handle, $position, SEEK_END) == -1)
  77.                         {
  78.                                 rewind($handle);
  79.                                 break;
  80.                         }
  81.                         $t = fgetc($handle);
  82.                 } while ($t != "\n");
  83.                 --$linesNumber;
  84.                 $lines[$linesNumber] = fgets($handle);
  85.         }
  86.         fclose($handle);
  87.         return  $lines;
  88. }
  89. ?>


мне почему то кажется, что за такой код бить надо=(((
9. vaam - 10 Сентября, 2011 - 14:27:07 - перейти к сообщению
Спасибо конечно
Но этот код не определяет БД и соответственно не создаёт там таблицы, в которых будет запоминать переходы
10. MrBeard - 10 Сентября, 2011 - 23:18:46 - перейти к сообщению
vaam пишет:
Спасибо конечно
Но этот код не определяет БД и соответственно не создаёт там таблицы, в которых будет запоминать переходы

а там нету бд, все данные хранятся в файле server_state.txt, который создастся в той же директории, что и скрипт
11. vaam - 12 Сентября, 2011 - 16:18:06 - перейти к сообщению
И ещё.. последнее
Как сделать одновременный показ для 9 серверов?
Я добавлял код ниже, страница не отображалась
название текстового документа, которое будет создаваться - менял, не помогает
12. MrBeard - 16 Сентября, 2011 - 15:16:54 - перейти к сообщению
vaam пишет:
И ещё.. последнее
Как сделать одновременный показ для 9 серверов?
Я добавлял код ниже, страница не отображалась
название текстового документа, которое будет создаваться - менял, не помогает


хохо) давно хотелось предложить - Zabbix
умеет мониторить веб не только по пингу=)

а этот скрипт, сейчас может чего наваяю...
13. MrBeard - 16 Сентября, 2011 - 19:57:49 - перейти к сообщению
в общем, налячкал слегка.
кстати, знающие, если что не так делаю - подскажите, сам php пока только пробую

по базе данных - скрипт создания БД -
CODE (SQL):
скопировать код в буфер обмена
  1. SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
  2. SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
  3. SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
  4.  
  5. CREATE SCHEMA IF NOT EXISTS `mon` DEFAULT CHARACTER SET utf8 ;
  6. GRANT ALL ON mon.* TO 'monitor'@'localhost' IDENTIFIED BY 'monmon';
  7. USE `mon` ;
  8.  
  9. -- -----------------------------------------------------
  10. -- Table `mon`.`server_t`
  11. -- -----------------------------------------------------
  12. CREATE  TABLE IF NOT EXISTS `mon`.`server_t` (
  13.   `server_id` INT NOT NULL AUTO_INCREMENT ,
  14.   `server_name` VARCHAR(45) NOT NULL ,
  15.   PRIMARY KEY (`server_id`) )
  16. ENGINE = InnoDB;
  17.  
  18.  
  19. -- -----------------------------------------------------
  20. -- Table `mon`.`url_t`
  21. -- -----------------------------------------------------
  22. CREATE  TABLE IF NOT EXISTS `mon`.`url_t` (
  23.   `url_id` INT NOT NULL AUTO_INCREMENT ,
  24.   `server_id` INT NOT NULL ,
  25.   `host` VARCHAR(150) NOT NULL,
  26.   `port` INT NOT NULL,
  27.   `timeout` INT NOT NULL,
  28.   PRIMARY KEY (`url_id`) ,
  29.   INDEX `fk_url_t_server_t` (`server_id` ASC) ,
  30.   CONSTRAINT `fk_url_t_server_t`
  31.     FOREIGN KEY (`server_id` )
  32.     REFERENCES `mon`.`server_t` (`server_id` )
  33.     ON DELETE NO ACTION
  34.     ON UPDATE NO ACTION)
  35. ENGINE = InnoDB;
  36.  
  37.  
  38. -- -----------------------------------------------------
  39. -- Table `mon`.`state_t`
  40. -- -----------------------------------------------------
  41. CREATE  TABLE IF NOT EXISTS `mon`.`state_t` (
  42.   `state_id` INT NOT NULL AUTO_INCREMENT ,
  43.   `state_name` VARCHAR(45) NOT NULL ,
  44.   PRIMARY KEY (`state_id`) )
  45. ENGINE = InnoDB;
  46.  
  47.  
  48. -- -----------------------------------------------------
  49. -- Table `mon`.`monitoring_t`
  50. -- -----------------------------------------------------
  51. CREATE  TABLE IF NOT EXISTS `mon`.`monitoring_t` (
  52.   `monitoring_id` INT NOT NULL AUTO_INCREMENT ,
  53.   `server_id` INT NOT NULL ,
  54.   `state_id` INT NOT NULL ,
  55.   `date` TIMESTAMP NOT NULL,
  56.   PRIMARY KEY (`monitoring_id`) ,
  57.   INDEX `fk_monitoring_1` (`server_id` ASC) ,
  58.   INDEX `fk_monitoring_2` (`state_id` ASC) ,
  59.   CONSTRAINT `fk_monitoring_1`
  60.     FOREIGN KEY (`server_id` )
  61.     REFERENCES `mon`.`server_t` (`server_id` )
  62.     ON DELETE NO ACTION
  63.     ON UPDATE NO ACTION,
  64.   CONSTRAINT `fk_monitoring_2`
  65.     FOREIGN KEY (`state_id` )
  66.     REFERENCES `mon`.`state_t` (`state_id` )
  67.     ON DELETE NO ACTION
  68.     ON UPDATE NO ACTION)
  69. ENGINE = InnoDB;
  70.  
  71.  
  72.  
  73. SET SQL_MODE=@OLD_SQL_MODE;
  74. SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
  75. SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


таблица с состояниями и тестовые данные(по их примеру можно наполнить любыми)
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO state_t VALUES
  2.         (1,"oK"),
  3.         (2,"have problems"),
  4.         (3,"offline");
  5. INSERT INTO server_t VALUES
  6.         (1,"google"),
  7.         (2,"yandex");
  8. INSERT INTO url_t VALUES
  9.         (DEFAULT, 1, "www.google.ru", 80, 5),
  10.         (DEFAULT, 2, "www.yandex.ru", 80, 5),
  11.         (DEFAULT, 2, "www.ya.ru", 80, 5);
  12.  
  13.  


сам скрипт вот

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. class Server
  4. {
  5.         var $id = -1;
  6.         var $name = "";
  7.         var $url = Array();
  8.         var $state = -1;
  9.         var $lastProblem = "";
  10. }
  11.  
  12. class Url
  13. {
  14.     var $host = "";
  15.     var $port = 80;
  16.     var $timeout = 1;
  17. }
  18.  
  19. define("DB_HOST", 'localhost');
  20. define("DB_USER", 'monitor');
  21. define("DB_PASSWORD", 'monmon');
  22. define("DB_MONITORING_TABLE", 'mon');
  23.  
  24. $states = Array();
  25. $servers = Array();
  26.  
  27. $db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die("DB connection error\n");
  28. mysql_select_db(DB_MONITORING_TABLE, $db) or die("Can`t change db");
  29. getStates($states);
  30. getServerList($servers,$states);
  31. echo "<table><thead><tr><th>Server Name</th><th>Status</th><th>Last Problem</th></tr></thead>";
  32. foreach ($servers as $server)
  33. {
  34.     $lastState = getLastState($server->id);
  35.     getNowState($server);
  36.     if ($server->state != $lastState)
  37.         addStateChanging($server);
  38.     addRow($server);
  39. }
  40. echo "</table>";
  41.  
  42. function getStates(&$states)
  43. {
  44.         $sql = "select state_id, state_name from state_t";
  45.         $result = mysql_query($sql);
  46.         while ($row = mysql_fetch_assoc($result))
  47.         {
  48.         $states[$row["state_id"]] = $row["state_name"];
  49.     }
  50. }
  51.  
  52. function getServerList(&$servers, &$states)
  53. {
  54.     $okState = array_search("oK", $states);
  55.     $sql = "select s.server_id,server_name, host, port, timeout, date
  56.               from server_t as s
  57.               join url_t as u using(server_id)
  58.               left join (select server_id, max(date) as date
  59.                            from monitoring_t as mon
  60.                             where state_id <>$okState
  61.                             group by server_id) as m on s.server_id = m.server_id";
  62.     $result = mysql_query($sql);
  63.     while ($row = mysql_fetch_assoc($result))
  64.     {
  65.         $id = $row["server_id"];
  66.         if(isset($servers[$id])){
  67.             $server = &$servers[$id];
  68.         }
  69.         else{
  70.             $server = new Server;
  71.             $server->id = $id;
  72.             $server->name = $row["server_name"];
  73.             $server->lastProblem = $row["date"];
  74.             $servers[$id] = $server;
  75.         }
  76.         $url = new Url;
  77.         $url->host = $row["host"];
  78.         $url->port = $row["port"];
  79.         $url->timeout = $row["timeout"];
  80.         $server->url[] = $url;
  81.     }
  82. }
  83.  
  84. function getLastState($id)
  85. {
  86.     $state = null;
  87.     $sql = "select state_id
  88.                    from monitoring_t
  89.                    where server_id = $id
  90.                    order by monitoring_id desc
  91.                    limit 1";
  92.     $result = mysql_query($sql);
  93.     if ($result){
  94.         $row = mysql_fetch_row($result);
  95.         $state = $row[0];
  96.     }
  97.     return $state;
  98. }
  99.  
  100. function getNowState(Server $server)
  101. {
  102.     $notResponseCount = 0;
  103.     foreach ($server->url as $url)
  104.     {
  105.         $connect = fsockopen($url->host, $url->port, &$errno, &$errstr, $url->timeout);
  106.         if (!$connect)
  107.             ++$notResponseCount;
  108.     }
  109.     if ($notResponseCount === 0)
  110.         $server->state = 1;
  111.     elseif($notResponseCount !== count($server->url))
  112.         $server->state = 2;
  113.     else
  114.         $server->state = 3;
  115. }
  116.  
  117. function addStateChanging(Server $server)
  118. {
  119.     $sql = "insert into monitoring_t value
  120.                    (default, $server->id, $server->state,now())";
  121.     mysql_query($sql);
  122. }
  123.  
  124. function addRow($server)
  125. {
  126.     global $states;
  127.     echo "<tr><td>" . $server->name . "</td>"
  128.         . "<td>" . $states[$server->state] . "</td>"
  129.         . "<td>" . $server->lastProblem . "</td></tr>";
  130. }
  131.  
  132. ?>


вроде проверил, проблем не было... если что непонятно будет - пишите)
14. vaam - 19 Сентября, 2011 - 06:26:08 - перейти к сообщению
Не совсем понял, как эта штука работает
Я скопировал три этих кода в файлы, закинул их на хост
при вызове php скрипта мне писалось

Can't change db

Я вручную создал БД, и теперь php скрипт отдаёт мне четыре столбика (сервер, статус..)
в бд он ничего не создаёт (

И ещё вот. По Zabbix. Штука интересная, но она как я понял для корпоративных сетей. есть ли нечто подобное, но чтобы работал с серверами в интернете. Я пытался найти, но выбивает лишь мониторинг для кс и т.д.
15. MrBeard - 19 Сентября, 2011 - 08:31:31 - перейти к сообщению
vaam пишет:
Не совсем понял, как эта штука работает
Я скопировал три этих кода в файлы, закинул их на хост
при вызове php скрипта мне писалось

Can't change db

Я вручную создал БД, и теперь php скрипт отдаёт мне четыре столбика (сервер, статус..)
в бд он ничего не создаёт (

И ещё вот. По Zabbix. Штука интересная, но она как я понял для корпоративных сетей. есть ли нечто подобное, но чтобы работал с серверами в интернете. Я пытался найти, но выбивает лишь мониторинг для кс и т.д.


первые два скрипта - это как раз СОЗДАНИЕ БД и добавление данных
то есть, подключаешься к БД через консольный клиент, и вставляешь первый скрипт полностью. он создаёт базу и таблицы, даёт права пользователю monitor
из второго скрипта обязательная часть -
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO state_t VALUES
  2.         (1,"oK"),
  3.         (2,"have problems"),
  4.         (3,"offline");

точно так же в консоли вставляешь и он заносит эти данные.

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO server_t VALUES
  2.         (1,"google"),
  3.         (2,"yandex");
  4. INSERT INTO url_t VALUES
  5.         (DEFAULT, 1, "www.google.ru", 80, 5),
  6.         (DEFAULT, 2, "www.yandex.ru", 80, 5),
  7.         (DEFAULT, 2, "www.ya.ru", 80, 5);

это пример добавления серверов, которые нужно мониторить. первый insert создаёт записи в таблице server_t, где хранятся сущности сервера, второй - записи в url_t
один и тот же сервер можно мониторить одновременно под одному или нескольким уникальным сочетаниям host + port + timeout

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

ему нужна машина с базой данных, где бы он работал, и всё, остальное он может делать через интернет)

 

Powered by ExBB FM 1.0 RC1