Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • 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-скрипт API добавляет перенос строки

    PHP-скрипт API добавляет перенос строки

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    PHP-скрипт API добавляет перенос строки, RouterOS
     
    alphahawk
    Guest
    #1
    0
    02.05.2012 16:57:00
    Наверное, тут легко исправить, но ни в какую не могу понять, как именно. Вот код:

    if ($API_SWITCH->connect($ip,$port_alt,$GW_username,$GW_password)) {
       $API_SWITCH->write('/tool/netwatch/add', false);
       $API_SWITCH->write('=disabled=no', false);
       $API_SWITCH->write('=down-script=:log info "ap '. $netwatch['inventory'][$i]['IP'] . ' down"\r\n/tool e-mail send to="some@email.com" subject="ap '. $netwatch['inventory'][$i]['IP'] . ' down at ' . $netwatch['PName'] . '" body="ap '. $netwatch['inventory'][$i]['IP'] . ' down at ' . $netwatch['PName'] . '" tls=yes', false);
       $API_SWITCH->write('=host='. $netwatch['inventory'][$i]['IP'], false);
       $API_SWITCH->write('=interval=10m', false);
       $API_SWITCH->write('=up-script=:log info "switch 1 up"\r\n/tool e-mail send to="some@email.com" subject="ap '. $netwatch['inventory'][$i]['IP'] . ' up at ' . $netwatch['PName'] . '" body="ap '. $netwatch['inventory'][$i]['IP'] . ' up at ' . $netwatch['PName'] . '" tls=yes');
       $read_switch = $API_SWITCH->read(false);
    }

    При отладке получаю следующее:

    Connected...
    <<< [18] /tool/netwatch/add
    <<< [12] =disabled=no
    <<< [192] =down-script=:log info "ap 10.0.100.101 down"\r\n/tool e-mail send to="some@email.com" subject="ap 10.0.100.101 down at Demo" body="ap 10.0.100.101 down at Demo" tls=yes
    <<< [18] =host=10.0.100.101
    <<< [13] =interval=10m
    <<< [177] =up-script=:log info "switch 1 up"\r\n/tool e-mail send to="some@email.com" subject="ap 10.0.100.101 up at Demo" body="ap 10.0.100.101 up at Demo" tls=yes
    >>> [5/5 bytes read.
    >>> [5, 9] !done
    >>> [7/7 bytes read.
    >>> [7, 1] =ret=*8
    Disconnected...

    Но в самом netwatch при срабатывании up или down срабатывает всегда одно и то же:

    :log info "switch 1 up"\r\n/tool e-mail send to="some@email.com" subject="ap 10.0.100.2 up at Demo" body="ap 10.0.100.2 up at Air2Data Demo\" tls=yes

    Из-за этих переносов строк и возвратов каретки скрипт ломается.

    Есть идеи, как это поправить?
     
     
     
    boen_robot
    Guest
    #2
    0
    21.02.2015 14:01:00
    Это не работает... на Mikrotik передается только первая строка, когда я добавляю "\r\n" или "\n". Странно... Я знаю, что другой PHP-клиент глючит, но не припомню, чтобы у него была именно ТАКАЯ ошибка.

    П.С. Подожди... alphahawk тоже сталкивался с этой проблемой в этой же теме... Чёрт, тема старая! Честно говоря, я уже забыл про этот баг.

    Я скачал все файлы из Net_RouterOS-master\src\PEAR2\Net\RouterOS, а также Autoload.php с других источников, но сделать так, чтобы всё работало, не смог.

    На странице в моей подписи есть архивы со всем необходимым (они также доступны в разделе «Releases» на GitHub). Можно скачать PHAR-файл и просто подключить его. Это самый простой способ. Можно заменить 'PEAR2\Autoload.php' на путь к PHAR-файлу, и всё должно работать точно так же.

    Или можно скачать zip- или tgz-архивы и распаковать их. Там будет Autoload.php и всё остальное. Если выберете zip/tgz, нужно будет изменить путь для include в PHP. Вместо '.;D:\xampp\php\PEAR;D:\xampp\php\PEAR2' он должен указывать на папки с исходниками PEAR и PEAR2, то есть '.;D:\xampp\php\PEAR\pear;D:\xampp\php\PEAR2\php'. Таким образом, ‘PEAR2\Autoload.php’ будет разрешаться в ‘D:\xampp\php\PEAR2\php\PEAR2\Autoload.php’, а остальные исходники (папка src\PEAR2\Net\RouterOS из zip/tgz) окажутся в ‘D:\xampp\php\PEAR2\php\PEAR2\Net\RouterOS’.
     
     
     
    oooscar
    Guest
    #3
    0
    20.02.2015 23:55:00
    Проблема остаётся прежней… пытаюсь добавить скрипт через Mikrotik API, но перенос строки не отправляется. Код работает, но мне хотелось бы добавить разные строки в скрипт, это возможно?  
    $API->write("/system/script/add",false);  
    $API->write("=name=TEST_API",false);  
    $command='=local hh [:pick [/system clock get time] 0 2];';
    $command=$command.':log info "ap down"; ';  
    $command=$command.':log info "ap down1"; ';  
    $command=$command.' ';  
    $API->write($command,true);
     
     
     
    boen_robot
    Guest
    #4
    0
    21.02.2015 12:52:00
    Используйте двойные кавычки в PHP и применяйте “\r\n” или “\n” или любые другие символы переноса строк, которые вы хотите видеть в вашем скрипте (например, “\r\n”, если хотите, чтобы они отображались из Winbox). Для удобочитаемости можно добавлять их отдельными строками, конкатенируя с основными, например:  
    $command = '=source=:local hh [:pick [/system clock get time] 0 2];' . "\r\n";
    $command .= ':log info "ap down"; ' . "\r\n";  
    $command .= ':log info "ap down1"; ' . "\r\n";
     
     
     
    oooscar
    Guest
    #5
    0
    21.02.2015 13:29:00
    boen_robot, это не работает… на Mikrotik отправляется только первая строка, когда я добавляю “\r\n” или “\n”. Я также пытаюсь настроить PER2 на локальном ПК с XAMPP, но не получается заставить всё работать. Я скачал все файлы из Net_RouterOS-master\src\PEAR2\Net\RouterOS, также загрузил Autoload.php из других источников, но всё равно не работает. Есть ли где-то инструкция по шагам, как установить PER2? В папке \Net_RouterOS-master\examples есть примеры, например, callback-and-loop.php содержит: use PEAR2\Net\RouterOS; require_once ‘PEAR2/Autoload.php’; Затем я запускаю http://localhost/apiMikrotik2/Net_RouterOS-master/examples/callback-and-loop.php и получаю: Warning: require_once(PEAR2/Autoload.php): failed to open stream: No such file or directory in D:\xampp\htdocs\apiMikrotik2\Net_RouterOS-master\examples\callback-and-loop.php on line 4 Fatal error: require_once(): Failed opening required ‘PEAR2/Autoload.php’ (include_path=‘.;D:\xampp\php\PEAR;D:\xampp\php\PEAR2’) in D:\xampp\htdocs\apiMikrotik2\Net_RouterOS-master\examples\callback-and-loop.php on line 4 Я добавил в php.ini (include_path=‘.;D:\xampp\php\PEAR;D:\xampp\php\PEAR2’). Помогите, пожалуйста! Спасибо.
     
     
     
    oooscar
    Guest
    #6
    0
    21.02.2015 17:17:00
    Теперь я могу тестировать с обеими средами — api_mt_include_1.6.php и PEAR2/Net/RouterOS. Как ты и говорил, ни одна из них не добавляет перенос строки. Этот код добавляет одну строку с первыми двумя логами, перенос строки, и ещё одну строку с двумя следующими логами…

    $addRequest
       ->setArgument('name', 'TEST_API')
       ->setArgument('source',
    <<<SCRIPT
    :log info "ap 1.1.1.1 down";
    :log info "ap 2.2.2.2 down";
    SCRIPT
    ."\r\n".
    <<<SCRIPT
    :log info "ap 1.1.1.3 down";
    :log info "ap 2.2.2.4 down";
    SCRIPT
       );

    Есть ли какой-то способ обойти эту ошибку? С PEAR2 как я могу проверить, что скрипт добавлен корректно? Я выполняю скрипт дважды — второй запуск должен показать, что скрипт уже существует. Не знаю, будет ли это лучшее решение с этой API для моих задач, объясню:

    У меня около 100 роутеров в разных местах, все с почти одинаковой конфигурацией. Я разрабатываю решение для хотспота, и иногда нужно добавить новое правило в firewall, добавить DNS или изменить что-то на всех роутерах, но при этом сохранить остальную конфигурацию. Сейчас я могу подключаться ко всем из офиса через VPN. Думаю сделать PHP-робота, который будет автоматически обновлять все роутеры. Поэтому мне нужен хороший контроль ошибок.

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

    Как думаешь, это подходящее решение?

    Спасибо!
     
     
     
    boen_robot
    Guest
    #7
    0
    21.02.2015 18:12:00
    Такое поведение ожидаемо. Новые строки действительно присутствуют (и RouterOS учитывает их при выполнении скрипта). Просто они не видны именно в Winbox. Если хотите, чтобы они отображались в Winbox, нужно нормализовать все новые строки в формат «\r\n», а не просто «\n», как это делают большинство PHP-редакторов. Один из простых способов нормализации — регулярное выражение, например: ->setArgument('source',
           preg_replace('~\R~u', "\r\n",
    <<<SCRIPT
    :log info "ap 1.1.1.1 down";
    :log info "ap 2.2.2.2 down";

    :log info "ap 1.1.1.3 down";
    :log info "ap 2.2.2.4 down";
    SCRIPT
           )
       );

    Идея в том, чтобы добавить в скрипт все обновления и выполнить их. Если нужно использовать скрипт снова позже, то добавлять его так, как вы делаете, а потом запускать по необходимости — это лучший способ. Если же изменения нужно применить только один раз, есть три более удобных метода.

    Если вы уверены в своих изменениях (например, уже тестировали их в лаборатории или они достаточно несложные и маловероятно, что вызовут ошибки), можно использовать класс Util и его метод exec(), например:
    $util = new RouterOS\Util($client);
    $util->exec('
    :log info "ap 1.1.1.1 down";
    :log info "ap 2.2.2.2 down";

    :log info "ap 1.1.1.3 down";
    :log info "ap 2.2.2.4 down";
    '
    );
    (Подробности можно найти на странице в GitHub wiki)

    С этим способом нормализовать строки не нужно, так как RouterOS спокойно принимает «\n», и скрипт в Winbox в любом случае не показывается.

    Если вы не уверены в конкретном действии и хотите проверить, успешно ли оно выполнено, не стоит делать это через скрипт, лучше использовать API. Протокол API позволяет отслеживать ошибки, которые возвращает RouterOS, и реагировать на них. Пока связь с роутером активна, можно, например, считать количество успешных команд, а при ошибке выполнить команду «/undo» столько раз, сколько успешных команд было выполнено, чтобы полностью откатить изменения (или пойти альтернативным путём для конкретной команды — это уже зависит от вас).

    Если изменения настолько критичны, что могут прервать соединение, добавьте планировщик (scheduler), который выполнит сам себя через 1 секунду и сразу удалится (это его первоочередная задача), а уже потом выполняйте остальной ваш скрипт. После этого сразу же закрывайте соединение (вызывая unset($client)), чтобы избежать исключения в PHP, если связь всё же потеряется.

    В рамках этого планировщика следует добавить ещё один планировщик, который через некоторое время (скажем, через минуту) вернёт настройки в исходное состояние. За это время PHP успеет переподключиться, проверить обновлённые настройки и, если всё в порядке, удалить «очистительный» планировщик до его срабатывания.
     
     
     
    oooscar
    Guest
    #8
    0
    21.02.2015 22:51:00
    Большое спасибо! Эти три варианта очень мне помогут. Сейчас я начинаю программировать первое обновление и получаю ошибку. Мне нужно обновить строку скрипта (я буду писать весь исходный скрипт через exec) во всех моих роутерах. Когда я использую локальные переменные, которые должны начинаться с $ в скрипте RouterOS, PHP их интерпретирует, даже если они внутри <<<SCRIPT <<<, как PHP-переменные, и появляется предупреждение: Notice: Undefined variable: routerSerial in D:\xampp\htdocs\apiMikrotik3\PEAR2_Net_RouterOS-1.0.0b5\examples\test.php on line 61.

    Результат в скрипте RouterOS:

    :if ([:len [/ip hotspot find where disabled and name=“”]] > 0) do={ .....

    $util->setMenu('/system/script');
    $util->exec('set TEST_API source="'.
    utf8_decode(
    str_replace('"', '\"',
    preg_replace('~\R~u', "\r\n",
    <<<SCRIPT
    :local AP "no";
    :local routerSerial 43CE02D0ABAE;

    /system script job remove numbers=[/system script job find where script ="swb_safe_fetch"];

    # Проверяем, активен ли hotspot
    :local HotspotEstat "";
    :if ([:len [/ip hotspot find where disabled and name="$routerSerial"]] > 0) do={
    :set HotspotEstat "&HOTSPOT=desactivat";
    } else={
    :set HotspotEstat "&HOTSPOT=activat";
    }
    ....

    Спасибо!!
     
     
     
    boen_robot
    Guest
    #9
    0
    21.02.2015 23:11:00
    Нет необходимости в обертке, декодировании и замене строк. Просто вставьте исходный код напрямую. Чтобы избежать предупреждений, заключите исходник в одинарные кавычки или используйте NEWDOC, например:

    $util->exec('
    :local AP "no";
    :local routerSerial 43CE02D0ABAE;

    /system script job remove numbers=[/system script job find where script ="swb_safe_fetch"];

    #Проверяем, активен ли hotspot
    :local HotspotEstat "";
    :if ([:len [/ip hotspot find where disabled and name="$routerSerial"]] > 0) do={
       :set HotspotEstat "&HOTSPOT=desactivat";
    } else={
       :set HotspotEstat "&HOTSPOT=activat";
    }
    ...
    ');

    К тому же я заметил, что некоторые параметры могут отличаться у разных роутеров (например, routerSerial). Если это так, лучше вынести их из скрипта и использовать исходник как «шаблон», заполняя его этими значениями, например:

    $source = '
    /system script job remove numbers=[/system script job find where script ="swb_safe_fetch"];

    #Проверяем, активен ли hotspot
    :local HotspotEstat "";
    :if ([:len [/ip hotspot find where disabled and name="$routerSerial"]] > 0) do={
       :set HotspotEstat "&HOTSPOT=desactivat";
    } else={
       :set HotspotEstat "&HOTSPOT=activat";
    }
    ...
    ';

    $routersInfo = array(
       array(
           'conn' => array('hostname1', 'username', 'password'),
           'params' => array(
               'ap' => 'no',
               'routerSerial' => '43CE02D0ABAE'
           )
       ),
       array(
           'conn' => array('hostname2', 'username', 'password'),
           'params' => array(
               'ap' => 'yes',
               'routerSerial' => 'DEADBEEFFADE'
           )
       ),
    );

    foreach ($routersInfo as $routerInfo) {
       $util = new RouterOS\Util(
           $client = new RouterOS\Client($routerInfo['conn'][0], $routerInfo['conn'][1], $routerInfo['conn'][2])
       );
       $util->exec($source, $routerInfo['params']);
    }

    Вторая переменная в exec() добавляет ключи массива как локальные переменные с обработанными значениями, чтобы случайно не допустить внедрения кода.
     
     
     
    oooscar
    Guest
    #10
    0
    22.02.2015 00:02:00
    Звучит неплохо… но где в твоём примере указать, чтобы задать источник TEST_API?  
    $util->setMenu('/system/script');  
    $util->exec('set TEST_API source="'. …  
    Что ты имеешь в виду: одинарные кавычки или NEWDOC?
     
     
     
    boen_robot
    Guest
    #11
    0
    22.02.2015 00:06:00
    Не нужно. Суть exec() в том, чтобы автоматически добавить скрипт (с случайно сгенерированным именем, чтобы избежать конфликтов с настоящими скриптами), выполнить его и сразу удалить. Это абстрагирует все детали (включая переменные, как в примере выше), чтобы вы могли сосредоточиться на самом исходнике скрипта. Строка в одинарных кавычках '/system/script' Тот же самый текст с использованием нотации NEWDOC: <<<'SCRIPT' /system/script SCRIPT; NEWDOC похож на HEREDOC, то есть <<<SCRIPT /system/script SCRIPT; (обратите внимание, что одинарных кавычек вокруг «SCRIPT» нет), но он не подставляет переменные, так же как строка в одинарных кавычках.
     
     
     
    oooscar
    Guest
    #12
    0
    24.02.2015 13:34:00
    Хорошо, тогда я не могу использовать exec, потому что первое, что мне нужно сделать на всех моих роутерах — обновить скрипт (добавить строку в этот скрипт). Идея в том, чтобы удалить старый скрипт и создать новый с последней версией. У меня всё ещё проблемы с переменными php и router_os_scripts ($): http://forum.mikrotik.com/t/php-api-script-add-carriage-return/56336/1 Есть какие-нибудь идеи? Большое спасибо за помощь.
     
     
     
    boen_robot
    Guest
    #13
    0
    24.02.2015 15:40:00
    Ну, ты уже был близок ранее… Просто чтобы изменить существующий скрипт, нужно использовать «set», а не «add», то есть:

    $setRequest = new RouterOS\Request('/system script set');
    $setRequest
       ->setArgument('numbers', 'TEST_API')
       ->setArgument('source',
           preg_replace('~\R~u', "\r\n", '
    :log info "ap 1.1.1.1 down";
    :log info "ap 2.2.2.2 down";

    :log info "ap 1.1.1.3 down";
    :log info "ap 2.2.2.4 down";
    '
           )
       );
    $client->sendSync($setRequest);

    Это изменит существующий скрипт с именем «TEST_API», но не запустит его. Чтобы потом запустить, нужно вызвать команду «run», например:

    $client->sendSync(new RouterOS\Request('/system script run number=TEST_API'));
     
     
     
    oooscar
    Guest
    #14
    0
    01.03.2015 22:09:00
    Я получаю ошибку: Fatal error: Maximum execution time of 30 seconds exceeded in D:\xampp\htdocs\apiMikrotik3\PEAR2_Net_RouterOS-1.0.0b5\src\PEAR2\Net\RouterOS\Communicator.php on line 222 при выполнении $util = new RouterOS\Util($client = new RouterOS\Client('192.168.90.253', xxx,xxx));  
    ....  
    $addRequest = new RouterOS\Request('/system script set');

    $addRequest  
      ->setArgument('numbers', 'Sinc')  
      ->setArgument('source',  
      preg_replace('~\R~u', "\r\n",$Sinc  
    ));

    $client->sendSync($addRequest,$responseHandler);  
    echo 'OK Sinc <br>';  
     
    $util->setMenu('/ip hotspot walled-garden');  
    $util->exec('remove numbers=[/ip hotspot walled-garden find ]');
    echo 'OK walled-garden remove <br>';  

    И это работает ПРЕВОСХОДНО в таком порядке (сначала exec, потом request):  
    $util = new RouterOS\Util($client = new RouterOS\Client('192.168.90.253', xxx,xxx));  
    ....  
    $util->setMenu('/ip hotspot walled-garden');  
    $util->exec('remove numbers=[/ip hotspot walled-garden find ]');
    echo 'OK walled-garden remove <br>';

    $addRequest = new RouterOS\Request('/system script set');

    $addRequest  
      ->setArgument('numbers', 'Sinc')  
      ->setArgument('source',  
      preg_replace('~\R~u', "\r\n",$Sinc  
    ));

    $client->sendSync($addRequest,$responseHandler);  
    echo 'OK Sinc <br>';  

    Мне нужно сначала обновить скрипт, а потом выполнить команды... Как это сделать?  
    Спасибо!
     
     
     
    boen_robot
    Guest
    #15
    0
    01.03.2015 22:44:00
    Прежде всего… sendSync() не принимает колбэки. Аргумент $responseHandler здесь полностью игнорируется. Хотя это точно не должно вызывать сбоев. Я не могу воспроизвести проблему (даже если колбэк передать — его игнорируют, как и задумано, и скрипт выполняется и завершается нормально)… Возможно, что-то другое в вашем коде (в части «…») и вызывает это. Либо проблема в конкретной версии PHP или RouterOS.

    Вот точный ПОЛНЫЙ тестовый файл, который я пробовал:

    <?php
    use PEAR2\Net\RouterOS;
    require_once 'PEAR2_Net_RouterOS-1.0.0b5.phar';

    $util = new RouterOS\Util($client = new RouterOS\Client('ros.example.com', 'apifull', 'apifull'));

    echo 'Connected<br>';
    $Sinc = '
    :put "LINE1";
    :put "LINE2";
    ';
    $responseHandler = function() {};

    $addRequest = new RouterOS\Request('/system script set');

    $addRequest
         ->setArgument('numbers', 'Sinc')
         ->setArgument('source',
          preg_replace('~\R~u', "\r\n",$Sinc
    ));

    $client->sendSync($addRequest,$responseHandler);
    echo 'OK Sinc <br>';
     
    $util->setMenu('/ip hotspot walled-garden');
    $util->exec('remove numbers=[/ip hotspot walled-garden find ]');
    echo 'OK walled-garden remove <br>';

    Роутер — это RouterOS 6.27 x86 VM с заранее созданным пустым скриптом под названием «Sinc» (добавлен для теста), а версия PHP — 5.6.4 на Windows Server 2008 R2. Как у вас настроено? Какие версии и все такое?
     
     
     
    boen_robot
    Guest
    #16
    0
    01.03.2015 23:34:00
    Пытаясь разобраться глубже, я обнаружил другую, но, возможно, связанную проблему. По какой-то причине exec() зависает, когда используется вместе с конвертацией кодировки, что, собственно, и намекает на ошибка, которую вы видите. Строка 222 в Communicator.php находится внутри iconvStream() — метода, который вызывается только при использовании конвертации кодировки. По непонятной пока причине зависание происходит именно на этой строке… или происходит бесконечный цикл вокруг неё, пока точно не понял, почему именно происходит эта блокировка. Зависание происходит вне зависимости от того, вызывается exec() первым или вторым, так что это не совсем та же проблема, с которой вы столкнулись, но, скорее всего, связанная. Я продолжу разбираться, а пока просто уберите все вызовы конвертации кодировки (то есть любые вызовы Client::setCharset()… наверное, это где-то в части «…», да?). Если конвертация действительно нужна, используйте функцию iconv() вокруг источника exec() (по аналогии с preg_replace()).
     
     
     
    oooscar
    Guest
    #17
    0
    15.03.2015 17:41:00
    Да, дело было в кодировке. Но не получается заставить iconv работать. Вот мой скрипт и комментарии с правильными настройками:  
    $client->setCharset(  
      array(  
        RouterOS\Communicator::CHARSET_REMOTE => 'windows-1252',  
        RouterOS\Communicator::CHARSET_LOCAL  => 'UTF-8'  
      )  
    );  

    Но если я меняю setCharset на:  
    $_SwB_Sinc=iconv("UTF-8", "windows-1252", $_SwB_Sinc);  
    тогда новый скрипт не применяется:  

    $addRequest = new RouterOS\Request('/system script set');  
    $addRequest  
      ->setArgument('numbers', '_SwB_Sinc')  
      ->setArgument('source', preg_replace('~\R~u', "\r\n", $_SwB_Sinc));  
    $client->sendSync($addRequest, $responseHandler);  

    Без iconv скрипт ставится нормально, но с неправильной кодировкой.  
    PHP-заголовок установил так: header('Content-Type: text/html; charset=utf-8');  
    Что посоветуете? Спасибо!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры