脚本语言如何使用套接字?

时间:2009-09-15 00:14:40

标签: php python perl sockets scripting

Python,Perl和PHP,都支持TCP stream sockets。但是,我究竟如何在由网络服务器(例如Apache)运行的脚本文件中使用套接字,假设我只有FTP访问权限而不能访问该机器?

  1. 当客户端连接到特定端口时,如何调用脚本文件?

  2. 脚本在连接期间是否保持“正常运行”状态? (可能是几个小时)

  3. 那么脚本的多个“实例”会同时运行吗?

  4. 那么如何从一个脚本实例调用方法到另一个呢?

4 个答案:

答案 0 :(得分:6)

脚本语言使用与编译语言完全相同的套接字。

1)脚本通常会打开并使用套接字。它不是由套接字“运行”或“调用”,而是通过库直接控制它(通常调用操作系统的本机C API)。

2)是的。

3)不一定。大多数现代脚本语言都可以在一个“脚本”应用程序中处理多个套接字。

4)N / A,见3)


编辑以回应问题和评论的变化:

现在很明显,您正尝试在托管服务器的上下文中运行它。通常,如果您在Apache或类似服务器中使用脚本,则情况会有所不同。套接字由Apache打开并维护,它执行您的脚本,将相关数据(POST / GET结果等)传递给您的脚本进行处理。当您处理CGI等脚本时,套接字通常不起作用。

但是,这通常使用与mod_cgi相同的概念。这几乎意味着,就服务器而言,运行的脚本只是一个可执行文件,可执行文件的输出是返回给客户端的输出。在这种情况下,(如果你有权限和服务器上的正确库),你的python脚本实际上可以启动一个单独的脚本,它完全在Apache的上下文之外完成自己的套接字工作。

然而,(通常)在CGI脚本中直接运行完整套接字实现并不是一个好主意。 CGI将期望可执行文件在将结果返回给客户端之前运行完成。 Apache将坐在那里并“等待”等待完成。如果您正在启动一个完整的服务器(特别是如果它是一个长期运行的进程,它们往往是),Apache会认为该脚本已被锁定,并可能中止,可能会导致该进程被终止(特定于配置,但大多数托管公司都这样做防止脚本在共享系统上接管CPU。

但是,如果从脚本中执行新脚本,然后返回(关闭CGI可执行文件),则另一个脚本可以作为服务器运行。这就像(python示例,使用subprocess库):

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

请注意,上述所有内容实际上都取决于服务器配置。许多托管公司在其脚本实现中不包含一些套接字或shell库,专门用于防止这种情况,因此您经常需要恢复在C中制作可执行文件。此外,这通常违反了大多数托管公司的服务条款 - 你必须检查你的。

答案 1 :(得分:2)

正如先前的答案所述,脚本语言在这方面的运作方式与编译程序完全相同。他们不同(可能)的地方是他们使用的API。操作系统(基于Windows或基于Unix)提供编译程序将直接调用(通常)的API(例如,BSD sockets)。像PHP或Python这样的解释语言可能提供不同的API,例如Python的socket API,这可能会简化底层API的某些部分。

鉴于这些API中的任何一种,有许多方法可以构建传入TCP连接的实际处理。 c10k网页上提供了有关此类方法的详尽概述:http://www.kegel.com/c10k.html - 特别是IO strategies部分。简而言之,您的问题答案的选择取决于程序员,并可能影响生成的程序在负载下的执行情况。

专注于您的具体问题:

  1. 许多服务器程序在连接之前启动,并且正在运行以侦听传入连接。一个特例是inetd,它是一个超级服务器:它侦听连接,然后将这些连接交给它启动的程序(在配置文件中指定)。
  2. 通常,是的,脚本在连接期间保持运行。但是,根据较大的系统架构,脚本可以想象地将连接传递给另一个程序进行处理然后退出。
  3. 这是一个选择,同样在c10k页面上列举。
  4. 这是另一种选择;操作系统为程序提供了各种Interprocess Communication (IPC)机制。

答案 2 :(得分:1)

我能理解你问的唯一方法是使用inetd或类似的元服务器,它被配置为为特定的侦听端口调用“服务单个客户端”程序,将“单客户端服务器”程序的stdin / stdout转发给远程客户端。

如果是这样的话:

1)inetd运行它

2)是的

3)是的

4)named pipes是一种可能性

答案 3 :(得分:1)

  

当客户端连接到特定的   端口,脚本文件是如何获得的   调用

应该已经调用脚本以便从任何客户端接收任何连接。你将需要脚本永远挂在那里(infinie循环)并设置Apache不要在超时时杀死它。基本上,PHP不是写入服务器应用程序的好选择。你为什么需要这个?