代码之家  ›  专栏  ›  技术社区  ›  Robin Rodricks

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

  •  1
  • Robin Rodricks  · 技术社区  · 16 年前

    python、perl和php,都支持 TCP stream sockets . 但是,如果我只有ftp访问权,而没有对机器的根访问权,那么我该如何在由Web服务器(如apache)运行的脚本文件中使用套接字呢?

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

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

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

    4. 那么,如何从脚本的一个实例调用另一个实例呢?

    4 回复  |  直到 16 年前
        1
  •  6
  •   Reed Copsey    16 年前

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

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

    2)是的。

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

    4)N/A,见3)


    根据问题和评论的变化进行编辑:

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

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

    然而,(通常)直接在CGI脚本内部运行一个完整的套接字实现不是一个好主意。CGI将期望可执行文件在返回结果给客户机之前运行到完成状态。阿帕奇将坐在那里“挂”一点,等待这个完成。如果您正在启动一个完整的服务器(特别是如果它是一个长时间运行的进程,它们通常是这样),Apache会认为脚本被锁定,并且可能会中止,从而可能会杀死进程(特定于配置,但大多数主机公司这样做是为了防止脚本在共享系统上接管CPU)。

    但是,如果从脚本中执行一个新脚本,然后返回(关闭CGI可执行文件),则另一个脚本可以继续运行,并作为服务器工作。这类似于(Python示例,使用 subprocess 图书馆):

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

    不过,请注意,以上所有内容确实有点依赖于服务器配置。许多主机公司在其脚本实现中没有专门包含一些套接字或shell库来防止这种情况发生,因此您通常必须恢复到在C中生成可执行文件。此外,这通常与大多数主机公司的服务条款相违背—您必须检查您的服务条款。

        2
  •  2
  •   Emil Sit    16 年前

    正如前面的回答说明,脚本语言在这方面的操作方式与编译程序完全相同。它们的不同之处(可能)在于它们使用的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) 程序机制。
        3
  •  1
  •   Jonathan Graehl    16 年前

    我能理解你的要求的唯一方法就是 inetd 或者类似的元服务器,配置为为为特定的监听端口调用“服务单个客户端”程序,将“单个客户端服务程序”程序的stdin/stdout转发到远程客户端。

    如果是这样的话:

    1)inetd运行它

    2)是的

    3)是的

    4) named pipes 是一种可能性

        4
  •  1
  •   Vladislav Rastrusny    16 年前

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

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