目次
動的WebサーバーメソッドのPHP実装、php動的Webサーバー
ホームページ バックエンド開発 PHPチュートリアル PHP は動的 Web サーバー メソッドを実装します。PHP 動的 Web サーバー_PHP チュートリアル

PHP は動的 Web サーバー メソッドを実装します。PHP 動的 Web サーバー_PHP チュートリアル

Jul 13, 2016 am 09:45 AM
php web サーバ

動的WebサーバーメソッドのPHP実装、php動的Webサーバー

以下のコンテンツでは、動的Webサーバーを実装するためのPHPのメソッドを画像とテキストを通して紹介します。具体的な内容は次のとおりです。

この記事で実装されているサーバーは、原理を説明して理解するためにのみ使用されており、シンプルで理解しやすいように努めています。興味のある友達は、さらに深く変革を続けることができます

Web サーバーを実装したい場合は、Web サーバーがどのように動作するかを一般的に理解する必要があります。 Webサーバーの1.htmlへのアクセスを例として、静的テキストサーバーから始めましょう

1. クライアントは http リクエストをサーバーに送信します。サーバーがリッスンするポート番号が 9002 の場合、ローカル マシン自体でアクセスをテストするアドレスは http://localhost:9002/1.html です。

2. サーバーはポート 9002 をリッスンするため、リクエストを受信した後、Web ディレクトリ内のリクエストでアクセスする必要がある URI リソースの場所を http ヘッダーから取得できます。

3. サーバーは、アクセスする必要があるリソース ファイルを読み取り、それを http エンティティに埋めてクライアントに返します。

概略図は次のとおりです:

リーリー

コードはgithub https://github.com/zhoumengkang/php/tree/master/php-webserver/staticにアップロードされました

上記のコードで述べたように、ファイルがターミナルで実行されている限り、静的 Web サーバーが起動します。

下の写真は、Webディレクトリ内の1.jpgファイルにアクセスしているスクリーンショットです

シンプルな静的 Web サーバーが完成しました。次の問題は、動的コンテンツの出力をサポートする方法です。 Web サーバー内で特定のプログラムを実行し、結果をクライアントに返すだけでよいのでしょうか?しかし、このようにして、Web サーバーのコードはビジネス コードと結合されます。さまざまなビジネス シナリオで使用できる Web サーバーを解決するにはどうすればよいでしょうか。

CGI の出現により、この問題は解決されました。では、CGIとは何でしょうか?次の段落がコピーされます:

CGIとは、外部アプリケーション(CGIプログラム)とWebサーバー間のインターフェース規格で、CGIプログラムとWebサーバー間で情報をやり取りするための手順です。 CGI 仕様により、Web サーバーが外部プログラムを実行し、その出力を Web ブラウザに送信できるようになり、Web の単純な静的ハイパーメディア ドキュメントのセットが完全に新しい対話型メディアに変わります。

具体的な例を挙げると、例えば、私たちが使用している PHP のグローバル変数

は、CGI プロトコルを介して Web サーバーから渡されます。たとえば、Nginx では、この fastcgi 構成を覚えているかもしれません <font face="NSimsun">$_SERVER['QUERY_STRING']</font>

コードをコピーします コードは次のとおりです: fastcgi_param
QUERY_STRING
$クエリ文字列;

はい、nginx はグローバル変数

を fastcgi_param の環境変数に渡します。 <font face="NSimsun">$query_string</font>

以下では、CGI の

を使用してリクエストの環境変数に保存しています。 <font face="NSimsun">QUERY_STRING</font> 作为桥梁,将客户端请求的 uri 中的信息传递到 cgi 程序中去。通过 <font face="NSimsun">putenv</font> 的方式把 <font face="NSimsun">QUERY_STRING</font>

Web サーバーでアクセスされるリソースが以下であることに同意します

接尾辞は動的アクセスを示します。これは、php スクリプトを見つけるために nginx で場所を設定するのと少し似ています。 CGI プログラムをリクエストする必要があるかどうかを確認するのはすべてのルールです。 Web サーバーと区別するために、ユーザー情報を照会し、ユーザー ID に基づいてユーザー情報を照会する CGI プログラムを C で作成しました。 <font face="NSimsun">.cgi</font>

大まかなアクセスロジックは以下の通りです

デモコードのアドレス: https://github.com/zhoumengkang/php/tree/master/php-webserver/dynamic

デモを実行したい場合は、次のことを行う必要があります

1. 修正<font face="NSimsun">config.php</font> 里的项目根目录 <font face="NSimsun">WEB_ROOT</font>

2. ファイルをコンパイルし、設定したプロジェクトのルート ディレクトリに配置します<font face="NSimsun">cgi-demouser.c</font> ,编译命令 <font face="NSimsun">gcc -o user.cgi user.c</font> ,然后将 <font face="NSimsun">user.cgi</font>

