Erstellen Sie einen webserver in PHP (ohne Apache)
Ich habe gerade versucht diesen code:
<?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);
?>
Aber es gibt ein problem. Statt mit dem Inhalt von $output als der Header, den Apache-Webserver gibt seinen eigenen Header...
Ich weiß nicht, warum, weil ich das Skript ausführen, das über diesen Befehl: php webserv.php
.
Jedoch es praktisch funktioniert, denn wenn ich das laden der Seite http://ip-of-my-server:9000/
aus meinem browser, zeigt er mir die gesendeten Header vom client auf den server, und gibt den Inhalt zurück, von $output
an den client (browser).
Ich möchte mein eigener webserver nur PHP, wenn es möglich ist. Ich möchte nur wissen, wie es ohne Apache, so kann ich die Verwaltung meiner eigenen HTTP-Header.
Dies scheint, wie das Rad neu erfinden. Ich versichere Ihnen, es gibt viele, viele Räder dort.
rdlowrey: ich weiß, dass, ja. Wug: Es ist einfach zu lernen... ich würde es nie verwenden es als Produktions-webserver. Ich will einfach nur, um meine eigene zu wissen, wie es funktioniert von A bis Z.
Sie haben eine Instanz von apache auf der selben Maschine? Vielleicht möchten Sie versuchen, deaktivieren Sie Sie und versuchen Sie es erneut...
Es ist Nanoweb und Birnen HTTP_Server für Referenz.
InformationsquelleAutor Yoone | 2012-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen Grund für die Implementierung eines HTTP-Servers in PHP (aller Dinge)? Es gibt kein threading, etc. Es würde ein Schmerz sein... (es sei denn, dies ist eine Art Akademische Sache...)
PHP 5.4 wird mit einer built-in webserver. Vielleicht ist das, was du suchst...
Update:
Ich verstehe zwar Ihre motivation zu lernen, diese Art von Sachen, ich glaube, du bist auf dem falschen Weg versucht, diese Art von Sachen mit PHP. PHP ist nicht wirklich entwickelt, für lang laufende Prozesse (wie ein server wäre), es ist nicht ausgestattet für die parallele Verarbeitung (Fäden). Auch die multi-processing-erfordern würde PCNTL, speziell pcntl_fork() und beschränken Sie Ihre Bildungs-Rundgang auf einem Unix-basierten system (was nicht ein problem sein, obwohl).
Wenn Ihr Ziel ist es, zu verstehen, wie Server befassen sich mit Parallelität, ich schlage vor, spielen mit Sprache, konzipiert für, dass (Erlang, Go, Scala, ...). Oder spielen Sie mit einer Sprache, die zumindest etwas emuliert parallel processing (Python, Ruby, ... [eine Art, die wegen Ihrer GILs]).
Wenn Ihr Ziel ist es zu verstehen, HTTP (und lassen Sie mich Ihnen sagen HTTP ist ein Tier, wenn du gehst, vorbei HTTP/1.0 und möchte es richtig machen), das hantieren mit PHP kann in Ordnung sein, wenn es die einzige Sprache, die man fest im. Wenn dem so ist, haben Sie einen Blick auf den Beispiel-code (chat-server) in diesem (leider Deutsch) Artikel auf Socket-Server in PHP zu Holen Sie sich die basic-socket-Zeug läuft eine Konzentration auf die eigentliche HTTP.
Update 2:
Zur Beantwortung Ihrer Frage bezüglich der Header...
Ich habe keine Ahnung, wie der apache würde passen in das Szenario beschrieben, die in Ihrer Frage. Aber ich sehe, du bist mit Zeilenumbrüche begrenzen Header und einer doppelten Linie-brechen begrenzen Header von body. Es sei denn, Sie haben gespeichert Ihre php-Datei mit
\r\n
als die Standard-Zeilenumbruch (windows-style), Sie sind header-Teil fehlerhaft ist und würde so erkannt werden wie der Körper. Abhängig von der http-client (user-agent, kann es Ihren browser oder curl oder was auch immer), kann behandelt werden mit "einfügen einige Standard-Header". Ersetzen Sie Ihre Zeilenumbrüche mit\r\n
und versuchen Sie es erneut.Wenn Ihr server vom internet aus erreichbar ist, versuchen einige header-test-tools, um zu überprüfen, Sie Ihre HTTP-sound. Wenn es localhost-nur sehen, was
curl -I http://ip-of-my-server:9000
spuckt.+1 - ich habe keine Ahnung, wer das downvoted, aber er ist ein idiot, downvote. Dass Sie ein HTTP-server ist nicht nur ein "weiter,weiter,weiter" Aufgabe. Speziell wenn Sie es tun, in PHP.
Ich weiß das, aber ich werde mich wiederholen, es ist nur zu lernen, wie es zu tun. Ich werde nie es verwenden, für die eine Produktions-website...
Lernen wie es funktioniert ist groß, das ist, was macht Sie ein guter Programmierer sind, lernen als etwas zu benutzen, die Sie gelernt, tief, das ist Weisheit, und Sie nur mit Erfahrung. Haben Sie keine Angst, um zu versuchen, aus Zeug, aber verwenden Sie gesunden Menschenverstand.
Ich habe es für 10h heute habe ich versucht, eine Menge Dinge, eine Menge verschiedene approachs, und dies scheint der beste zu sein (der code, den ich in meiner ersten Nachricht). Aber es gibt dieses problem mit Apache kann ich wirklich nicht lösen...
InformationsquelleAutor rodneyrehm
Ich denke, das was du Bedeutung von
web-server
ist in diesem Fall einfach einige socket-Kommunikation zwischen einem server und einem client oder sortiert. Meine Erfahrung mit PHP und buchsen wurde mit flash-proxy-clients.Dies beinhaltet die Einbettung einer 1x1px flash pixel irgendwo auf Ihrer Seite und verwenden Sie es als eine Brücke zwischen dem flash-pixel -, Javascript-und PHP-Socket-Server. (socket-Kommunikation ist wirklich ein Kinderspiel mit ActionScript sobald Sie wissen, wie es funktioniert). Diese Methode ist auch nur so erhalten Sie maximale browser-Kompatibilität (auch die erweiterte websocket-frameworks wie socket.io verwenden Sie diese flash-pixel-Methode als fallback).
Andere option ist natürlich WebSockets Analog zu denen auf dieser Website für die live-Funktion aktualisieren. Es gibt sogar ein tag, um es gewidmet hier auf Stack Overflow.
Wenn Sie wollen, zu spielen, um die Schaffung eines - socket-server mit PHP, Ihr Kunde würde etwas anderes als nur Ihrem browser.
Hoffe, das lenkt Sie in die richtige Richtung...
Wenn es das ist, speziell, was Sie suchen, dann muss ich dem Zustimmen, was gesagt wurde von anderen über die neu-Erfindung des Rades... Wenn Sie wollen einfach nur den Blick in die socket-Kommunikation mit PHP dann sollten Sie vielleicht mit etwas beginnen, das kleiner ist als ein HTTP-server...
Nein, ich möchte wirklich zum erstellen eines HTTP server in PHP. Ich will nicht "nur" lernen über sockets.
InformationsquelleAutor Lix
Den code, den Sie versucht war ursprünglich sehr nah, aber nur ein paar kleine änderungen:
Diesen code hier jetzt wieder zu beleben, die header der request-Paket zu finden, die angeforderte Datei und dann geht es in das lokale Verzeichnis für die Datei. So wie es da steht es funktioniert nur bei html spielt es keine Bilder unterstützen, aber es wäre nicht gut, so eine wirklich leichte Gewicht web-server. auch ist es derzeit standardmäßig index.html so einfach sparen Sie, legen Sie einige html-Dateien im gleichen Verzeichnis und zeigen Sie Sie im browser.
Jubel hoffe, dass dies geholfen!
InformationsquelleAutor StingRay