Jump to content

Проблемы с php sdk


Recommended Posts

Не совсем относится к луа, но к мта точно. В общем решил поставить на сайт простой пхп скрипт, который выводит имя текущей карты.

Собственно, код пхп:

include( "mta_sdk.php" );$mtaServer = new mta( $s_ip, $s_port ); //$s_ip и $s_port объявлены выше (айпишник и порт)$retn_m = $mtaServer -> getResource( "myResource" ) -> call( "getCurrentMap" ); echo "Текущая карта: ".$retn_m[ 0 ];

Моя функция 'getCurrentMap':

function getCurrentMap() 
  return getMapName(); 
end; 

Все прекрасно выводится на страничку, проблем нет. Но одна загвоздка: если часто обновлять страницу, либо к странице обращаются несколько человек, вместо названия карты вылетает ошибка:

Notice: Undefined offset: 1 in mta_sdk.php on line 182

Notice: Undefined offset: 1 in mta_sdk.php on line 185

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

Ну и после некоторого времени, если обновить страничку, все работает так, как надо. Но если опять начать часто обновлять страницу, появляется все то, что описал выше.

Сломал себе голову. Пробовал вместо include писать include_once и require_once - не помогло.

Кто встречался с такой проблемой, подскажите решение.

Link to comment

Незнаю в чем проблема, но можно сделать все немного проще и надежнее. Зачем каждый раз при загрузке страницы спрашивать у сервера название карты? При загрузке карты отправляй на сайт её название (в текстовый файл, бд), а потом при загрузке страницы бери название из файла.

Link to comment

название карты можно прекрасно и 100%тно получить без PHP SDK

$MAP_NAME = 'Unknown'; 
  
$mtasa_ip =     '127.0.0.1'; // какой хотите поставьте 
$mtasa_port =   22003; 
$mtasa_pre =    'EYE1'; 
$mtasa_fp =     fsockopen( "udp://{$mtasa_ip}", (string) ($mtasa_port+123),  
                    $mtasa_errno, $mtasa_errstr, 3 ); 
  
if ( $mtasa_fp !== FALSE ) 
{ 
    fwrite( $mtasa_fp, 's' ); 
    $mtasa_packet = fread( $mtasa_fp, 16384 ); 
    fclose($mtasa_fp); 
  
    if ( substr( $mtasa_packet, 0, 4 ) == $mtasa_pre ) 
    { 
        $mtasa = array(); 
        $pos = 4; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['gameShortName'] =   substr( $mtasa_packet, ++$pos, $len ); 
        $pos +=                     $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['serverPort'] =      substr( $mtasa_packet, ++$pos, $len ); 
        $pos +=                     $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['serverName'] =      substr( $mtasa_packet, ++$pos, $len ); 
        $pos                        += $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['gameModeName'] =    substr( $mtasa_packet, ++$pos, $len ); 
        $pos                        += $len; 
  
        $len =                      ord( substr( $mtasa_packet, $pos, 1 ) ) - 1; 
        $mtasa['mapName'] =         substr( $mtasa_packet, ++$pos, $len ); 
     
        $MAP_NAME = $mtasa['mapName']; 
         
        // ... 
    } 
} 

Link to comment
тут речь шла про имя карты..

Мм, моя оплошность. Вкупе с именем карты по тому примеру, который я указал в первом посте, я так же вызываю несколько lua - функций, почему как бы сразу и начал использовать mta_sdk.

Link to comment

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

Link to comment
  • 2 weeks later...

to MX_Master

Можешь, пожалуйста, рассказать, как на твоем сайте реализован блок мониторинга сервера? Тоже через php_sdk или через что-то другое? Я сделал точь в точь такой же блок, как у тебя (выводит ники, пинг и проч.), но его пришлось выпилить из-за того, что вот ошибки спамит.

Link to comment

Я просто знаю порядок данных, составляющих UDP ответ на UDP запрос "s" серверу. Как показано выше в моем коде, идет просто сохранение этих данных и одновременный разбор последующих.

Такой код, обычно, называется MTA:SA Server Query и его можно найти в разных местах инета, допустим здесь

Link to comment

У меня, канеш, чуток другой вид, т.к. я сам катал свой РНР скрипт, но в целом результат один. В случае, если нужного ответа от сокета нет, можно показывать какое-то сообщение, типа "Мониторинг недоступен" или "Сервер сейчас недоступен". У меня и серв и веб серв на одной тачке стоят, поэтому этот запрос я на себя же и делаю (127.0.0.1)

Link to comment
  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...