Как языки сценариев используют сокеты? - PullRequest
1 голос
/ 15 сентября 2009

Python, Perl и PHP, все поддерживают потоковые сокеты TCP . Но как именно использовать сокеты в файле сценария, который запускается веб-сервером (например, Apache), при условии, что у меня есть только FTP-доступ, а не root-доступ к компьютеру?

  1. Когда клиент подключается к определенному порту, как вызывается файл сценария?

  2. Сценарий остается «запущенным» на время соединения? (может быть часы)

  3. Так будет ли одновременно выполняться несколько «экземпляров» скрипта?

  4. Тогда как можно вызывать методы из одного экземпляра скрипта в другой?

Ответы [ 4 ]

6 голосов
/ 15 сентября 2009

Языки сценариев используют сокеты точно так же, как и скомпилированные языки.

1) Сценарий обычно открывается и использует сокет. Он не «запускается» и не «вызывается» сокетом, а напрямую управляет им через библиотеки (обычно вызывая собственный C API для ОС).

2) Да.

3) Не обязательно. Большинство современных скриптовых языков могут обрабатывать несколько сокетов в одном «скриптовом» приложении.

4) Н / Д, см. 3)


Изменить в ответ на изменение вопроса и комментариев:

Теперь очевидно, что вы пытаетесь запустить это в контексте размещенного сервера. Как правило, если вы используете скрипты в Apache или аналогичном сервере, все работает немного иначе. Apache открывает и поддерживает сокет, и он выполняет ваш скрипт, передавая соответствующие данные (результаты POST / GET и т. Д.) В ваш скрипт для обработки. Сокеты обычно не вступают в игру, когда вы работаете со скриптами для CGI и т. Д.

Однако обычно это происходит с использованием тех же понятий, что и mod_cgi . Это в значительной степени означает, что выполняемый скрипт является не чем иным, как исполняемым файлом для сервера, а выходные данные исполняемого файла возвращаются клиенту. В этом случае (при условии, что у вас есть разрешения и правильные библиотеки на сервере), ваш скрипт на Python может фактически запустить отдельный скрипт, который выполняет свой собственный сокет полностью вне контекста Apache.

Однако (обычно) не очень хорошая идея запускать полную реализацию сокетов непосредственно внутри скрипта CGI. CGI ожидает, что исполняемый файл завершится, прежде чем он вернет результаты клиенту. Апач будет сидеть и немного "зависать", ожидая, пока это завершится. Если вы запускаете полноценный сервер (особенно если это длительный процесс, которым они обычно являются), Apache сочтет, что скрипт заблокирован и, возможно, прерывается, что потенциально может привести к его остановке (в зависимости от конфигурации, но большинство хостинговых компаний делают это для предотвращения загрузки сценариями ЦП в общей системе).

Однако, если вы выполняете новый сценарий из своего сценария, а затем возвращаетесь (закрывая исполняемый файл CGI), другой сценарий можно оставить работающим, работая как сервер. Это будет что-то вроде (пример Python, используя библиотеку subprocess ):

newProccess = Popen("python MyScript", shell=True)

Обратите внимание, что все вышеперечисленное действительно немного зависит от конфигурации сервера. Многие хостинговые компании не включают некоторые библиотеки сокетов или командных оболочек в свои реализации сценариев специально для предотвращения этого, поэтому вам часто приходится возвращаться к созданию исполняемого файла на C. Кроме того, это часто противоречит условиям обслуживания для большинства хостинговых компаний. - ты должен проверить свои.

2 голосов
/ 15 сентября 2009

Как отмечается в предыдущем ответе, языки сценариев работают в этом отношении точно так же, как и скомпилированные программы. Где они различаются (потенциально) в API, который они используют. Операционная система (на базе Windows или Unix) предлагает API (например, BSD-сокеты ), который скомпилированные программы будут вызывать напрямую (обычно). Интерпретируемые языки, такие как PHP или Python, могут предлагать другой API, такой как API-интерфейс сокетов Python , который может упростить некоторые части базового API.

Учитывая любой из этих API, существует много способов, которыми можно структурировать фактическую обработку входящего соединения TCP. Большой и подробный обзор таких подходов доступен на веб-странице c10k: http://www.kegel.com/c10k.html - в частности, раздел IO стратегии . Короче говоря, выбор ответов на ваш вопрос остается за программистом и может повлиять на работу программы под нагрузкой.

Чтобы сосредоточиться на ваших конкретных вопросах:

  1. Многие серверные программы запускаются до соединения и работают для прослушивания входящих соединений. Особый случай - inetd, который является суперсервером: он прослушивает соединения и затем передает эти соединения программам, которые он запускает (указан в файле конфигурации).
  2. Как правило, да, скрипт остается запущенным на время соединения. Однако, в зависимости от более крупной архитектуры системы, сценарий может передать соединение другой программе для обработки и затем завершиться.
  3. Это выбор, опять же, как перечислено на странице c10k .
  4. Это еще один выбор; операционные системы предлагают различные механизмы межпроцессного взаимодействия (IPC) для программ.
1 голос
/ 15 сентября 2009

Когда клиент подключается к определенному порт, как получить файл скрипта вызывается?

Сценарий должен быть уже запущен для получения любых соединений от любого клиента. Вам понадобится скрипт, который будет висеть там навсегда (бесконечный цикл) и настроить Apache, чтобы он не убивал его по таймауту. По сути, PHP не является хорошим выбором для написания серверных приложений. Зачем тебе это?

1 голос
/ 15 сентября 2009

Единственный способ понять, о чем вы спрашиваете, - это использовать inetd или аналогичный метасервер, который настроен для вызова вашей программы «обслуживать одного клиента» для определенной прослушивающий порт, перенаправляющий stdin / stdout программы «один клиентский обслуживающий» на удаленный клиент.

Если это так:

1) inetd запускает его

2) да

3) да

4) именованные каналы есть одна возможность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...