Как языки сценариев используют сокеты?

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

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

  2. Сохраняет ли сценарий «работа» в течение всего времени соединения? (может быть часы)

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

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

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

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

2) Да.

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

4) N ​​/ A, см. 3)


Редактировать в ответ на изменение в вопросе и комментариях:

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

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

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

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

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

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

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

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

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

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

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

Если это так:

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

2) да

3) да

4) названные трубы – одна из возможностей

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

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