PHP JS 〜WebSocketもどきの作成〜

イントロダクション

WebSocketの実装をやろうと、色々と調べていくうちに下のサイトを見つけました。

https://www.w3schools.com/Html/html5_serversentevents.asp

試しに実装してみました。

結果

<?php 
header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 
$time = date('r'); 
echo "data: The server time is: {$time}\n\n";
flush();
?>

このコードをwebsocket.phpに実装

JSでのイベントハンドラ部分をserver.phpに実装

var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
  document.getElementById("result").innerHTML += event.data + "<br>";
};

やってみた結果は一応動くが、Socketでデータを飛ばした時には全く反応してくれなかった。。。

PHPにもSocketでの受信処理があるのでそれを少し眺めてみることにする

http://php.net/manual/ja/function.socket-create.php


関連ページ一覧

レンタルサーバーでのPython使用方法

イントロダクション

レンタルサーバーで「Python」が使えることって結構ある、と思います。

PHPからPythonコマンドで使う

レンタルサーバーだとTeratermでログインできない場合があります(契約的に)でもPHPは使えたりする。。。場合

<PHP>

<?php
   $command = "python XXX.py"
   exec($command, $output);
   print($output);
?>

<XXX.py>

print("Hello Python!")

 

お手製リクエストを飛ばす〜HTTPメッセージに関して〜

イントロダクション

Socketでリクエストを飛ばす方法を探していて見つけたのでメモ

HTTPリクエストの中身

要点1:HTTPリクエストとは?

「HTTPリクエストはクライアントが送信してサーバーにアクションを起こさせるリクエストと、サーバーの回答であるレスポンスの、2 種類のメッセージがあります。」

要点2:HTTPリクエストのデータ形式

「HTTP メッセージは ASCII でエンコードされたテキスト情報で構成されており、複数の行にまたがります。」

<HTTPメッセージ>

POST / HTTP/1.1
Host: localhost:8000
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
Sec-Metadata: destination=image, site=same-origin
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://localhost:8000/
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.9,en;q=0.8

<メソッド>

・POST / HTTP/1.1
・GET /background.png HTTP/1.0

・HEAD /test.html?query=alibaba HTTP/1.1
・OPTIONS /anypage.html HTTP/1.0

ちょっと試してみる

通常HTTPヘッダなどを直接指定することはない(だいたいアプリケーション(フレームワークなど)側でやっている)ので今まで触らなかったがヘッダ情報にオリジナルのヘッダを加えてみた。

オリジナルヘッダ追加リクエスト

>>>> Testing <<<<<
127.0.0.1 - - [13/Dec/2018 14:54:35] "GET / HTTP/1.1" 200 -
Created Header!
File CLosed!
*** POST ***
Content-Length: 16
Content-Type: text/plain
Message: Hello

「Hello」は引数で与えたもので、実際に渡す値はなんでも良い(テキストであれば)



<オリジナルヘッダを入れた場合>

*** POST ***
Content-Length: 16
Content-Type: text/plain
Message: Hello

*** BODY ***
Hello

<オリジナルヘッダを入れない場合>

*** POST ***
Content-Length: 0
Content-Type: text/plain

*** BODY ***
None