уже потрачено несколько дней. Буду благодарен краткому примеру или авторитетному мнению "Этими методами невозможно", относительно описанной задачи. Есть сервер. Работает на 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 соединение. Спасибо.
Частично решение получено. Опишу его здесь, поскольку очень мало информации по работе 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?
Дорогой... при чем тут HTTP протокол? Разве скрипт выполняется "протоколом"? %-))) Всегда думал, что его выполняет некоторый демон на стороне сервера. Который в свою очередь имеет и открытые потоки (stdin, out, err). И разве я спросил - что мне написать в адресной строке браузера, чтобы это попало в stdin? Да, поэтому вопрос в "...новичках", с пометкой, "возможно глупый". С другой стороны, вполне логично можно предположить, что входной поток этого демона, возможно перенаправляется внутрь скрипта, который он выполняет. Так же логично предположить, что поток буферизируется в окружении демона, а значит, возможно, он может быть проинициализирован из самого скрипта. Ведь Вы не будете спорить, что в варианте с CLI - входной поток имеет интерпретатор (php), а не сам скрипт download.php? (см. пример > echo aaaaa | php download.php), но тем не менее, в этом случае я получаю поток внутри скрипта. Да и вывод результата выволнения скрипта - производится stdout. Перехватывается web-демоном и перенаправляется в (вот тут действительно) HTTP соединение. Разве нет? Собственно в этом ключе я и задавал вопрос. Может быть вопрос не стоило задавать в "...новичках". Если так, либо, я много хочу от PHP - поправьте меня.
собстенно при HTTP демон сначала принимает данные, а потом скармливает их скрипту. причем не в потоке... =) а можно полюбопытсовать про задачу, а не про тех. реалицацию?
Через переменные окружения. Но ведь есть 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 написать запрос. Получится такая реализация? Но опять - два скрипта. %-))) И, что более важно - насколько это затратно по ресурсам? (временным в первую очередь)
сокеты "ниже" curl по архитектуре. пишешь либу на сокетах и в скриптах просто дергаешь ее вызовы, а там CLI или не CLI - либе будет пох, откуда ее дергают. а скрипта будет все равно ДВА,
Но в данном случае совсем необязательно, что socket будет работать быстрее, чем Libcurl. Сокеты открываются серез модуль, подключаемый (или вкопилированный) к PHP. Но ведь и libcurl тоже не на PHP написан. %-) Вам спасибо за внимание к моей проблеме. Вероятно этим путем я и пойду. Мне, конечно, "ЕХАТЬ, А НЕ ШАШЕШКИ", но все же вопрос остается открытым: возможно ли каким нибудь путем для скрипта "проэмулировать" stdin из него же, при выполнении этого скрипта через веб-сервер?
В каждой шутке, есть доля шутки. %-))) Но все же - как мне это может помочь "писать" в stdin в нужном мне скрипте?
пробовал. но вообще не понял, как это работает. Похоже, что управление, не переходит в переопределенную в curlopt_readfunction функцию. Во всяком случае при telnet соединении. В общем - такое переопределение для меня осталось полной загадкой.
к примеру: начнем не от CGI а от HTTP /download.php?cmd=aaaaa там принимаем сmd и уже дергаем что надо. в случае CGI будет php download.php "aaaaa" ну а там посмотреть какая мода и вытащить парметры соответственно вызову, НО САМ ВЫЗОВ CURL БУДЕТ ОДИНАКОВЫМ для любых параметров.
Нет возражений. %-))) Фактически, вы перефразировали чуть более раннее сообщение: Устраивает меня такое решение? На данном этапе да. Все остальное - вопрос оптимизации и поиск "красивого" решения. Ведь запуск второго процесса - не хорошо при нужной мне нагрузке. Согласитесь - если существует способ "писать" в собственный stdin - то это несколько быстрее будет работать, чем запуск второго скрипта. Откуда взялся stdin? напомню -