我刚刚试过这段代码:
<?php
set_time_limit(0);
$address = '176.9.117.136';
$port = 9000;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die('Could not bind to address');
while(1)
{
socket_listen($sock);
$client = socket_accept($sock);
$input = socket_read($client, 1024);
echo $input;
$output = 'URL: http://ip-of-my-server:9000/
HTTP/1.1 200 OK
Date: Tue, 10 Jul 2012 16:58:23 GMT
Server: TestServer/1.0.0 (PHPServ)
Last-Modified: Fri, 06 Jul 2012 14:29:58 GMT
ETag: "13c008e-1b9-4c42a193de580"
Accept-Ranges: bytes
Content-Length: 441
Vary: Accept-Encoding
Content-Type: text/html
';
socket_write($client, $output);
socket_close($client);
}
socket_close($sock);
?>
但是有个问题。 Apache 不使用 $output 的内容作为 header ,而是返回自己的 header ...
我不知道为什么,因为我通过以下命令执行脚本:php webserv.php。
但是它实际上是有效的,因为当我从我的浏览器加载页面 http://ip-of-my-server:9000/ 时,它向我显示了客户端发送的 header 服务器,并将$output的内容返回给客户端(我的浏览器)。
如果可能的话,我只想用 PHP 创建自己的网络服务器。我只想知道如何在没有 Apache 的情况下运行它,这样我就可以管理自己的 HTTP header 。
最佳答案
有理由用 PHP 实现 HTTP 服务器吗?没有线程等。这会很痛苦……(除非这是某种学术上的事情……)
PHP 5.4 附带一个 built-in webserver .也许这就是您正在寻找的……
更新:
虽然我理解您学习此类内容的动机,但我相信您在使用 PHP 尝试此类内容时走错了路。 PHP 并不是真正为长时间运行的进程设计的(就像服务器那样),它不适合并行处理(线程)。即使是多处理也需要 PCNTL , 具体来说 pcntl_fork()并将您的教育漫游限制在基于 Unix 的系统上(尽管这可能不是问题)。
如果您的目标是了解服务器如何处理并发,我建议您使用专为此设计的语言(Erlang、Go、Scala 等)。或者使用一种至少在某种程度上模拟并行处理的语言(Python、Ruby …… [某种程度上,因为它们的 GIL])。
如果你的目标是理解 HTTP(让我告诉你 HTTP 是一个野兽,如果你要超越 HTTP/1.0 并想正确地做它),摆弄 PHP 可能没问题,如果它是唯一的语言你很坚定。如果是这样,请看一下关于 Socket Servers in PHP 的这篇(遗憾的是德语)文章中的示例代码(聊天服务器)让基本的套接字运行集中在实际的 HTTP 上。
更新 2:
要回答有关标题的问题...
我不知道 apache 如何适应您问题中描述的场景。但我看到您正在使用换行符来分隔标题,并使用双换行符来分隔正文中的标题。除非您使用 \r\n 作为默认换行符(windows 样式)保存了 php 文件,否则您的 header 部分格式不正确,因此会被识别为正文。根据 http 客户端(用户代理,可能是您的浏览器、curl 或其他),这可能会被“插入一些默认 header ”处理。用 \r\n 替换你的换行符,然后重试。
如果您的服务器可以从 Internet 访问,请尝试一些 header test tools验证您的 HTTP 是否正确。如果是 localhost-only,请查看 curl -I http://ip-of-my-server:9000 输出的内容。
关于php - 在 PHP 中创建一个网络服务器(没有 Apache),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11418690/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除