Страница 1 из 1

Нужна помощь в PHP!

Добавлено: 2008-08-27 21:50:56
harmless
есть скрип для статуса сервера контры

Код: Выделить всё

<?php

// Stats scripts

$server="cs.bc-gold.kiev.ua";
$port="27015";
$qw=chr(32);
$fp = fsockopen ("udp://".$server,$port);

if (!$fp) {
    $online = "<font color=red size=3 face=verdana>Off</font>";
    } else {
	$online = "<font color=green size=3 face=verdana>On</font>";
    fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
    $st=fread($fp,1);
    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];
    $st.=fread($fp,$r);
    fclose($fp);
    $st=substr($st,5);
    $address=SubStr($st,0,StrPos($st,chr(0)));
    $address=str_replace(chr(0),"|",$address);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $name=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $map=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $current=ord(SubStr($st,0,1));
    $max=ord(SubStr($st,1,1));
    }
$show_map="<img src='http://cs.bc-gold.kiev.ua/mappics/".$map.".jpg' width='100%'>";

?>
но он не до конца работает правильно!
когда срвер он и офф лайн он показывает одно и то же и еще мне не совсем ясен рядок

Код: Выделить всё

fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
что ознячают эти все цыфры и код вобще?

Re: Нужна помощь в PHP!

Добавлено: 2008-08-27 22:54:59
hizel
цифири сии похожи на строку заканчивающуюся нулем, начинаются с четырех символов ASCII 0xFF

что касается скрипта, то там помоиму логика не верная, открывается сокет до udp порта удаленного сервера
и если сокет не открылся, считается что удаленные сервер в оффлайне, однакое сиё верно только для tcp
для udp сокет открывается без вопросов обычно если только нет критических проблем у отправителя
и выяснение офлайн и онлайн удаленный сервер имеет смысл решать только по таймауту

надеюсь я донес до вас свою мысль

мои умозаключения будут верны только если в php работа с socket-ами не отличается от других языков

Re: Нужна помощь в PHP!

Добавлено: 2008-08-27 23:17:12
harmless
УУУУУУУУУУУ
Если б я был программистом, а не простым смертным! :smile:

Re: Нужна помощь в PHP!

Добавлено: 2008-08-27 23:41:44
harmless

Код: Выделить всё

$server="172.16.51.8";
$qw=chr(32);
$fp = fsockopen ("udp://".$server,"27015");
if (!$fp) {
    echo "ERROR: $errno - $errstr<br>\n";
    }
	else {
    fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
    $st=fread($fp,1);
    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];
    $st.=fread($fp,$r);
    fclose($fp);
    $st=substr($st,5);
    $address=SubStr($st,0,StrPos($st,chr(0)));
    $address=str_replace(chr(0),"|",$address);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $name=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $map=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $current=ord(SubStr($st,0,1));
    $max=ord(SubStr($st,1,1));
    }
при таком раскладе работает нормально

Код: Выделить всё

if (!$fp) {
    echo "ERROR: $errno - $errstr<br>\n";
    }
Ну а как мне заменить это на то чтоб писало что сервер в оффе???!

Re: Нужна помощь в PHP!

Добавлено: 2008-08-28 2:00:26
krilya

Код: Выделить всё

if (!$fp) {
    echo 'server off';
    }
так ;)

Re: Нужна помощь в PHP!

Добавлено: 2008-08-28 18:47:40
harmless
Не совсем я уж такой тупой как я думал! :smile:
методом логики и чуток научного тыка я все таки заставил этот скрипт работать так как мне нужно:
если сервер в оффе - ОФФ,
если в онлайне и пуст - ФРИ
если в игре - ОН
Поздравляю сам себя! :drinks:
Но получилось только так - когда сервер в ефире то все пашет норм, но только он в оффе - так вылазит ворнинг на 18 рядок

Код: Выделить всё

Warning: fread() [function.fread]: Length parameter must be greater than 0. in W:\www\test.bc-gold.kiev.ua\blocks\cs_stat.php on line 18
А вот для тех, у кого не получилось а нужно, приведу сам скрипт:

Код: Выделить всё

<?php

// Stats scripts

$server="cs.bc-gold.kiev.ua";
$port="27015";
$qw=chr(32);
$fp = fsockopen ("udp://".$server,$port);

if (!$fp) {
    ;
    } else {
	fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
    $st=fread($fp,1);
    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];
    $st.=fread($fp,$r);
    fclose($fp);
    $st=substr($st,5);
    $address=SubStr($st,0,StrPos($st,chr(0)));
    $address=str_replace(chr(0),"|",$address);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $name=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $map=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $current=ord(SubStr($st,0,1));
    $max=ord(SubStr($st,1,1));
    }
$show_map="<img src='http://cs.bc-gold.kiev.ua/mappics/".$map.".jpg' width='100%'>";
if ($current < "1") {
	$online = "<font color=yellow size=3 face=verdana>Free</font>";
	}
elseif ($current >= "1") {
	$online = "<font color=green size=3 face=verdana>On</font>";
	}
else {
	$online = "<font color=red size=3 face=verdana>Off</font>";
	}
?>

Re: Нужна помощь в PHP!

Добавлено: 2008-08-28 19:05:11
harmless
При

Код: Выделить всё

if (!$fp) {
    echo 'server off';
    }
Оно за сабой тянет ворнинг

Код: Выделить всё

Warning: fread() [function.fread]: Length parameter must be greater than 0. in W:\www\test.bc-gold.kiev.ua\blocks\cs_stat.php on line 18
и он засоряет ячейку на сайте!
ТОбишь нужно сделать так чтоб при оффе было только

Код: Выделить всё

