pingサーバを作ってみた

2015.05.06 Wednesday | by こも
pingサーバを作ってみました。

正確には、Pingを受け取るコードを書いてみた。…という方が正しいかもしれません。
内容は全然濃くないです(^^;;


やりたかったこと

複数の人が複数のブログを書いています。
記事を投稿した直後に別のサーバでその記事をキュレーション(まとめ)して付加価値をつけたいという思いがありました。


考えたアプローチ

1. 各ブログのpingの送信先の設定に、自社サーバのURLを追加してもらい、ブログを更新すると通知されるようにしてもらう
2. 自社サーバでpingを受け取る
3. 受け取った内容を解析して、必要な情報を取得・DBに蓄積する


今回やったこと

「2. 自社サーバでpingを受け取る」の部分のコードを書いてみました。

pingといってもPOSTメソッドで情報を送っているだけなので、受信側のコードは極めてシンプルです。
とえりあえず、受け取った情報をinput.txtというファイルに書き出す処理にしてみました。

最後にpingを受け取ってエラーがない旨のレスポンスを返します。
(とりあえずエラーがないという前提のレスポンスです。必要に応じて要変更★)

<?php
$result = mb_convert_encoding(file_get_contents("php://input"), "UTF-8", "auto");
file_put_contents('input.txt', $result);

header("Content-Type: text/xml");
echo "<?xml version='1.0'?>";
echo "<methodResponse>";
echo "<params><param><value>";
echo "<struct>";
echo "<member><name>flerror</name><value><boolean>0</boolean></value></member>";
echo "<member><name>message</name><value><string>Thanks for the ping.</string></value></member>";
echo "</struct>";
echo "</value></param></params>";
echo "</methodResponse>";

?>

受信側はたったこれだけです。
あとはブログを更新して、ブログに元々備わっているシステムでpingを送信してもらいます。


さてさて、どんなpingの内容が送られてくるでしょうか?
wordpressと手元のJUGEMブログのpingの送信内容を比較してみました。
<?xml version="1.0"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
  <params>
    <param>
      <value>
        <string>読書の記憶</string>
      </value>
    </param>
    <param>
      <value>
        <string>http://books.classical-whodunit.com/</string>
      </value>
    </param>
  </params>
</methodCall>


<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
  <params>
    <param>
      <value><string>PHPなんか怖くないぞ(>_<)</string></value>
    </param>
    <param>
      <value><string>http://php.steppers-hi.net/</string></value>
    </param>
  </params>
</methodCall>


うーん。投稿した記事の内容をping送信してくれているのかと勝手に期待していましたが、どうやら必要最低限の情報しか含まれていないようですね。

「weblogUpdates.ping」というのは、ブログの更新である旨のメソッドの記述。
あとは、ブログタイトルとブログのルートのURLが含まれているだけでした。

少なくともWordpressとJUGEMブログで共通のフォーマットであることから、なんか規約的なものがあるんでしょうね、きっと。


まぁ、とりあえずpingが受信できるところまではできたので、あとは更新されたURLのRSS情報を読み込んで加工すれば、今回やりたいことはできそうです!!



参考にさせて戴いたサイト:infoScoop開発者ブログ

MAMP使用時の開発環境のDBサーバの切り替え

2014.10.19 Sunday | by こも
最近DBサーバにアクセスするWebサイトの作成にトライしてみました。


mac上でMAMPを使って開発していますが、一つ面倒なことがあります。

Mac内の開発環境とWeb上の本番環境を行ったり来たりして動作確認を実施していますが、
PHPで接続するDBサーバの切り替えが面倒なのです(^^;;


具体的には、開発環境ではMAMP内のローカルDBに接続し、
本番環境では本番環境内のDBに接続します。

DBのホスト名やユーザ名、パスワードなどが異なるので、
本番環境にファイルをアップロードする度にPHPのコードを書き換える必要があります。


面倒くさくて、なんとか自動化できないものかと考えました。

結論としては、今表示しているWebページのIPを取得し、
ローカルのIPならばローカルDBサーバに接続するようにしてみました。


ここで一つハマったので備忘録です。

gethostname()の関数を使うと、「localhost」か「127.0.0.1」かどちらかが
返ってくることを期待していたのですが、
返ってきた値は「MYNAME-no-MacBook-Air.local」でした。


むむむっ。どうしましょう?(^^;;


そこで、ホスト名をIPアドレスに変換して「192.168.」を含むローカルアドレスならば、
ローカルのDBに接続する形にしました。


これでまぁ、やりたいことは実現できました。


<?php
		// ホスト名からIPアドレスを取得
		$hostName = gethostname(); 
		$ip = gethostbyname($hostName);

		if (strstr($ip, '192.168.')) {
			// ローカルのDBの情報をセット
			$this->CONNECT_DB_HOST = "localhost";
			$this->DATABASE_NAME = "localDB";
		} else {
			// 本番のDBの情報をセット
			$this->CONNECT_DB_HOST = "honbanhost";
			$this->DATABASE_NAME = "honbanDB";
		}
		echo $this->CONNECT_DB_HOST."
" ; echo $this->DATABASE_NAME."
" ; ?>

もっとスマートに書ければいいのですが……(^^;;


PHPでWeb APIを作ってみた

2013.11.03 Sunday | by こも
Web APIを作りたいなぁという事例に突き当たりました。

Web APIの使い方に関してはググるとたくさん出てくるんですが、作り方については情報が少なくて困りました。
まぁでも、ただのXmlのテキスト出力ならば、なんとかできるかなぁと思ってやってみました。


今回はa値とb値の2つの入力値から和差積商を返す、シンプルなテスト用Web APIを作ってみました。

<?php
	// xml出力を指定
	header("Content-Type: text/xml");

	// 入力パラメータのチェック
	if(isset($_GET['a'])){
		$a = htmlspecialchars($_GET['a']);
		if(!is_numeric($a)){
			dispError("a が不正");
		}
	} else {
		dispError("a が未設定");
	}

	if(isset($_GET['b'])){
		$b = htmlspecialchars($_GET['b']);
		if(!is_numeric($b)){
			dispError("b が不正");
		}
	} else {
		dispError("b が未設定");
	}

	// 入力値から和差積商を計算
	$wa = $a + $b;
	$sa = $a - $b;
	$seki = $a * $b;
	if($b == 0){
		// ゼロ割はエラー
		$sho = "error";
	} else {
		$sho = $a / $b;
	}

	// 計算したものを出力
	echo "<?xml version='1.0' encoding='utf-8'?>";
	echo "<Result a='".$a."' b='".$b."'>";
	echo "<Wa>".$wa."</Wa>";
	echo "<Sa>".$sa."</Sa>";
	echo "<Seki>".$seki."</Seki>";
	echo "<Sho>".$sho."</Sho>";
	echo "</Result>";


	// エラーメッセージ関数
	function dispError($msg) {
		echo "<?xml version='1.0' encoding='utf-8'?>";
		echo "<Result>";
		echo "<Error>".$msg."</Error>";
		echo "</Result>";
		exit;
	}
?>

XMLで出力するというheader定義が重要なようです。
これがないと、html出力されてAPIとしては機能しない模様……。


動作確認のため、ローカル環境で次のようなパラメタで実行します。

http://localhost/testapi.php?a=100&b=20

[実行結果]

WebAPIテスト

すると思った通りの結果が返ってきました。

XML形式で出力されたら、あとはsimplexml_load_fileを使って普段通り解析して処理します。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>API Test</title>
</head>

<body>
<?php
	$url ="http://localhost/testapi.php?a=100&b=20";

	// APIをリクエスト
	error_reporting(0);
	try {
		$result = simplexml_load_file($url);
	} catch (Exception $e) {
		error_reporting(E_ALL);
		return(0);
	} 
	error_reporting(E_ALL);

	if(isset($result->Error)){ 
		// エラー表示
		echo $result->Error;
	} else {
		// 計算結果を表示
		if(isset($result->Wa)){ 
			echo "和:".$result->Wa."<br>¥n";
		}
		if(isset($result->Sa)){ 
			echo "差:".$result->Sa."<br>¥n";
		}
		if(isset($result->Seki)){ 
			echo "積:".$result->Seki."<br>¥n";
		}
		if(isset($result->Sho)){ 
			echo "商:".$result->Sho."<br>¥n";
		}
	}
?>

</body>
</html>

[実行結果]

和:120
差:80
積:2000
商:5

細かい処理などは端折っていますが、最低限必要な部分はざっくりこんな感じでしょうか。
なんとか使えそうな気がしてきました。


無知でした(^^;;

2013.11.03 Sunday | by こも
ネットのニュースでクロスサイトスクリプティングによるWebサイトのセキュリティが問題になっていました。

恥ずかしながら「なにそれ?」ってくらい無知だったので、慌てて調べました。



こちらのサイトが分かりやすくまとまっていましたので、参考にさせて戴きました。

ユーザが投稿したスクリプトが動くって怖いですよね(^^;;


パラメタの構文チェックなどをしていたので、今のところ実害のあるようなサイトは作っていなかったと思いますが、念のため$_GET$_POSTなどを総チェックしてhtmlspecialchars関数を噛ませて対応しました。


PHPは簡単に書けるのでWebプログラミングを始めるには手っ取り早いのですが、こういう問題を知らないでやると、自分のサイトが悪用されることにもなるんですね(^^;;

勉強になりました。

PHPの実行結果をhtmlファイルとして書き出す

2013.10.01 Tuesday | by こも
PHPの実行結果をhtmlファイルとして書き出す方法にトライしてみました。


何故こういうことをやろうかと思ったかというと、あるDBのデータを元に生成された数千のコンテンツページを持つWebサイトのリニューアルに際して、以下のこと考えました。

月々500円未満の共同型の安サーバを借りているので、PHPで動的に作るより静的なhtmlをサーバ上に置いた方が負荷が軽減される

htmlで書かれた既存の数千のコンテンツページに対して、今からPHPで置き換えると外部SEO対策をまたやり直さないといけない


なので、ローカル環境で動くPHPシステムを作って、PHPの実行結果をhtmlファイルを出力して、それをサーバにアップするという手法をとってみようかなぁと思いました。



以下はsample.phpの実行結果をoutputtest.htmlに書き出す方法です。


<?php
	$url = "./sample.php";

	$buff = file_get_contents($url);

	$fname = "outputtest.html";

	$fhandle = fopen( $fname, "w");
	fwrite( $fhandle, $buff);
	fclose( $fhandle );

	echo "<a href='".$fname."'>作ったファイルを開く</a>";
?>

一瞬、「おっ、うまくいった」と思ったのですが、作られたhtmlファイルをよくみると何かおかしいことに気が付きました。


実はこのコードではPHPファイルの中身をhtmlファイルとして書き出すだけで、PHPタグやPHPのソースコードまでそのままコピーされていました(^^;;

やりたいことは、PHPファイルの中身の出力ではなくて、PHPの実行結果の出力なので困りました。



どうやるか試行錯誤していたら、httpアクセスならうまく行きましたので、そちらの修正版のソースも残しておきます。


<?php
	$url ="http://localhost/sample.php";

	$buff = file_get_contents($url);

	$fname = "outputtest.html";

	$fhandle = fopen( $fname, "w");
	fwrite( $fhandle, $buff);
	fclose( $fhandle );

	echo "<a href='".$fname."'>作ったファイルを開く</a>";
?>


これで一応やりたいことはできました。
(上記の例ではxamppを使ったローカル環境(localhost)にsample.phpを置いています)


でも、よくよく考えてみると、こうやって数千のコンテンツページをリニューアルしたとして、修正ごとにいちいち全部のファイルをアップロードする手間が発生しますよね(^^;;

そう思うと、この方法はセオリーではなくって、いっそのこと全システムをPHPに置き換えた方がいいんじゃないかという気がしてきました(>_<)

Sponsored Link
Recommend
PHP 逆引きレシピ (PROGRAMMER'S RECiPE)
PHP 逆引きレシピ (PROGRAMMER'S RECiPE) (JUGEMレビュー »)
鈴木 憲治,安藤 建一,山田 直明,八木 照朗,山本 義之,河合 勝彦
Recommend
Recommend
Powered
無料ブログ作成サービス JUGEM