Créer un serveur web en PHP (sans Apache)
J'ai juste essayé ce 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);
?>
Mais il y a un problème. Au lieu d'utiliser le contenu de $output comme les en-têtes, Apache renvoie ses propres en-têtes...
Je ne sais pas pourquoi, parce que j'execute le script via cette commande: php webserv.php
.
Cependant pratiquement fonctionne, parce que lorsque je charge la page http://ip-of-my-server:9000/
à partir de mon navigateur, il me montre les en-têtes envoyés par le client sur le serveur, et renvoie le contenu de $output
pour le client (le navigateur).
Je veux créer mon propre serveur uniquement en PHP si c'est possible. Je veux juste savoir comment l'exécuter sans Apache, donc je peux gérer mes propres en-têtes HTTP.
source d'informationauteur Yoone
Vous devez vous connecter pour publier un commentaire.
Est-il une raison pour mettre en œuvre un serveur HTTP en PHP (de toutes choses)? Il n'y a pas de filetage, etc. Ce serait une douleur... (sauf si c'est une sorte de universitaire chose...)
PHP 5.4 est livré avec un serveur web intégré. Peut-être que c'est ce que vous cherchez...
Mise à jour:
Même si je comprends votre motivation pour apprendre ce genre de choses, je crois que vous êtes sur la mauvaise voie d'essayer ce genre de choses avec PHP. PHP n'est pas vraiment conçu pour les longs processus en cours d'exécution (comme un serveur), il n'est pas équipé pour le traitement en parallèle (threads). Même multi-traitement nécessiterait PCNTLspécifiquement pcntl_fork() et de limiter votre éducation bain de foule pour un Unix système (qui peut ne pas être un problème, tout de même).
Si votre objectif est de comprendre comment les serveurs de traiter la simultanéité, je vous suggère de jouer avec un langage conçu pour que (Erlang, Allez, Scala, ...). Ou de jouer avec une langue qu'au moins une sorte d'émule de traitement parallèle (Python, Ruby, ... [en quelque sorte, en raison de leur GILs]).
Si votre objectif est de comprendre HTTP (et laissez-moi vous dire que HTTP est une bête, si vous êtes en passant par HTTP/1.0 et voulez le faire à droite), de jongler avec PHP peut être bon, si c'est la seule langue que vous êtes fermes dans. Si oui, jetez un oeil à l'exemple de code (serveur de chat) dans ce (malheureusement en allemand) de l'article sur Serveurs de Socket en PHP pour obtenir la base de socket choses de l'exécution d'une me concentrer sur l'HTTP.
Mise à jour 2:
Pour répondre à votre question concernant les en-têtes...
Je n'ai aucune idée de la manière dont apache pourraient s'insérer dans le scénario décrit dans votre question. Mais je vois que vous êtes en utilisant des sauts de lignes pour délimiter les en-têtes et un double saut de ligne pour délimiter les en-têtes du corps. Sauf si vous avez enregistré votre fichier php à l'aide de
\r\n
que le défaut de saut de ligne (type windows), vous êtes à la tête de la partie est mal formé, et serait donc reconnu comme le corps. Selon le client http (agent utilisateur, il peut être de votre navigateur, ou curl, ou autre), cela peut être traitée avec "insérer des en-têtes par défaut". Remplacer votre ligne-casse avec\r\n
et essayez à nouveau.Si votre serveur est accessible à partir de l'internet, essayer quelques-uns l'en-tête de test des outils pour vérifier votre HTTP est son. Si c'est localhost-seulement, voir ce
curl -I http://ip-of-my-server:9000
crache.Je pense que ce que tu sens par
web-server
dans ce cas est tout simplement une prise de communication entre un serveur et un client ou toutes sortes. Mon expérience avec PHP et des prises a été avec flash clients du proxy.Cela implique l'incorporation d'un 1x1px flash pixel quelque part sur votre page et en l'utilisant comme un pont entre le pixel flash, Javascript et PHP Serveur Socket. (communication par socket est vraiment un jeu d'enfant avec ActionScript une fois que vous savez comment cela fonctionne). Cette méthode est également la seule façon que vous allez obtenir le maximum de compatibilité avec les navigateurs (même les plus avancés websocket cadres comme socket.io utiliser ce flash pixel méthode comme une solution de repli).
Une autre option est bien sûr Les WebSockets similaire à ceux utilisés sur ce site pour le live-la fonctionnalité d'actualisation. Il en est de même un tag est dédié ici sur un Débordement de Pile.
Si vous voulez jouer autour de la création d'un serveur socket avec PHP, votre client devra être autre chose que juste votre navigateur.
Espère que cela vous dirige dans la bonne direction...
Le code que vous avez essayé à l'origine, était très proche, mais juste nécessaire d'apporter quelques modifications mineures:
Ce code ici maintenant de faire revivre l'en-tête du paquet de demande de trouver le fichier requis et puis il va aller dans le répertoire local pour ce fichier. Tel qu'il est, cela ne fonctionne qu'avec html, donc il ne prend pas en charge les images, mais il serait bien qu'un très léger poids de serveur web. aussi actuellement, il est par défaut index.html, alors il suffit d'enregistrer ce, mettre des fichiers html dans le même répertoire et dans un navigateur.
acclamations espère que cela a aidé!