脚本语言如何使用套接字?
Python、Perl 和 PHP 都支持 TCP 流套接字。但是,如果我只有 FTP 访问权限,而没有机器的根权限,我该如何在由网络服务器(比如 Apache)运行的脚本文件中使用套接字呢?
当客户端连接到特定端口时,脚本文件是如何被调用的?
脚本在连接期间会一直“运行”吗?(可能会持续几个小时)
那么会有多个“实例”的脚本同时运行吗?
那么,如何从一个脚本实例调用另一个实例的方法呢?
4 个回答
之前的回答提到,脚本语言在这方面的工作方式和编译程序是一样的。它们的不同之处可能在于使用的API。操作系统(比如Windows或Unix)提供了一种API(例如,BSD套接字),编译程序通常会直接调用这个API。而像PHP或Python这样的解释型语言可能会提供不同的API,比如Python的套接字API,这可能会简化一些底层API的使用。
使用这些API时,处理一个进来的TCP连接的方式有很多种。关于这些方法的详细概述可以在c10k网页上找到:http://www.kegel.com/c10k.html,特别是关于IO策略的部分。简单来说,选择如何处理连接的问题取决于程序员,这可能会影响程序在高负载下的表现。
针对你的具体问题:
- 很多服务器程序是在连接之前就启动的,它们会一直运行,监听进来的连接。一个特殊的例子是inetd,它是一个超级服务器:它监听连接,然后把这些连接交给它启动的程序(在配置文件中指定)。
- 通常情况下,是的,脚本会在连接期间一直运行。不过,根据更大的系统架构,脚本也可能会把连接交给另一个程序处理,然后退出。
- 这也是一个选择,具体可以参考c10k页面上的内容。
- 这又是一个选择;操作系统为程序提供了多种进程间通信(IPC)机制。
脚本语言和编译语言在使用套接字(socket)方面是一样的。
1) 脚本通常会打开并使用套接字。套接字并不是“运行”或“调用”脚本,而是脚本通过一些库直接控制它(通常是调用操作系统的C语言接口)。
2) 是的。
3) 不一定。大多数现代脚本语言可以在一个“脚本”应用中处理多个套接字。
4) 不适用,见第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语言编写可执行文件。此外,这通常违反了大多数托管公司的服务条款——你需要检查一下你的托管公司。