За последние 24 часа нас посетили 24853 программиста и 1911 роботов. Сейчас ищут 1032 программиста ...

libcurl + telnet

Тема в разделе "PHP для новичков", создана пользователем afletch, 31 авг 2009.

  1. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    уже потрачено несколько дней. Буду благодарен краткому примеру или авторитетному мнению "Этими методами невозможно", относительно описанной задачи.

    Есть сервер. Работает на 8888 tcp порту. При коннекте к нему принимает текстовую строку и после операции с ней - возвращает обратно (без авторизации). Не принципиально.

    копаю PHP API libcurl в частности работу с telnet.

    Из командной строки -
    >echo "aaaaa" | curl telnet://localserver:8888 - все работает (получаю ожидаемый вывод).
    Значит curl умеет принимать параметры из stdin и передать открытому соединению.

    как этого же добиться через PHP API libcurl?

    максимально, чего смог добиться (и это было не сложно) открытия соединения. Которое, естественно, ждет поступления входящих данных.

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'telnet://127.0.0.1');
    curl_setopt($ch, CURLOPT_PORT, 8888);
    curl_exec( $ch );

    Какие нужно проинициализировать переменные - чтобы отправить свой запрос через telnet соединение.

    Спасибо.
     
  2. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Частично решение получено. Опишу его здесь, поскольку очень мало информации по работе curl+telnet. может быть кому пригодится.

    http://curl.haxx.se/mail/curlphp...002-03/0010.html - обсуждение этой темы с разработчиком libcurl

    The libcurl TELNET support will read data on *stdin* and pass to the remote
    peer, while it will pass incoming network data to the usual internal mumbo
    jumbo.

    So, to automate telnet with curl, you need:
    - set telnet options (if you have any special ideas)
    - make a connection to the remote host with 'telnet://hostname'

    Что в моей вольной интерпретации означает:

    Libcurl отправит в телнет соединение все, что найдет в stdin. Тогда процесс выглядит так:
    - установить telnet опции (если они являются специфическими) (КАКИМ, ИНТЕРЕСНО ОБРАЗОМ ЭТО МОЖНО СДЕЛАТЬ В PHP?????)
    - создать подключение с удаленным хостом "telnet://hostname"

    ------------

    На самом деле работает.

    download.php (без изменений, относительно моего первого поста)
    ----------------
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'telnet://127.0.0.1');
    curl_setopt($ch, CURLOPT_PORT, 8888);
    curl_exec( $ch );
    curl_close($ch);
    ----------------

    >echo "aaaaa" | php download.php

    получаем прогнозируемый результат. Т.е. в CLI режиме запуска - все работало изначально.

    В режиме запуска через web-server (http://localhost/download.php) - stdin является пустым.

    А теперь, вероятно, глупый вопрос.

    Как в случае http://localhost/download.php в stdin передать строку извне либо из самого скрипта на свой же stdin?
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    скажи мне, мил человек, ОТКУДА в HTTP протоколе понятие СТРОКИ ИЛИ ТОЧНЕЕ ПОТОКА?
     
  4. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Дорогой... при чем тут HTTP протокол? Разве скрипт выполняется "протоколом"? %-))) Всегда думал, что его выполняет некоторый демон на стороне сервера. Который в свою очередь имеет и открытые потоки (stdin, out, err).

    И разве я спросил - что мне написать в адресной строке браузера, чтобы это попало в stdin?

    Да, поэтому вопрос в "...новичках", с пометкой, "возможно глупый".

    С другой стороны, вполне логично можно предположить, что входной поток этого демона, возможно перенаправляется внутрь скрипта, который он выполняет. Так же логично предположить, что поток буферизируется в окружении демона, а значит, возможно, он может быть проинициализирован из самого скрипта.

    Ведь Вы не будете спорить, что в варианте с CLI - входной поток имеет интерпретатор (php), а не сам скрипт download.php? (см. пример > echo aaaaa | php download.php), но тем не менее, в этом случае я получаю поток внутри скрипта.

    Да и вывод результата выволнения скрипта - производится stdout. Перехватывается web-демоном и перенаправляется в (вот тут действительно) HTTP соединение. Разве нет?

    Собственно в этом ключе я и задавал вопрос.

    Может быть вопрос не стоило задавать в "...новичках". Если так, либо, я много хочу от PHP - поправьте меня.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    собстенно при HTTP демон сначала принимает данные, а потом скармливает их скрипту. причем не в потоке...
    =)

    а можно полюбопытсовать про задачу, а не про тех. реалицацию?
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я дурак, тебя не понял, прости.
    =)

    и http:// оно там случайно попало...
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ИМХО я думаю ты в CURL уперся, а просто открыть сокетом - не покатит?..
     
  8. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Через переменные окружения. Но ведь есть fopen("php:/stdin","r") может быть существует способ перенаправить этот самый stdin чтобы он указывал файл к примеру? но в то же время оставался stdin'ном для скрипта. извините за тафтологию. %-)))

    Задача проста - опрос серверов по определенному порту на котором находится самописный демон. Последний по запросу отдает статусную информацию. Серверов много. Опрос производится часто. Приложение, условно назовем его "сборщиком" совершает большое кол-во соединений. Более 1 млн. в сутки. (10-15 подключений в сек. на текущий момент). Нагрузка будет в будущем расти.

    Сейчас все и работает через сокеты. Но требуется реализовывать подключение через SOСKS. Чем и "подкорил" libcurl. Собственно еще вопрос, что быстрее работает - сокеты или CURL. Если есть информация по этому вопросу - здорово, если поделитесь.

    Конечно можно SOCKS и через сокеты сделать, но "плаваю" в этом вопросе (повторюсь, поэтому и выбрал CURL). Кстати - буду благодарен хорошей ссылке по принципу работы SOCKS. Если c CURL не получится - пойду копаться в этом направлении. Жаль только потраченного времени.

    Хотя на самом деле, для приложения, о котором я рассказал достаточно работы в CLI Режиме. Но иногда требуется обновить информацию по определенному хосту на "сейчас". Лучшего способа сделать путем запуска, через HTTP - нет. Можно реализовать двумя скриптами. Первый работает в CLI и коннектится через libcurl, второй - сокетами и запускается через веб-сервер. НО:
    1. Возвращаемся к вопросу SOCKS
    2. Не люблю много скриптов, когда можно обойтись одним, тем более, что делают они одно и то же %-))) - знаю, как через пару лет забывается архитектура решений. %-)
    3. Стало жутко интересно, как же получить данные именно на stdin при запуске php средствами web-сервера.


    Только, что пришла мысль в голову, что моя задача решается еще путем proc_open:
    ну, т.е. работает в cli - download.php (как я его описывал выше) и dwnl_http.php - в котором делается proc_open download.php с открытием пайпов для download.php. после этого из dwnl_http.php в pipe stdin download.php написать запрос. Получится такая реализация?

    Но опять - два скрипта. %-)))
    И, что более важно - насколько это затратно по ресурсам? (временным в первую очередь)
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    сокеты "ниже" curl по архитектуре.

    пишешь либу на сокетах и в скриптах просто дергаешь ее вызовы, а там CLI или не CLI - либе будет пох, откуда ее дергают.

    а скрипта будет все равно ДВА,
     
  10. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Но в данном случае совсем необязательно, что socket будет работать быстрее, чем Libcurl. Сокеты открываются серез модуль, подключаемый (или вкопилированный) к PHP. Но ведь и libcurl тоже не на PHP написан. %-)

    Вам спасибо за внимание к моей проблеме. Вероятно этим путем я и пойду.

    Мне, конечно, "ЕХАТЬ, А НЕ ШАШЕШКИ", но все же вопрос остается открытым: возможно ли каким нибудь путем для скрипта "проэмулировать" stdin из него же, при выполнении этого скрипта через веб-сервер?
     
  11. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    конечно. повесить его на 81 порт. =) и ловить коннекты от клиента.

    и нах кому эти веб-сервера нужны.
     
  12. phpbidlo

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

    С нами с:
    18 авг 2009
    Сообщения:
    49
    Симпатии:
    0
    CURLOPT_WRITEFUNCTION/CURLOPT_READFUNCTION пробовал?
     
  13. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    В каждой шутке, есть доля шутки. %-))) Но все же - как мне это может помочь "писать" в stdin в нужном мне скрипте?
     
  14. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    пробовал. но вообще не понял, как это работает. Похоже, что управление, не переходит в переопределенную в curlopt_readfunction функцию. Во всяком случае при telnet соединении.

    В общем - такое переопределение для меня осталось полной загадкой.
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а откуда взялся этот stdin? и зачем итуда писать?

    может начнем сначала?

    что туда вообще передается?
     
  16. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    к примеру:

    начнем не от CGI а от HTTP

    /download.php?cmd=aaaaa

    там принимаем сmd и уже дергаем что надо.

    в случае CGI будет

    php download.php "aaaaa"

    ну а там посмотреть какая мода и вытащить парметры соответственно вызову, НО САМ ВЫЗОВ CURL БУДЕТ ОДИНАКОВЫМ для любых параметров.
     
  17. afletch

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

    С нами с:
    31 авг 2009
    Сообщения:
    9
    Симпатии:
    0
    Нет возражений. %-))) Фактически, вы перефразировали чуть более раннее сообщение:

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

    Откуда взялся stdin? напомню -