За последние 24 часа нас посетил 55491 программист и 1793 робота. Сейчас ищут 844 программиста ...

Socket [php]

Тема в разделе "Прочие вопросы по PHP", создана пользователем KING_PHP, 27 май 2015.

  1. KING_PHP

    KING_PHP Активный пользователь

    С нами с:
    18 апр 2015
    Сообщения:
    154
    Симпатии:
    3
    Адрес:
    Волгоград
    Что блин тут не так?
    Код (Text):
    1. Fatal error: Call to undefined function socket_create() in /home/naz.bav/data/www/www/admin/st/MinecraftServerStatus/status.class.php on line 135
    index.php
    Код (PHP):
    1. <?php
    2.  
    3.     include_once 'MinecraftServerStatus/status.class.php';
    4.     $status = new MinecraftServerStatus();
    5.     $response = $status->getStatus('190.115.28.151, 1.5.*, 25974');
    6.     if(!$response) {
    7.         echo"The Server is offline!";
    8.     } else {
    9.         echo"<img width=\"64\" height=\"64\" src=\"".$response['favicon']."\" /> <br>
    10.         The Server ".$response['hostname']." is running on ".$response['version']." and is online,
    11.         currently are ".$response['players']." players online
    12.         of a maximum of ".$response['maxplayers'].". The motd of the server is '".$response['motd']."'. 
    13.         The server has a ping of ".$response['ping']." milliseconds.";
    14.     }
    15.  
    16. ?>
    class.php
    Код (PHP):
    1. <?php
    2.  
    3.     /**
    4.      * Minecraft Server Status Query
    5.      * @author Julian Spravil <julian.spr@t-online.de> https://github.com/FunnyItsElmo
    6.      * @license Free to use but dont remove the author, license and copyright
    7.      * @copyright © 2013 Julian Spravil
    8.      */
    9.     class MinecraftServerStatus {
    10.  
    11.         private $timeout;
    12.  
    13.         public function __construct($timeout = 2) {
    14.             $this->timeout = $timeout;
    15.         }
    16.  
    17.         public function getStatus($host = '127.0.0.1', $port = 25565, $version = '1.7.*') {
    18.  
    19.             if (substr_count($host , '.') != 4) $host = gethostbyname($host);
    20.  
    21.             $serverdata = array();
    22.             $serverdata['hostname'] = $host;
    23.             $serverdata['version'] = false;
    24.             $serverdata['protocol'] = false;
    25.             $serverdata['players'] = false;
    26.             $serverdata['maxplayers'] = false;
    27.             $serverdata['motd'] = false;
    28.             $serverdata['motd_raw'] = false;
    29.             $serverdata['favicon'] = false;
    30.             $serverdata['ping'] = false;
    31.  
    32.             $socket = $this->connect($host, $port);
    33.  
    34.             if(!$socket) {
    35.                 return false;
    36.             }
    37.  
    38.             if(preg_match('/1.7|1.8/',$version)) {
    39. a
    40.  
    41.                 $handshake = pack('cccca*', hexdec(strlen($host)), 0, 0x04, strlen($host), $host).pack('nc', $port, 0x01);
    42.  
    43.                 socket_send($socket, $handshake, strlen($handshake), 0); //give the server a high five
    44.                 socket_send($socket, "\x01\x00", 2, 0);
    45.                 socket_read( $socket, 1 );
    46.  
    47.                 $ping = round((microtime(true)-$start)*1000); //calculate the high five duration
    48.  
    49.                 $packetlength = $this->read_packet_length($socket);
    50.  
    51.                 if($packetlength < 10) {
    52.                     return false;
    53.                 }
    54.  
    55.                 socket_read($socket, 1);
    56.  
    57.                 $packetlength = $this->read_packet_length($socket);
    58.  
    59.                 $data = socket_read($socket, $packetlength, PHP_NORMAL_READ);
    60.  
    61.                 if(!$data) {
    62.                     return false;
    63.                 }
    64.  
    65.                 $data = json_decode($data);
    66.  
    67.                 $serverdata['version'] = $data->version->name;
    68.                 $serverdata['protocol'] = $data->version->protocol;
    69.                 $serverdata['players'] = $data->players->online;
    70.                 $serverdata['maxplayers'] = $data->players->max;
    71.  
    72.                 $motd = $data->description;
    73.                 $motd = preg_replace("/(§.)/", "",$motd);
    74.                 $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd);
    75.  
    76.                 $serverdata['motd'] = $motd;
    77.                 $serverdata['motd_raw'] = $data->description;
    78.                 $serverdata['favicon'] = $data->favicon;
    79.                 $serverdata['ping'] = $ping;
    80.  
    81.             } else {
    82.  
    83.                 $start = microtime(true);
    84.  
    85.                 socket_send($socket, "\xFE\x01", 2, 0);
    86.                 $length = socket_recv($socket, $data, 512, 0);
    87.  
    88.                 $ping = round((microtime(true)-$start)*1000);//calculate the high five duration
    89.                 
    90.                 if($length < 4 || $data[0] != "\xFF") {
    91.                     return false;
    92.                 }
    93.  
    94.                 $motd = "";
    95.                 $motdraw = "";
    96.  
    97.                 //Evaluate the received data
    98.                 if (substr((String)$data, 3, 5) == "\x00\xa7\x00\x31\x00"){
    99.  
    100.                     $result = explode("\x00", mb_convert_encoding(substr((String)$data, 15), 'UTF-8', 'UCS-2'));
    101.                     $motd = $result[1];
    102.                     $motdraw = $motd;
    103.  
    104.                 } else {
    105.  
    106.                     $result = explode('§', mb_convert_encoding(substr((String)$data, 3), 'UTF-8', 'UCS-2'));
    107.                         foreach ($result as $key => $string) {
    108.                             if($key != sizeof($result)-1 && $key != sizeof($result)-2 && $key != 0) {
    109.                                 $motd .= '§'.$string;
    110.                             }
    111.                         }
    112.                         $motdraw = $motd;
    113.                     }
    114.  
    115.                     $motd = preg_replace("/(§.)/", "", $motd);
    116.                     $motd = preg_replace("/[^[:alnum:][:punct:] ]/", "", $motd); //Remove all special characters from a string
    117.  
    118.                     $serverdata['version'] = $result[0];
    119.                     $serverdata['players'] = $result[sizeof($result)-2];
    120.                     $serverdata['maxplayers'] = $result[sizeof($result)-1];
    121.                     $serverdata['motd'] = $motd;
    122.                     $serverdata['motd_raw'] = $motdraw;
    123.                     $serverdata['ping'] = $ping;
    124.  
    125.             }
    126.  
    127.             $this->disconnect($socket);
    128.  
    129.             return $serverdata;
    130.  
    131.         }
    132.  
    133.         private function connect($host, $port) {
    134.             $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    135.             if (!@socket_connect($socket, $host, $port)) {
    136.                 $this->disconnect($socket);
    137.                 return false;
    138.             }
    139.             return $socket;
    140.         }
    141.  
    142.         private function disconnect($socket) {
    143.             if($socket != null) {
    144.                 socket_close($socket);
    145.             }
    146.         }
    147.  
    148.         private function read_packet_length($socket) {
    149.             $a = 0;
    150.             $b = 0;
    151.             while(true) {
    152.                 $c = socket_read($socket, 1);
    153.                 if(!$c) {
    154.                     return 0;
    155.                 }
    156.                 $c = Ord($c);
    157.                 $a |= ($c & 0x7F) << $b++ * 7;
    158.                 if( $b > 5 ) {
    159.                     return false;
    160.                 }
    161.                 if(($c & 0x80) != 128) {
    162.                     break;
    163.                 }
    164.             }
    165.             return $a;
    166.         }
    167.  
    168.     }
    169.  
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Черным по-белому написано, что не так. В твоем пыхе нет расширения, предоставляющего сокеты, Карл.
     
  3. KING_PHP

    KING_PHP Активный пользователь

    С нами с:
    18 апр 2015
    Сообщения:
    154
    Симпатии:
    3
    Адрес:
    Волгоград
    Этот код не мой :D http://bukkit.org/threads/web-php-simple-to-use-minecraft-s ... ry.144329/
     
  4. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Какая разница. пхп то твой. :)
    Обычно на хостингах в панельке есть управление расширениями пыха. Вот найди, включи там сокеты. Или попроси помощи у своей техподдержки.