Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    PHP Ошибка: Не определена переменная: _ в /opt/mikrotik/routeros

    PHP Ошибка: Не определена переменная: _ в /opt/mikrotik/routeros

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    PHP Ошибка: Не определена переменная: _ в /opt/mikrotik/routeros, RouterOS
     
    xalss
    Guest
    #1
    0
    13.01.2014 13:29:00
    Привет, ребята. У меня эта ошибка возникает почти каждый раз, когда запускаю скрипт. Я загружаю данные в Mikrotik из базы данных, и если я пытаюсь загрузить несколько строк (меньше 20), всё работает нормально. Но когда пытаюсь загрузить около 200 и больше строк, возвращается такая PHP Notice: Undefined variable: _ в /opt/mikrotik/routeros_api.class.php на строке 300. Кто-нибудь может помочь? Вчера всё работало отлично!
     
     
     
    boen_robot
    Guest
    #2
    0
    13.01.2014 13:55:00
    Кажется, ты используешь этого клиента, верно? Он известен тем, что имеет некоторые особенности в обработке буферизации ответов, которые проявляются при работе с большим количеством ответов и при низкой скорости сети, как, вероятно, и происходит в твоей конфигурации. Попробуй с этим клиентом. Если не можешь/не хочешь это делать (например, если ты используешь PHP 5.2), хотя бы убедись, что у тебя последняя версия твоего текущего клиента. В последней версии есть исправление, которое может помочь.
     
     
     
    normis
    Guest
    #3
    0
    13.01.2014 14:00:00
    Похоже, все остальные API-клиенты где-то сбоят. Boenrobot, скажи честно, стоит ли их удалять? Или все-таки есть какой-то смысл их держать?
     
     
     
    boen_robot
    Guest
    #4
    0
    13.01.2014 14:22:00
    Ты имеешь в виду другие PHP-клиенты или вообще другие клиенты? Если речь о PHP-клиентах: клиент Дениса - совсем нет смысла его сохранять, ИМХО. Он не только глючный, но и клиент ayfan'а, и мой могут делать всё, что он умеет, и даже больше, причем гораздо удобнее. Единственная легитимная причина, по которой кто-то может его использовать, – это совместимость с PHP 5.2, но и клиент ayfan'а тоже с ним совместим, так что это не очень весомая причина. Клиент ayfan'а – в нём есть некоторая ценность. Я его не использовал, и не видел, чтобы люди на форуме его использовали, так что не могу комментировать его стабильность. Мне не особо нравится большинство подходов с точки зрения “элегантности”, но что считается “элегантным” – всегда под вопросом. Вообще, в этом клиенте есть некоторые функции*, которые я добавил в своём клиенте только в самой новой (ещё не выпущенной) версии, так что, наверное, можно сказать, что он вдохновил... за исключением того, что моё вдохновение пришло от пользователя форума, а не от изучения самого клиента, но это неважно – он может послужить вдохновением для авторов клиентов для других языков. Клиент sparks framework от vthinkteam – как я уже говорил в его теме, мне не нравится, что этот клиент предоставляет только крайне ограниченный набор функциональности, но в (ИМХО) маловероятном случае, если кому-то конкретно нужен этот набор И он использует sparks framework, я должен признать, что этот клиент было бы проще использовать, чем любой другой**, так что… я думаю, стоит его оставить для тех немногих людей, которым он может пригодиться. Если речь о клиентах в целом – конечно, есть ценность в их сохранении… пока что… так как всегда лучше иметь какой-нибудь клиент, чем вообще ни одного. Кроме того, Perl-клиент раньше был полон ошибок, но их исправили. Пока есть кто-то, кто “отвечает” за клиент, он будет исправляться/расширяться быстрее. Индексация результатов по свойству. ** Другие клиенты (включая мой) потенциально могли бы быть сделаны такими же простыми в использовании, как этот клиент, для всей функциональности RouterOS, если в протоколе API реализован способ сообщать клиентам о доступных командах, аргументах, меню и свойствах. Возможно, что-то вроде моего предложения для команды “/help”.
     
     
     
    ayufan
    Guest
    #5
    0
    13.01.2014 19:07:00
    Клиент довольно стабильный. Я использую его уже несколько лет для синхронизации настроек MT. Ты пишешь шаблонную конфигурацию, которая синхронизируется на кучу устройств. Если посмотреть на https://github.com/ayufan/rosapi-php, там есть немного более новая версия. Некоторым она может не понравиться, потому что это в основном высокоуровневый подход.
     
     
     
    boen_robot
    Guest
    #6
    0
    13.01.2014 19:23:00
    Вызов принят. Быстрый осмотр вашей версии на GitHub показывает, что чтение стабильно (респект вам, кстати – ваш клиент теперь третий, которому это удалось правильно, наряду с Perl и моим), но запись потенциально может не работать. Нужно сделать что-то похожее на то, что вы сделали для чтения – проверять количество записанных байт (возвращаемое значение) и повторно отправлять данные с этого смещения.
     
     
     
    xalss
    Guest
    #7
    0
    14.01.2014 06:23:00
    Ок, я использую этот API http://pear2.github.io/Net_RouterOS/. Мне нужно это сделать. Можешь подсказать, какой правильный синтаксис? $API->comm("/ip/route/add
    =dst-address=$ip_string32
    =gateway=192.168.239.98
    =distance=1
    =scope=30
    =target-scope=10
    =routing-mark=19  
    =comment=RKN");
     
     
     
    boen_robot
    Guest
    #8
    0
    14.01.2014 11:18:00
    Самый изящный способ, если вам не интересно проверять сообщения об ошибках, выглядит так: <?php
    use PEAR2\Net\RouterOS;

    require_once 'PEAR2_Net_RouterOS-1.0.0b4.phar';

    $util = new RouterOS\Util($client = new RouterOS\Client('hostname', 'username', 'password'));

    $util->changeMenu('/ip route');

    $util->add(
       array(
           'dst-address' => $ip_string32,
           'gateway' => '192.168.239.98',
           'distance'=> 1,
           'scope'=> 30,
           'target-scope' => 10,
           'routing-mark' => 19,
           'comment'=> 'RKN'
       )
    ); ( Util ::add() возвращает ID новых элементов, или пустую строку в случае ошибки) Или, если вам нужно проверить сообщение об ошибке, вы можете сделать так: <?php
    use PEAR2\Net\RouterOS;

    require_once 'PEAR2_Net_RouterOS-1.0.0b4.phar';

    $client = new RouterOS\Client('hostname', 'username', 'password');

    $addRequest = new RouterOS\Request(
       '/ip route add gateway=192.168.239.98 distance=1 scope=30 target-scope=10 routing-mark=19 comment=RKN'
    );
    $addRequest->setArgument('dst-address', $ip_string32);

    $client->sendSync($addRequest); ( Client ::sendSync() возвращает коллекцию ответов, которая обычно включает в себя ответ !done с новым ID, или ответ !trap с деталями ошибки, плюс пустой ответ !done)  Можно еще повторить подход Дениса (вроде “get raw”) с Communicator, но я бы этого не советовал, потому что обработка становится излишне сложной (представьте, если бы вы вместо метода comm() использовали методы write() и read()…).
     
     
     
    xalss
    Guest
    #9
    0
    14.01.2014 13:16:00
    Спасибо. Можешь, пожалуйста, еще один пример с запросом преобразовать? `$API->write("/ip/route/print",false);
           $API->write("?comment=RKN",false);
           $API->write("=.proplist=.id,dst-address"); или так: ip route print detail where comment=RKN
     
     
     
    boen_robot
    Guest
    #10
    0
    14.01.2014 13:33:00
    Единственное отличие от второго подхода выше – это дополнительный второй аргумент, который представляет собой объект запроса, например: $printRequest = new RouterOS\Request(
       '/ip route print .proplist=.id,dst-address',
       Query::where('comment', 'RKN')
    );

    $result = $client->sendSync($printRequest);

    // Здесь обрабатываем $result, например, итерируемся по нему с помощью foreach или как вам удобно. Например:
    foreach ($result->getAllOfType(RouterOS\Response::TYPE_DATA) as $item) {
       echo $item->getArgument('dst-address');
    }
     
     
     
    xalss
    Guest
    #11
    0
    14.01.2014 13:37:00
    Спасибо! Работает!
     
     
     
    xalss
    Guest
    #12
    0
    15.01.2014 12:15:00
    Жирная ошибка:  Недопустимое исключение 'PEAR2\Net\Transmitter\SocketException' с сообщением 'Не удалось получить байт начальной длины' в phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/Transmitter/TcpClient.php:199
    Трассировка стека:
    #0 phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/Transmitter/Stream.php(356): PEAR2\Net\Transmitter\TcpClient->createException('Не удалось полу...', 4)
    #1 phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/Transmitter/TcpClient.php(348): PEAR2\Net\Transmitter\Stream->receive(1, 'начальная длина...')
    #2 phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/RouterOS/Communicator.php(620): PEAR2\Net\Transmitter\TcpClient->receive(1, 'начальная длина...')
    #3 phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/RouterOS/Communicator.php(601): PEAR2\Net in phar:///opt/mikrotik/new API/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b4/src/PEAR2/Net/Transmitter/TcpClient.php on line 199

    Получил это своим скриптом. Можешь подсказать, что я сделал не так?
     
     
     
    boen_robot
    Guest
    #13
    0
    15.01.2014 13:57:00
    Скорее всего, проблема в соединении… Попробуй перехватить исключение при создании клиента: try {
    $client = new RouterOS\Client('hostname', 'username', 'password');
    } catch (Exception $e) {
    //Ошибка соединения. Обрабатывай её здесь, например, показывая сообщение об ошибке или что-то подобное.
    }

    //Остальной код. (Если быть точнее, это сбой при входе. Соединение установлено, но скорость кажется слишком низкой даже для получения CHAP-запроса). К тому же, ты не используешь зашифрованное соединение, верно? (Они всё равно очень нестабильны).
     
     
     
    xalss
    Guest
    #14
    0
    16.01.2014 05:49:00
    Подключился к RouterOS: $client = new RouterOS\Client(‘192.168.96.***’, ‘api’, ‘Gtuyv3$trs54fdcds’); echo “connected”; Я использую это подключение. Получил ту же ошибку, что и в прошлый раз, используя твой подход к подключению.
     
     
     
    boen_robot
    Guest
    #15
    0
    16.01.2014 12:33:00
    Строка `$client = new RouterOS\Client('192.168.96.***', 'api', 'Gtuyv3$trs54fdcds');` выбросит исключение в случае неудачи. Если исключение выброшено, весь код внутри блока игнорируется, и скрипт переходит к вашему внутреннему блоку "catch", если он вообще есть, или завершает работу скрипта с сообщением об ошибке, если такого блока для перехода нет. Вам нужно обернуть код конструкцией `try…catch`, чтобы избежать встроенного сообщения об ошибке. Например, используйте: `try {
       $client = new RouterOS\Client('192.168.96.***', 'api', 'Gtuyv3$trs54fdcds');
       echo 'connected';
    } catch (Exception $e) {
       //Ошибка подключения. Обработайте ее здесь, возможно, с сообщением об ошибке или чем-то подобным.
       echo "Not connected";
       exit();
    }

    //Оставшаяся часть вашего кода должна выводить либо "connected", либо "Not connected" - если первая строка выбрасывает исключение, "echo 'connected'" не будет выполнена. Или вы говорите, что видите "connected", а затем ТАКЖЕ видите сообщение об ошибке "Uncaught exception"?
     
     
     
    xalss
    Guest
    #16
    0
    21.01.2014 05:25:00
    Придется перезагрузить Mikrotik. После этого проблема решилась. API работает отлично. Спасибо большое.
     
     
     
    mfrater
    Guest
    #17
    0
    09.11.2014 21:56:00
    У меня та же ошибка при попытке подключиться через API, но перезагрузка не помогла. 'Failed while receiving initial length byte' в phar:///var/www/yii/htdocs/protected/vendor/PEAR2_Net_RouterOS-1.0.0b4.phar/PEAR2_Net_RouterOS-1.0.0b5/src/PEAR2/Net/Transmitter/TcpClient.php:199.  У меня ROS 6.21.1.  Я использую следующий метод подключения:

    require_once('PEAR2_Net_RouterOS-1.0.0b5.phar');

    try {
       $client = new RouterOS\Client('10.128.0.6', 'admin', 'password');
           echo "Connected";
    } catch (Exception $e) {
           echo $e;
       die('Unable to connect to the router.'); Если я слежу за подключениями брандмауэра IP, я вижу, что подключение устанавливается, но оно сразу же закрывается. [admin@seaview2] > ip firewall connection print
    Flags: S - seen reply, A - assured
    PROTOCOL SRC-ADDRESS           DST-ADDRESS           TCP-STATE   TIMEOUT
    3 SA tcp      10.128.0.1:58242      10.128.0.6:8728       close       5s

    [admin@seaview2] > Я веду журнал темы info, но в журнале нет (или сбоя) входа через API.
    Что я еще могу сделать, чтобы устранить эту проблему?
    Есть какие-нибудь идеи, почему это происходит?
     
     
     
    boen_robot
    Guest
    #18
    0
    09.11.2014 22:51:00
    Если ты не видишь сообщение "Не удалось подключиться к роутеру", значит, подключение и вход выполнены, но затем по какой-то причине оно разрывается. Какую команду(ы) ты пытаешься выполнить? Не мог бы ты выложить свой полный PHP-файл? Какую версию PHP ты используешь? Запускаешь на Linux или Windows PC? Есть ли какие-то модемы или другие устройства между твоим компьютером и роутером, которые могут влиять на подключение (я думаю, возможно, у тебя ситуация похожа на эту)?
     
     
     
    mfrater
    Guest
    #19
    0
    10.11.2014 00:17:00
    Решено!!! Раньше я установил публичный диапазон IP-адресов "Available from" в /ip service для API. Как только я добавил дополнительный приватный IP-адрес для API-сервиса на роутере, все заработало отлично. [admin@seaview2] > /ip service set api address=10.128.0.0/21
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры