13

私はちょうどこのコードを試しました:

<?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);
?>

しかし問題がある。$output の内容をヘッダーとして使用する代わりに、Apache は独自のヘッダーを返します...

このコマンドを使用してスクリプトを実行するため、理由はわかりません: php webserv.php.

ただし、ブラウザからページをロードするhttp://ip-of-my-server:9000/と、サーバー上のクライアントから送信されたヘッダーが表示され、コンテンツが$outputクライアント (ブラウザ) に返されるため、実際には機能します。

可能であれば、PHP のみで独自の Web サーバーを作成したいと考えています。Apache なしで実行する方法を知りたいだけなので、独自の HTTP ヘッダーを管理できます。

4

3 に答える 3

18

PHPでHTTPサーバーを実装する理由はありますか? スレッドなどはありません。面倒です…(これがある種の学術的なものでない限り…)

PHP 5.4 には組み込みの webserver が付属しています。多分それはあなたが探しているものです…</p>


アップデート:

この種のことを学ぶ動機は理解できますが、PHP でこの種のことをしようとしているあなたは間違った方向に進んでいると思います。PHP は実際には (サーバーのように) 長時間実行されるプロセス向けには設計されておらず、並列処理 (スレッド) には対応していません。マルチプロセッシングでさえ、PCNTL、具体的にはpcntl_fork()を必要とし、教育用ウォークアバウトを Unix ベースのシステムに制限します (ただし、これは問題ではないかもしれません)。

サーバーが並行処理をどのように処理するかを理解することが目標である場合は、そのために設計された言語 (Erlang、Go、Scala など) を試してみることをお勧めします。または、少なくとも並列処理をエミュレートする言語で遊んでください (Python、Ruby、… [一種、GIL のため])。

あなたの目標が HTTP を理解することである場合 (そして、HTTP/1.0 を超えて正しく理解したいのであれば、HTTP は獣であると言わせてください)、PHP をいじっても問題ないかもしれません。その場合は、PHP のソケット サーバーに関するこの記事 (悲しいことにドイツ語) のサンプル コード (チャット サーバー) を見て、実際の HTTP に集中して実行されている基本的なソケットのものを取得してください。


更新 2:

ヘッダーに関するあなたの質問に答えるには…あなたの質問で説明されているシナリオにApacheがどのように適合するかはわかりません。しかし、ヘッダーを区切るために改行を使用し、本文からヘッダーを区切るために二重改行を使用しているようです。\r\nデフォルトの改行 (Windows スタイル)を使用して php ファイルを保存していない限り、ヘッダー部分の形式が正しくないため、本文として認識されます。http クライアント (ユーザー エージェント、ブラウザ、curl など) によっては、「いくつかのデフォルト ヘッダーを挿入する」ことで処理される場合があります。改行を に置き換えて\r\n、もう一度やり直してください。

サーバーがインターネットから到達できる場合は、いくつかのヘッダー テスト ツールを試して、HTTP が適切であることを確認してください。ローカルホストのみの場合は、何curl -I http://ip-of-my-server:9000が吐き出されるかを確認してください。

于 2012-07-10T17:32:10.757 に答える
2

web-serverこの場合の意味は、サーバーとクライアント間のソケット通信またはソートであると思います。PHPとソケットに関する私の経験は、フラッシュプロキシクライアントに関するものです。

これには、ページのどこかに1x1pxのフラッシュピクセルを埋め込み、フラッシュピクセル、Javascript、およびPHPSocketServer間のブリッジとして使用することが含まれます。(ソケット通信は、ActionScriptがどのように機能するかを理解すれば、本当に簡単です)。この方法は、ブラウザーとの互換性を最大限に高める唯一の方法でもあります(socket.ioなどのより高度なWebSocketフレームワークでも、このフラッシュピクセル方法をフォールバックとして使用します)。

もちろん、別のオプションは、このサイトでライブリフレッシュ機能に使用されているものと同様のWebSocketです。StackOverflowには専用のタグもあります。

PHPを使用してソケットサーバーを作成することを試してみたい場合は、クライアントはブラウザ以外のものである必要があります。

これがあなたを正しい方向に導くことを願っています...

于 2012-07-10T17:50:12.077 に答える