脚本语言如何使用套接字?
问题内容:
Python,Perl和PHP都支持TCP流套接字。但是,假设我仅具有FTP访问权限,而没有对计算机的root访问权限,那么究竟如何在由Web服务器(例如Apache)运行的脚本文件中使用套接字?
-
当客户端连接到特定端口时,如何调用脚本文件?
-
脚本在连接期间是否保持“运行”状态?(可能是几个小时)
-
那么脚本的多个“实例”将同时运行吗?
-
那么如何从脚本的一个实例到另一个实例进行方法调用呢?
问题答案:
脚本语言使用套接字的方式与编译语言完全相同。
1)该脚本通常会打开并使用套接字。它不是由套接字“运行”或“调用”的,而是通过库直接控制它(通常调用操作系统的本机C API)。
2)是的。
3)不一定。大多数现代脚本语言可以在一个“脚本”应用程序中处理多个套接字。
4)不适用,请参阅3)
根据问题和评论的变化进行编辑:
现在很明显,您正在尝试在托管服务器的上下文中运行它。通常,如果您在Apache或类似服务器中使用脚本,则工作原理会有所不同。一个套接字由Apache打开并维护,它执行您的脚本,并将相关数据(POST
/ GET结果等)传递给脚本进行处理。当您处理CGI等脚本时,套接字通常不会起作用。
但是,通常使用与mod_cgi相同的概念来发生这种情况。这几乎意味着,就服务器而言,正在运行的脚本不过是可执行文件,而可执行文件的输出就是返回给客户端的内容。在这种情况下(假设您具有服务器上的权限和正确的库),您的python脚本实际上可以启动一个单独的脚本,该脚本完全在Apache上下文之外执行其自身的套接字工作。
但是,通常直接在CGI脚本内部运行完整的套接字实现不是一个好主意。CGI希望可执行文件在将结果返回给客户端之前能够运行完成。Apache将坐在那里并“挂起”一点,等待完成。如果您要启动一个完整的服务器(特别是如果它是一个运行时间很长的进程),Apache会认为该脚本已锁定,并且可能会中止,从而有可能杀死该进程(特定于配置,但大多数托管公司会这样做)以防止脚本接管共享系统上的CPU)。
但是,如果您从脚本中执行一个新脚本,然后返回(关闭CGI可执行文件),则另一个脚本可以作为服务器运行。类似于(使用子进程库的python示例):
newProccess = Popen("python MyScript", shell=True)
请注意,以上所有内容实际上都取决于服务器配置。许多托管公司没有在其脚本实现中专门包含某些套接字或外壳程序库来防止这种情况,因此您通常不得不恢复为使用C语言编写可执行文件。此外,对于大多数托管公司而言,这通常违反了服务条款-
您必须检查一下。