3. ターミナルでを実行するとWebサーバーが起動します<font face="NSimsun">php start.php</font>

4. http://localhost:9003/user.cgi?id=1からアクセスして、次の効果を確認できます

其实只是在静态服务器的基础上做了一些 cgi 的判断是请求的转发处理,把github 上的三个文件的代码合并到一个文件里方便大家观看

php
<&#63;php
class web_config {
 // 监听的端口号
 const PORT = 9003;
 // 项目根目录
 const WEB_ROOT = "/Users/zhoumengkang/Documents/html";
 // 系统支持的 cgi 程序的文件扩展名
 const CGI_EXTENSION = "cgi";
}
class server {
 private $ip;
 private $port;
 public function __construct($ip, $port) {
 $this->ip = $ip;
 $this->port = $port;
 $this->await();
 }
 private function await() {
 $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 if ($sock < 0) {
 echo "Error:" . socket_strerror(socket_last_error()) . "\n";
 }
 $ret = socket_bind($sock, $this->ip, $this->port);
 if (!$ret) {
 echo "BIND FAILED:" . socket_strerror(socket_last_error()) . "\n";
 exit;
 }
 echo "OK\n";
 $ret = socket_listen($sock);
 if ($ret < 0) {
 echo "LISTEN FAILED:" . socket_strerror(socket_last_error()) . "\n";
 }
 do {
 $new_sock = null;
 try {
 $new_sock = socket_accept($sock);
 } catch (Exception $e) {
 echo $e->getMessage();
 echo "ACCEPT FAILED:" . socket_strerror(socket_last_error()) . "\n";
 }
 try {
 $request_string = socket_read($new_sock, 1024);
 $response = $this->output($request_string);
 socket_write($new_sock, $response);
 socket_close($new_sock);
 } catch (Exception $e) {
 echo $e->getMessage();
 echo "READ FAILED:" . socket_strerror(socket_last_error()) . "\n";
 }
 } while (TRUE);
 }
 /**
 * @param $request_string
 * @return string
 */
 private function output($request_string){
 // 静态 GET /1.html HTTP/1.1 ...
 // 动态 GET /user.cgi&#63;id=1 HTTP/1.1 ...
 $request_array = explode(" ",$request_string);
 if(count($request_array) < 2){
 return "";
 }
 $uri = $request_array[1];
 echo "request:".web_config::WEB_ROOT . $uri."\n";
 $query_string = null;
 if ($uri == "/favicon.ico") {
 return "";
 }
 if (strpos($uri,"&#63;")) {
 $uriArr = explode("&#63;", $uri);
 $uri = $uriArr[0];
 $query_string = isset($uriArr[1]) &#63; $uriArr[1] : null;
 }
 $filename = web_config::WEB_ROOT . $uri;
 if ($this->cgi_check($uri)) {
 $this->set_env($query_string);
 $handle = popen(web_config::WEB_ROOT.$uri, "r");
 $read = stream_get_contents($handle);
 pclose($handle);
 return $this->add_header($read);
 }
 // 静态文件的处理
 if (file_exists($filename)) {
 return $this->add_header(file_get_contents($filename));
 } else {
 return $this->not_found();
 }
 }
 /**
 * 设置环境变量 给 cgi 程序使用
 * @param $query_string
 * @return bool
 */
 private function set_env($query_string){
 if($query_string == null){
 return false;
 }
 if (strpos($query_string, "=")) {
 putenv("QUERY_STRING=".$query_string);
 }
 }
 /**
 * 判断请求的 uri 是否是合法的 cgi 资源
 * @param $uri
 * @return bool
 */
 private function cgi_check($uri){
 $info = pathinfo($uri);
 $extension = isset($info["extension"]) &#63; $info["extension"] : null;
 if( $extension && in_array($extension,explode(",",web_config::CGI_EXTENSION))){
 return true;
 }
 return false;
 }
 /**
 * 404 返回
 * @return string
 */
 private function not_found(){
 $content = "<h1>File Not Found </h1>";
 return "HTTP/1.1 404 File Not Found\r\nContent-Type: text/html\r\nContent-Length: ".strlen($content)."\r\n\r\n".$content;
 }
 /**
 * 加上头信息
 * @param $string
 * @return string
 */
 private function add_header($string){
 return "HTTP/1.1 200 OK\r\nContent-Length: ".strlen($string)."\r\nServer: mengkang\r\n\r\n".$string;
 }
}
$server = new server("127.0.0.1", web_config::PORT);
ログイン後にコピー

以上就是本文的全部内容,希望大家喜欢。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1039195.htmlTechArticlePHP实现动态web服务器方法,php动态web服务器 以下内容通过图文并茂的方式介绍php实现动态web服务器的方法,具体内容如下: 本文所实现的...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHP:データベースとサーバー側のロジックの処理 PHP:データベースとサーバー側のロジックの処理 Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

See all articles