$online = "<font color=red size=3 face=verdana>Off</font>";
При моем варианте все же как сказал уважаемый hizel
для udp сокет открывается без вопросов
Все работает только при включеном сервере!
При оффе он опять выдает ошибку а заней уже что сервер свободен(не офф)
Ну так вот, прошу помочь(так как это будет наааамного быстрее, чем я сам буду тыкаться в разные стороны)
Жду ваших претензий,предложений и ,конечно же, пожеланий :smile:

Re: Нужна помощь в PHP!

Добавлено: 2008-08-28 20:54:52
zg
http://ru.php.net/function.fread :good:

а теперь подумай к чему приведёт такой код

Код: Выделить всё

    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];
    $st.=fread($fp,$r);
если socket_get_status() вернёт false?
ну собственно к тому, что Length parameter must be greater than 0 :smile:

для отладки юзай error_reporting(E_ALL);

Re: Нужна помощь в PHP!

Добавлено: 2008-08-29 1:57:43
harmless
Так!
Своего я добился наполовину! :(
Мне еще учиться и учиться
Вобщем есть такой скрипт, который пашет на 100%

Код: Выделить всё

<?php

// Stats scripts

$server="cs.bc-gold.kiev.ua";
$port="27015";
$qw=chr(32);
$fp = fsockopen ("udp://".$server,$port);


if ($fp === false) {
	} else {
    fwrite($fp,"\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00".chr(10));
	$st=fread($fp,1);
    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];
    $st.=fread($fp,$r);
    fclose($fp);
    $st=substr($st,5);
    $address=SubStr($st,0,StrPos($st,chr(0)));
    $address=str_replace(chr(0),"|",$address);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $name=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $map=SubStr($st,0,StrPos($st,chr(0)));
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $st=SubStr($st,StrPos($st,chr(0))+1);
    $current=ord(SubStr($st,0,1));
    $max=ord(SubStr($st,1,1));
	}
	
if (!$st) {
	$online = "<font color=red size=3 face=verdana>Off</font>";
	}
elseif ($current < "1") {
	$online = "<font color=yellow size=3 face=verdana>Free</font>";
	}
elseif ($current >= "1") {
	$online = "<font color=green size=3 face=verdana>On</font>";
	}
	
$show_map="<img src='http://cs.bc-gold.kiev.ua/mappics/".$map.".jpg' width='100%'>";

?>
В нем я не сомневаюсь!
Вот только теперь прошу помощи как убрать любые ворнинги и ероры с вывода при оффе

Код: Выделить всё

Warning: fread() [function.fread]: Length parameter must be greater than 0. in W:\www\test.bc-gold.kiev.ua\blocks\cs_stat.php on line 17
Сервер:
Статус: Off


Карта:
IP:
Игроков: 0/0
или даже вообще!?

Re: Нужна помощь в PHP!

Добавлено: 2008-08-29 2:19:24
krilya
в начале скрипта

Код: Выделить всё

error_reporting(E_ALL ^ E_WARNING);
или аналогичная опция в php.ini

Код: Выделить всё

error_reporting  =  E_ALL  & ~E_WARNING

Re: Нужна помощь в PHP!

Добавлено: 2008-08-29 2:32:27
harmless
Эти функции выводят все ошибки!!!
а мне не нужно чтоб они выводились

Re: Нужна помощь в PHP!

Добавлено: 2008-08-29 2:33:22
harmless
Извеняюсь был не прав! :drinks:

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 16:58:50
BigBrother
Kак можно добавить поддерживаемый модуль для php. Нужна поддержка fsockopen, а ее в списке, который выводит /usr/bin/php -m нет. Есть способы, добавить нужный модуль, без пере компиляции PHP?

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 17:11:40
zg

Код: Выделить всё

zg# grep socket /usr/ports/lang/php5-extensions/Makefile
                SOCKETS         "sockets support" off \
zg#

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 17:32:03
Volodymyr

Код: Выделить всё

/usr/ports/net/php5-sockets

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 17:43:20
Volodymyr
harmless писал(а):Вобщем есть такой скрипт, который пашет на 100%
В нем я не сомневаюсь!
В 100% работающих скриптах нет ворнингов.
harmless писал(а):Вот только теперь прошу помощи как убрать любые ворнинги и ероры с вывода при оффе
Попробуй таки отследить причини ворнингов и сделать обработчик. Ну а если совсем в лом то:

Код: Выделить всё

 $st .= @fread($fp,$r);
хотя лучше разобраться в проблеме, когда вілетают ворнинги.

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 19:43:58
zg
Volodymyr писал(а):В 100% работающих скриптах нет ворнингов.
100% рабочий скрипт тот, в котором нет фатал и парз ерроров. :smile:

Re: Нужна помощь в PHP!

Добавлено: 2008-12-17 20:08:05
Volodymyr
zg писал(а):100% рабочий скрипт тот, в котором нет фатал и парз ерроров. :smile:
Не хочу дискутировать по этому поводу. Но варнинги и нотизы это маяки на проблемные места. Так что со скриптом, удалось побороть проблему без глушения @ ?

Re: Нужна помощь в PHP!

Добавлено: 2008-12-18 12:43:59
zg
Volodymyr писал(а):Так что со скриптом, удалось побороть проблему без глушения @ ?
несколькими постами выше я уже писал о причинах ошибок, если топикстартер читал, то может и поборол
zg писал(а):к чему приведёт такой код

Код: Выделить всё

    $r=socket_get_status($fp);
    $r=$r["unread_bytes"];m
    $st.=fread($fp,$r);
если socket_get_status() вернёт false?
ну собственно к тому, что Length parameter ust be greater than 0 :smile: