![]() |
1
6
脚本语言使用套接字的方式与编译语言完全相同。 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 图书馆):
不过,请注意,以上所有内容确实有点依赖于服务器配置。许多主机公司在其脚本实现中没有专门包含一些套接字或shell库来防止这种情况发生,因此您通常必须恢复到在C中生成可执行文件。此外,这通常与大多数主机公司的服务条款相违背—您必须检查您的服务条款。 |
![]() |
2
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 . 简而言之,对您的问题的答案的选择取决于程序员,并且可能影响结果程序在负载下的运行方式。 关注你的具体问题:
|
![]() |
3
1
我能理解你的要求的唯一方法就是 inetd 或者类似的元服务器,配置为为为特定的监听端口调用“服务单个客户端”程序,将“单个客户端服务程序”程序的stdin/stdout转发到远程客户端。 如果是这样的话: 1)inetd运行它 2)是的 3)是的 4) named pipes 是一种可能性 |
![]() |
4
1
为了从任何客户机接收任何连接,应该已经调用该脚本。您将需要脚本永远挂在那里(Infinie循环),并设置Apache以避免在超时时终止它。基本上,PHP不是编写服务器应用程序的好选择。你为什么需要这个? |