初めてデータが消えた日

消えたではなく、消してしまった、か。

仕事中Lineで緊急事態発生!と連絡があって
何があったのか聞いてみたら

娘が自分の手で間違えてデータを消してしまったらしい
「つづきから」の下にあった選択肢を興味本位でおしちゃったらしい。

子供の時にファミコン版のDQ3のセーブデータが消えちゃったり
弟の聖剣伝説2のデータを消しちゃったりとか
大人になってからテストサーバのファイル消そうとして本番の方のファイル消しちゃったりとかね
色々思い出して、ほんわかしたりしなかったり。

当然大泣きしたらしいけど、僕が帰宅する時には復活してました。
プレーンクッキーと生クリームが食べたいとのことだったので
お土産に買っておいたものを食べながらとりあえず一緒に初めから進めました。

頑張って先に進めれば前のところまで2,3日で追いつけそう。

これも大人になるために必要な痛みなのかもしれないなぁと思って
しんみりするかたわれなのでした。

ちなみに・・・・
switchはセーブデータが外部ファイルにバックアップできない仕様で
バックアップするならNintendo Switch Onine(有料)の中の
セーブデータお預かりサービスを使うしかなさそう

でも、これ、データ破損には有効でも
間違えて消して、しかも上書いちゃった、、、とかでも戻せるのかな?
データ破損する事例もあるみたいだし、
スマブラとかスプラトゥーンとかオンラインでやりたいし
レトロゲーもいろいろ遊べるみたいだし
(twitterでジョイメカファイトがどうこう言ってるの見た)
加入して検証してみようかな。

カテゴリー: 子供ネタ | コメントをどうぞ

ポン酢記念日

お鍋にして、ポン酢を持ち出したら

娘1「それなにー?」
かたわれ「ポン酢だよ、食べてみる?」

醤油に似た黒い液体にちょっと引いた表情を浮かべる娘1
でも、お皿に少し出してにおいをかぐと
娘1「おいしそうなにおい」
とのこと。
ポン酢のお酢の匂いで敬遠されるかと思ったのに意外な答えだった。

なので、一口食べさせてみたところ
めっちゃハマった!

娘2もおいしいと
いつもは野菜ばっかりで肉を食べないけど
今日はめっちゃ肉ばっかり食べた。

いつもゴマダレだったけど、今度からポン酢かな?それともまたゴマダレに戻るかな?

かたわれ家の食卓に新たな味が刻まれた日でした。

カテゴリー: 子供ネタ | コメントをどうぞ

長女、スマブラにハマる

年末についにNintendo switchを手に入れて、スマブラに初参戦したんですが

長女がめっちゃハマった。

アドベンチャーモードのオープニング見せて、やらせたらそのままどっぷり。

今のところ、
・必殺ワザのみで戦っている
・落ちそうなときはジャンプで復帰ができる
程度なので、通常攻撃とかガードとかジャンプ攻撃とか教えていけばいいのかな?
・・・といいつつ、僕がガード使えてない感じ。orz
だって僕だって初心者なんだもん。

とりあえず、基本的な操作をまとめてあるサイトを探してみたけど
全然見当たらない・・・・

