Słuchaj kolego lub koleżanko postanowiłem zmierzyć się z twoim problemem bazując na twoim rozwiązaniu, czyli styl proceduralny. Nie wiem czy przyda się ale chciałem dla siebie spróbować rozwiązać taki problem za bardzo nie zagłębiając się w tematykę socketów.
Na początku baza danych. Nie wiem jaką masz, ja bazowałem na takiej
-- utworzenie bazy danych
CREATE DATABASE database1;
-- wybranie bazy danych z ktora chcemy pracowac
USE database1;
-- utworzenie tabeli
CREATE TABLE addresses (
idt INT NOT NULL AUTO_INCREMENT,
name VARCHAR(15) NOT NULL,
working BOOLEAN DEFAULT false,
attempt_count INT DEFAULT 0,
connection_lost_time TIME,
PRIMARY KEY (idt)
);
-- wprowadzenie przykladowych danych
INSERT INTO addresses (name) VALUES
('127.0.0.1'),
('192.168.21.1');
Gdybyś potrzebował polecenia do zmiany istniejącej tabeli:
-- lub zmodyfikowanie istniejacej tabeli
ALTER TABLE addresses
ADD COLUMN (attempt_count INT NOT NULL DEFAULT 0)
ADD COLUMN (connection_lost_time TIME);
Twój skrypt w stylu proceduralnym. Gdybym pisał to na nowo, napewno zrobiłbym wszystko inaczej. W praktyce to co napisałem do tej pory nadaje się do poprawek. Dlaczego więc wysyłam? Dlatego, że nie mam teraz czasu na dalszą zabawę, a chciałem zaserwować podpowiedź. Daj znać co o tym sądzisz.
<?php
// 1. polaczenie z baza danych
$dbhost = '127.0.0.1';
$dbuser = 'root';
$dbpassword = '';
$dbname = 'database1';
$db_connection = mysqli_connect($dbhost, $dbuser, $dbpassword, $dbname);
if (!$db_connection) {
die('<p style="color:red;">database connection error</p>');
}
// 1.1 dodatkowe zmienne pomocnicze
$port = 8888;
$attempt_default = 0; // domyslna wartosc, ktora nalezy wpisac, gdy host odpowiada
// 2. pobranie danych z tabeli
$result = mysqli_query($db_connection, "SELECT * FROM addresses");
// 3. wyswietlenie tabelki HTML
echo '<table style="border: 1px solid black;">';
echo '<tr><td>idt</td><td>name</td><td>working</td><td>attempt_count</td><td>time</td></tr>';
// 3.1 tworzenie wierszy w tabeli
while ($row = mysqli_fetch_array($result)) {
$idt = $row[0];
$name = $row[1];
$working = $row[2];
$attempt_count = $row[3];
$time = $row[4];
$workingString = $working ? 'OK' : 'BAD';
$timeString = is_null($time) ? '-' : $time;
$attempt_counter = $attempt_count; // licznik, ktora zlicza liczbe nieudanych prob polaczenia
// 3.2 otwarcie polaczenia socket
$socket_connection = fsockopen('udp://' . $name, $port, $errno, $errstr, 10);
// 3.3 sprawdzenie czy nawiazano polaczenie socket
// na podstawie sukcesu lub braku polaczenia nalezy wybrac: 0 lub liczbe nieudanych polaczen
// trzeba rowniez zaktualizowac kolumne working
if ($socket_connection) {
echo '<p style="color:green;">Socket OK!</p>';
$working = 1;
$attempt_count = $attempt_default;
$sql = sprintf('UPDATE addresses SET working = %s, attempt_count = %s WHERE idt = %s', $working, $attempt_count, $idt);
}
else {
echo '<p style="color:red;">Socket Error: ' . $errno . '->' . $errstr . '!</p>';
$working = 0;
$attempt_counter++; // nieudane polaczenie, czyli trzeba zwiekszyc licznik
$attempt_count = $attempt_counter; // nowa liczba prob polaczenia
$sql = sprintf('UPDATE addresses SET working = %s, attempt_count = %s WHERE idt = %s', $working, $attempt_count, $idt);
}
// 3.4 wykonanie aktualizacji w tabeli z bazy danych
// jesli zapytanie zostanie poprawnie wykonanego mozna utworzyc wiersz w tabelce HTML
if (mysqli_query($db_connection, $sql)) {
// 3.5 aktualizacja zmiennych na podstawie informacji o polaczeniu
// wartosc logiczna warto zamienic na string OK lub BAD
$workingString = $working ? 'OK' : 'BAD';
echo '<p style="color:green;">sql update worked</p>';
}
else {
echo '<p style="color:red;">sql update didnt work</p>';
}
// 3.6 utworzenie wiersza w tabeli HTML
echo sprintf('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>', $idt, $name, $workingString, $attempt_count, $timeString);
// 3.7 jezeli zmienna wskazuje na zasob, trzeba zamknac polaczenie
// w przeciwnym razie jezeli zmienna przechowuje wartosc bool, wiemy ze polaczenie socket nie udalo sie
if(!is_bool($socket_connection))
{
fclose($socket_connection);
}
$socket_connection = null;
}
echo '</table>';
// 3.8 zamkniecie polaczenia z baza danych
if (mysqli_close($db_connection)) {
echo '<p style="color:green;">closed db_connection</p>';
}
die('terminate script');
Dla osób, które będą śmiać się z kodu: jest to rozwiązanie tymczasowe i bałaganiarskie :)