自分で作るしかないか。 (´・ω・`)

プレー中に、
なんでカービーだけ生き残ったの?って聞かれたけど、
なんて答えればいいんだろ・・・?

カテゴリー: とびだせ どうぶつの森, 子供ネタ | コメントをどうぞ

星ドラの闘技場のツールを作ってみました

敵チームの種族を入力すると、耐性が見れる感じです

http://games.chiekoubou.com/hoshidora/arena/rivalryChecker

第二回バトリア杯、勝てるといいなぁ。。。。

カテゴリー: 星のドラゴンクエスト | コメントをどうぞ

金魚が死んでしまった話

3年前に娘と一緒に金魚すくいで掬った金魚が亡くなってしまった。

名前はシュシュ。

シュシュだけじゃなくて、今年は他にもなくなってしまった子がいる。

3年前に買ってきた アニキ

去年掬ってきた リボンちゃんと、スカーレット

今年掬った リボンちゃん2号と、まだ名前を付けてない白い琉金

みんな、ホルマリン漬けとかにして大事にとっておきたいくらいには
大事に思ってたし、可愛かった。無理だけど。

今年の夏が暑かったからなのか、引っ越して設置場所が変わったからなのか
死因が不明で特定できず。
水質は検査してみたけど問題なさそう。

天国とか信じてないんだけど
もしあるなら、そっちで楽しく過ごしてくれたらいいなと思った今日この頃。

カテゴリー: リアル日記 | コメントをどうぞ

星ドラのレイドは面白くないと思うので、どこがダメなのか考えてみた

・スタミナ一斉送信機能がない

最大200名のフレンドに手作業で一人ずつ送るボタンを押さなくてはならないのが非常につらい。
ジェムを使用してスタミナを回復する機能があるので、ジェムを使わせようという運用の魂胆が丸見え。
送るを押した後、タイムラグがあるのもうざいというのもあるが、これを改善するのはコスト的に難しいかもしれないが、一斉送信機能の追加はよっぽど特殊なつくりをしてないか限りは実現可能な範囲だと思う。

・サブキャラ3人使う意味が薄い

馬車って設定を出してきたのは面白いんだけど、交代しても控えメンバーのCTが溜まってないので何もできないで死ぬことが多い。
控え中にもCT溜まるとかだったらメンバー交代してスキル打ちまくるゲームにできそうなのに、と思ってる。
そっちの方が面白いんじゃないかなと。
または、控えメンバーは控えてる時HP回復するとか。

・なかまポイントがたまらない

まぁ、なかまポイントでジェムもらえなくなったのでこれは別にいいか。

・ボスが7種類いるので、装備を変えるのがめんどくさい

パスポートのロッカー機能使っても足りない。
ソロの方の大決戦イベとかも7体分必要だが、それは3人*3ロッカーで9体まで対応できるからまだ許容範囲。

・スタミナ2消費のクエ検索する時に、スタミナが1しかないと見つからない

スタミナが足りないのに気が付けない!

少なくとも僕は、レイド頑張ってるのは玉とか紋章とかジェムが欲しいからであって、レイドが面白いからじゃないからね。
モモコだって、30万で打ち止めって言ってたし!
それって、公式で苦行認定じゃないですか・・・!
それでも、第2回、第3回は微改善を続けてたけど、今回はなし(金のつむ笛のみ)。
こんなん続くなら、もうレイド廃止してほしい。

カテゴリー: 星のドラゴンクエスト | コメントをどうぞ

長旅の果てに

半年前から娘とマインクラフトをやっております。
PE版というか、BE版(統合版)です。
版の表記がいろいろ錯綜している感があるので、
早いとこ収束してくれないかなと思う今日このごろ。

それはさておき。

小さい頃冒険にあこがれる時期と言うのはあると思います。
少なくとも男の子だったら誰しもそうだと思うし
うちの娘もそういうの好きみたいなので、女の子もそうなのかも。

「もりの やかたに いきたい」
と言い出した娘。

マイクラの森の洋館、mansionの事ですな。
事前にこっそりクリエイティブでlocate打って場所を調べておいたけど
現在の拠点 1000,1600 辺り
洋館の場所 -40000、-10000 辺り

・・・めちゃくちゃ遠いw

ネザーゲートを使ってピンポイントで行くのが一番手っ取り早いのですが
オーバーワールドを行くことにしました。

村人から森林探検家の地図をもらって

途中、たくさん村を見つけたり、
遺跡をみつけたり
宝の地図を見つけたり
はぐれて迷子になったり
馬を手なずけてサドルをつって徒歩から馬に切り替えたり
馬を船に載せる関係で、娘も船の運転をしなくちゃいけなくなったり
そして、船もだいぶ上手に動かせるようになったり

そんなこんなで一週間かけて洋館に到着しました。

見つけたときのうれしさもひとしおで
なかなか寝付けず、ずっと興奮してしゃべってたとは嫁の談。

一つの目標に向けて数日かけて挑戦するのって初めてだったんじゃないかなと思うと
なんだか親としても感慨深いものがあります。

ピースなのになぜか館の中からヴィンディケーターらしき声が聞こえてきて
ビビってるのはご愛嬌ですがw

冒険の果てに少しだけ頼もしくなった娘の姿を見て
感動する親バカ、かたわれでした。

※まだ洋館の中には入ってません

カテゴリー: minecraft, 子供ネタ | コメントをどうぞ

apiサーバ、はじめの一歩【id_tokenの検証】

昨日はIDトークンを取得するところまでやりました。

今日はAPIサーバを立てて、そこに取得したIDトークンをbearer認証的に投げて
IDトークンの有効性をチェックして結果をJSONで返すAPIを作ろうと思います。

=== 今日の目標 ===

ブラウザからajaxでAPIサーバにベアラ認証でIDトークンを投げる
APIサーバでIDトークンを検証する

=== 構成 ===

Webアプリケーションサーバ
hoshidora.game.chiekoubou(ドメイン)
┣index.php <= LineLoginページへ遷移を促すページ。多分今回は出てこない ┗getToken.php <= LineLoginからリダイレクトされてくるページ。ここからAPIをJsでたたく。 APIサーバ api.hoshidora.game.chiekoubou(ドメイン) ┗checkIdToken.php(TokenId検証用APIのエンドポイント) とします。

1. IDトークンの検証機能を作ってみる

検証機能作成のために
まず、checkIdToken.php に さっき取得したTokenIDを固定で入力しときましょう。

checkIdToken.php

'invalit_grant',
			'error_description'=>'IDトークンの照合に失敗しました。',

		);}elseif($payload->iss == LINE_LOGIN_ISS){$err =array(
			'error'=>'invalit_grant',
			'error_description'=>'LINE LOGINで生成されたトークンではありません',

		);}elseif($payload->aud == LINE_LOGIN_CLIENT_ID){$err =array(
			'error'=>'invalit_grant',
			'error_description'=>'チャネルIDが一致しません',

		);}elseif($payload->nonce == $nonce){$err =array(
			'error'=>'invalit_grant',
			'error_description'=>'nonceが一致しません',

		);}elseif($payload->exp < time()){$err =array(
			'error'=>'invalit_grant',
			'error_description'=>'IDトークンの有効期限が切れています',
		);}
		
		if($err){return array('status'=>'error','data'=>$err);} 
		return array('status'=>'success','data'=>array('lineId'=>$payload->sub));

	}
	
	//検証機能テスト用にIdトークンを直打ち
	var $idToken = '【以前取得したIDトークン】';
	var $nonce = '【上記のIDトークンを取得するときに生成して一緒に投げたnonce】';

	// ベアラ認証ヘッダで飛んできたTokenIdをキャッチ
	//var $idToken = explode(' ',getallheaders()['Authorization'])[1];
	// パラメータで飛んできたnonceをキャッチ
	//var $nonce = $_GET['nonce'];

	
	print_r( certIdToken_line($idToken,$nonce));


status が success となれば検証が無事成功できました、という事です。

ここで大ハマりしたポイントが secret の照合でした。

トークンの二つ目までのピリオドまでをチャネルsecretを鍵としてsha256でハッシュ化したものと
base64urlでデコードしたIDトークンのsecret部が同じになるかどうか
という検証なんですが

まず base64url を普通base64_decode で複合させてたのが問題点その1でした。
よく読んだらちゃんと書いてあるじゃんね。ちゃんと見ろ、僕!

念のため base64urlについて説明しますが、
これは通常のbase64で使用される文字に少し手を加えられてるバージョンで
具体的にいうと + を – に / を _ に置き換えてあります。
なので phpの関数である base64_decode() で複合するなら
-を+ に _を/ に置換してからぶっ込んでやればいいという事ですね。

また、復号後のsecret部がバイナリ値だったので
bin2hexしてあげないといけないのもちょっとハマりましたね。

そこまでできれば後は大して難しくないと思います。
検証内容は ペイロードに含まれている
生成元の確認(この場合はLineLogin),チャネルID,IDトークンの有効期間の確認
それから、シグネチャ部の称号です。
シグネチャ部の称号はちょっとめんどくさいかもですね。
上の
if($signature != $signatureTest){ $err =array(
ここの部分ですね。
ソースの上から順に追って行けば何をやってるかはわかるはず!

実際にはIDトークンはbearer認証として扱い、GETパラメータでnonceを受け取る予定なので、
飛んできたそれらを受け取るための記述が
// ベアラ認証ヘッダで飛んできたTokenIdをキャッチ
//var $idToken = explode(‘ ‘,getallheaders()[‘Authorization’])[1];
// パラメータで飛んできたnonceをキャッチ
//var $nonce = $_GET[‘nonce’];ここね。

検証機能の検証が大丈夫そうなら直打ち部をコメントアウトして
こっちのコメントアウトを外してください。

2. ブラウザからajaxでベアラ認証でアクセスさせてみる

そんじゃブラウザからapiサーバにIDトークンを投げるぞ!

そもそもベアラ認証ってなんなのさ
というところから始まりました。

超簡単に言うと
http通信のヘッダに
Authorization: Bearer
とつけて、IdTokenをもって認証する仕組み、、、らしい。

まぁ、とりあえず、やってみようか!



	
	
	

通信結果

ものすごい大ハマりをしたので、先に書いておきます。

僕はFirefoxを使ってるのですが、どうやらこいつはヘッダにAuthorizationがあると
先に該当URLにOPTIONSでアクセスしてヘッダをもらい、
そこにCORS系のヘッダがあるかを確認してからGETなりPOSTなりするという仕様らしいです。

実装するときにslim3で実装していて
GETの対応は書いていたもののOPTIONSの対応がかけていなかったので
ブラウザさんにXSRFかもしれないからアクセスさせてやらん、と怒られてたわけですな。

また、OptionsとGetで同じ処理とかにしちゃうと、同じ処理を2回やるってことになっちゃうので
optionsはCORSヘッダ処理用と割り切って、何もしない様にしないといけないっぽいです。
slim3のルーティングだとその辺もそこそこ簡単にかけますね。

ただ、今回は検証用なので適当です。
とりあえずAPIサーバにリクエスト投げて検証した結果が返ってくればいいや、的な。

これで通信結果の下にlineIDが表示されればOKです。

上手くできたかしら?

今回はうまくいかないことが多くて非常に疲れました!

今日はこの辺で!

t

カテゴリー: php, SE備忘録, ソシャゲ支援ツール開発記 | コメントをどうぞ

やっぱりLineLoginを使って認証するように仕様変更だ!

http://localhost7/curl.phpやっぱりなんちゃってOAuth2を使うのはやめてLineLoginを使うことにしたよ!

なんだかんだでLineのグルがきっかけでこのツールの作成を思い立ったしね!
スマホ持っててLineやってない人はいないだろうし、やってないならフレポ集めとかしないだろうし!

そんなわけでLineLoginについて勉強だ!

OAuth2は認可の仕組み OAuth connectはOAuth2+認証の仕組み
そしてLineLoginはOAuth2とOAuth connectの両対応、という事らしい。
心配しないで!僕もよく分かってない!(心配

まずはLine側でデベロッパー登録だ!
https://developers.line.me/ja/docs/line-login/getting-started/
↑ここを見ながらやってみてください(適当
多分これより丁寧にはかけません。

Channelの作成時、作成後の設定について。
僕はアプリタイプは両方にチェックを付けました。
Webもネイティブも作る予定なので。

今日の目標

・LineLoginからIDトークンを取得する

前提

・Webアプリケーション用のサーバが準備済みで、ちゃんとWebでアクセスできる
  (僕の場合は http://hoshidora.game.chiekougou)
・LineLoginのチャンネルが作成済み
  (この記事の冒頭部分を参考にしてください)
・今回のディレクトリ構成は
 ┳index.php
 ┗getToken.php
2ファイルのみだ!単純だね!
え?slim3で構築するんじゃないの?って?
まぁ、今回は動作検証目的だし!

1. やりたいことを具体的に整理してみよう

一言でアクセストークンをとってくる、と言っても
じゃあ、具体的にどうすれば?
となると思うので、整理します。

1.http://hoshidora.games.chiekougou にアクセスがあった場合に

//2. 有効なIDトークンを持っていなければ

3. https://access.line.me/oauth2/v2.1/authorize にリダイレクトさせて

4. 3.の入力後に http://hoshidora.games.chiekougou/getToken.php にリダイレクトしてもらい

5. 4.のURIについてた認証コードをもとに webアプリケーションサーバが lineに IDトークンをもらい

6. とりあえずIDトークンを画面に表示できたら完成!

まぁ、6はどうかと思いますがw
あくまでテストなので。
さらにテストなので2の作業も飛ばします。

2. Lineログインのチャンネル設定をして、必要な情報の確認をするよ!

Channel基本設定から
ChannelID と ChannelSecret をコピーしてどっかに保存しておく。>後で使う
アプリタイプにWEB が入ってるのを確認する
アプリ設定から
Callback URL の設定を行う
(僕の場合は http://hoshidora.games.chiekoubou/getToken.php)

3. LineLoginへリダイレクトさせるURIを作成するよ!

https://developers.line.me/ja/docs/line-login/web/integrate-line-login/
↑とりあえずマニュアルはちゃんと読みましょうという事で
ここの「認可を要求する」を読みながら作業します。

ざっくりいうとこんな感じですよね

https://access.line.me/oauth2/v2.1/authorize
?response_type=code
&client_id=
&redirect_uri=
&state=
&nonce=
&scope=openid profile

は2.でメモしたcliend_idを
は2.で設定したcallbackURLを設定
については、XSRFに対するセキュリティ確保のため
ランダムな文字列を設定してリダイレクトで帰ってきた時に照合するために設定するみたい。
ここで説明してもわかりにくいので、実際にテストしながら説明しようかと!(あってるかどうかは謎
についてはリプレイアタックに対するセキュリティ確保のため
やっぱりランダムな文字列を設定するらしい。
これもテストの中で僕の知ってる範囲で解説します。(あってるかどうかは謎

以上を踏まえてテスト用のリンクを作成するページを作るとこんな感じか

index.php

";
	$redirectUri="";
	$state=sha1(md5(uniqid(openssl_random_pseudo_bytes(256), true)));
	$nonce=sha1(md5(uniqid(openssl_random_pseudo_bytes(256), true)));
	$_SESSION['state']=$state;
	$_SESSION['nonce']=$nonce;
	
	$url = "$lineLoginUrl".
		"?response_type=code".
		"&client_id=$clientId".
		"&redirect_uri=$redirectUri".
		"&state=$state".
		"&nonce=$nonce".
		"&scope=openid profile";
?>


	login test [link]

	LineLogin

↑の login test をクリックするとLineLoginの画面に飛んで、
ID,Passを入れると /getToken.phpにリダイレクトされて戻ってくると思う。
でも、またgetToken.phpは作ってないからNotfoundとかになるかな?
まぁ、アドレスバーになんか出てくればここまでは十分成功と言えると思います。

4. 認可コードからIDトークンを取得だ!

3.でもらったのは認可コードであって、アクセストークンとかIDトークンではないので注意が必要だ!
認可コードを使ってIDトークンをゲットするぞ!

getToken.php

';
	$clientId='';
	$clientSecret='';

	$p = $_GET;

	$data=[
		'grant_type'=>'authorization_code',
		'code'=>$p['code'],
		'redirect_uri'=>$redirectUrl,
		'client_id'=>$clientId,
		'client_secret'=>$clientSecret,
	];
	$data = http_build_query($data, "", "&");

	$header = array(
			"Content-Type: application/x-www-form-urlencoded",
			"Content-Length: ".strlen($data),
	);
	
	$curlOpt=array(
		CURLOPT_URL => $url,
		CURLOPT_RETURNTRANSFER => true,  //結果を文字列で受け取る
		CURLOPT_HTTPHEADER => $header ,
		CURLOPT_POST => 1,
		CURLOPT_POSTFIELDS => $data,
	);
	
	$ch = curl_init();
	curl_setopt_array($ch, $curlOpt);
	
	
//	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書検証をスキップ
//	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // サーバ証明書検証をスキップ
	
	//DEBUG
	//curl_setopt($ch, CURLOPT_HEADER, true);
	//curl_setopt($ch, CURLOPT_VERBOSE, true);

	$rs= curl_exec($ch);
	$info = curl_getinfo($ch);
	$errno = curl_errno($ch);
	$error = curl_error($ch);

	curl_close($ch);

	print "info:
"; print_r($info); print "
"; if($errno){ print("errorNo:$errno.
$error"); }else{ $rs = json_decode($rs); print "response:
"; print_r($rs); } ?>

errorNo:~
って出てきてたら、curlでの接続が失敗してます。
サーバ証明書検証をスキップしたらうまくいくかもだけど、テストの時だけにしてね!

response:~
って出てきたら、通信自体は成功した感じです。
その中でerrorが出てれば値の設定が何かおかしいかったりするので、
何で怒られてるのかをじっくり考えましょう。
responseに id_tokenとかaccess_tokenとかが含まれてれば、取得に成功してます。
あとは煮るなり焼くなり好きにしましょう。

僕は疲れたのでいったん冷蔵庫に入れて寝ようかと思います。

今日はこの辺で!

カテゴリー: SE備忘録, ソシャゲ支援ツール開発記 | コメントをどうぞ

php5とphp7を同居させた上でホスト名で使い分ける

どーせ今から新しいことをやるなら php7を使いたいよね
でも、今までのプロジェクトはphp5で動かし続けなくちゃいけないんだ。
どうしよう!助けてググえもーん!!!

助けを求めても php5と7を同じ環境で動かすという事例は見つからず
見つかったのは4と5を同じ環境で動かすとか 4.4と5.2と5.3を同時に動かすとかいう記事のみ。

そのあたりの記事を参考に頑張ってみる。
ぼくだけの力で、問題を解決できないと、ググえもんが安心して帰れないんだ!

=== 現在の状況 ===

かなり昔にxamppを導入した
Apache2.4.17 導入済み
php5.6.23 導入済み
ブラウザからlocalhostでphpinfo()とか見れる

=== 今日の目標 ===
同じPC上で基本的にはphp5で動くけど
特定のホスト名の場合はphp7で動く、とかにしたい。

1. まずphp7のダウンロードだ

今現在での最新バージョンは7.2っぽいのでそれを。
Apache2系なので thread safe な方ね。(Apache1の場合はnonThreadSafeじゃないとダメみたい)
また、32bit版と64bit版があってPCは64ビットだから迷わず64を落としたんだけど
apacheが32ビットじゃないとダメ、って怒られた。
これは怒られてから違う奴を落としてもいいのかもしれない。

2. 解凍して格納だ

適当な場所に回答して適当な場所に持ってくよ
僕はxamppを使ってるので
c:\xampp 直下に配置して
さらにフォルダ名が長いので php72 に改名した。

3. 何かあった時のためにconfをバックアップだ

c:\xampp\apache\conf をコピーして conf_ って作ったよ。
conf_bkでもconf_bakでもいいけど、作業が終わったらちゃんと消すのよ?

4. まずは7だけ起動させてみよう

アパッチの設定ファイルはc:\xampp\apache\conf の中にあります。
php5を呼び出すための設定はおそらくこの中にある、とにらんで
「php」で全ファイルの中身を検索するとそれっぽいファイルが見つかりました。

php5モジュールの読み込み

LoadFile "C:/xampp/php/php5ts.dll"
LoadFile "C:/xampp/php/libpq.dll"
LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

実際に起動するPHPファイルの指定


    PHPINIDir "C:/xampp/php"

と、こんな感じ。
下のIfModuleはphp5_moduleを呼んでいなければ呼ばれないので
上の方の3行だけコメントアウトして
4行追記

#LoadFile "C:/xampp/php/php5ts.dll"
#LoadFile "C:/xampp/php/libpq.dll"
#LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

LoadFile "C:/xampp/php72/php7ts.dll"
LoadFile "C:/xampp/php72/libpq.dll"
LoadModule php7_module "C:/xampp/php72/php7apache2_4.dll"
PHPINIDir "C:/xampp/php72"

そしてapacheの再起動をして
ブラウザからphpinfo()で PHPのバージョンを確認
(コマンドで確認しても意味がないので、念のため。)

バージョンが7.2.0RC3ってなってる!OK!
(ここで気が付いたけどRCって正式バージョンではないらしい。でも今更戻る気はない!)

5. もう少し掘り下げて考えてみよう。トライアンドエラーで。

7と5を切り替えるラインはどこにあるのか。
どこまでやったらエラーになって、どこまでならセーフなのか。
キーになるディレクティブは
それぞれのバージョンごとに
LoadFile~が2つ、LoadModule,PNPINDirが一つづつ。
思い切ってIfを外してくっつけてテストをするうちに

・LoadFile~は4つ全部書きっぱなしで問題ない
・LoadModuleは2回呼んでもいいが、先に読んだ方が優先される
・PHPINDirを二回呼ぶとエラーになるが、5のでも7のでも構わないようだ。

という事がわかった。

でも、PHPINDirについてはちょっと怖い気がするな。

6. いろいろ頑張ったけどダメだったのでもうちょっと勉強する

ここでの登場人物(ディレクティブ(httpd.confに書かれる文
LoadModule
 モジュールを読み込む
SetHandler
 ハンドルを指定するで囲んで特定のファイルとハンドルを紐づける
 上書きされるので、後にあるほうが優先
FileMatch
 正規表現でディレクティブを実行したいファイルを指定できる

・ハンドルって何?
あるファイルを特定の処理に紐づけをする役目を持っている
たとえば


    SetHandler application/x-httpd-php

だったら ファイル名が .php で終わるものは
application/x-httpd-php が処理できる人が処理してね
という設定になる。
この場合は application/x-httpd-php がハンドル名?タイプ?って呼ぶらしい。

・そしたらハンドルタイプとモジュールを紐づけは?
なんかモジュールに書いてあるっぽい。
モジュールを無理やりテキストエディタで開くとバイナリ的なものの中に

php5apache2_4.dll
Authorization application/x-httpd-php application/x-httpd-php-source

php7apache2_4.dll
Authorization application/x-httpd-php application/x-httpd-php-source php7-script text/html

と書いてあるところが見つかりました。
という事は LoadModuleした時に、
Module自身が「あ、僕はコレとコレ担当しますわ」と
自己申告する方式じゃないかと推測できるという事ですね。

ただ、php7には php7-script と自分が7であることを宣言するところがありますが
5の方にはありません。しかも二つとも7と被ってます。

両方宣言したときにどちらが優先されるかについては
最初にLoadModuleした方が優先される
という事が 5. の実験でわかっています。

7. さあやってみよう

まずポイントを整理します。
・最初にLoadFileを4つ全部呼ぶ
・次にLoadModuleを 5->7 の順番で呼ぶ
・SetHandler で 全体のphpファイルと php5を紐づける
・PHPINIDirはとりあえず削除する(次の章でやる)
・php7を使用したいVirtualHostのVirtualHostディレクティブにSetHandlerで php7-script を紐づける
※3工程目のphp5用のSetHandlerよりも後に記載しないとダメ
・apache再起動して確認

ファイルの読み込み順番も重要なので確認します。
これはあくまで僕の環境下の話なので、え?俺の違うんだけど!って言う人は
がんばってそれっぽくうまいことやってください。

httpd.confを読む
httpd.conf中に Include conf/extra/httpd-vhosts.conf があるのでそれを読みに行く
httpd.conf中に Include conf/extra/httpd-xampp.conf があるのでそれを読みに行く
httpd.confを最後まで読み切る

ここまで確認できたらファイルの編集をします

httpd.conf

LoadFile "C:/xampp/php/php5ts.dll"
LoadFile "C:/xampp/php/libpq.dll"
LoadFile "C:/xampp/php72/php7ts.dll"
LoadFile "C:/xampp/php72/libpq.dll"

LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"
LoadModule php7_module "C:/xampp/php72/php7apache2_4.dll"

#↓コメントアウト
#PHPINIDir "C:/xampp/php"

====
extra/httpd-vhosts.conf


    DocumentRoot "C:/vhosts/localhost7"
    ServerName localhost7
    
        SetHandler php7-script
    


extra/httpd-xampp.conf
※下のような行を削除またはコメントアウト
※テストでphp7系のものも書いてたらそれも除去

#LoadFile "C:/xampp/php/php5ts.dll"
#LoadFile "C:/xampp/php/libpq.dll"
#LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

#PHPINIDir "C:/xampp/php"

で、apache再起動して ブラウザからそれぞれのphpinfo()を確認!
やった!できてる!

8. php.iniを使い分ける

ここが今回の最ハマりポイントでした。

はまった原因は php本家の日本語マニュアルに抜けがあった という事です。
teratailさんに助けてもらいました。マジ感謝です。

マニュアルをざっくりした感じでまとめると
phpのバージョンごとにphp.iniの場所を指定できるよ!
Windows版ではレジストリで指定できるよ!
レジストリキーは
HKEY_LOCAL_MACHINE\SOFTWARE\PHP\[x[.y[.z]]]
で IniFilePath というエントリを作って、ディレクトリを指定してね
ただし、32bit版のapacheを64bit機で動かしてる場合は
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\[x[.y[.z]]]
だからね!

という事でした。
ただし、以下の部分が日本語マニュアルには書いてなかったんです。マジで。
が、むこうからするとなんで64で32の動かすんだよ、プンプンって感じなのかもしれません。

まぁ、ともかくレジストリキーを設定です。
僕の場合は
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\5.6
IniFilePath=C:\xampp\php
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\7.2
IniFilePath=C:\xampp\php72
って感じでした。

そして念のためOSの再起動をしてから、phpinfo()で 読んでいるphp.iniの場所を確認します。
Loaded Configuration File って項目ですね。
ここが位と下通りになってればOK
僕の場合は
5系の場合
C:\xampp\php\php.ini
7.2の場合
C:\xampp\php72\php.ini

これで今日からPHP7使いにグレードアップしました!
5と比べて処理時間が半分になったという事なので、楽しみですね!

カテゴリー: php, SE備忘録 | コメントをどうぞ