sessionについての些細なこと
「続、コメントの編集機能session版」において、session機能を使ってコメントの編集、削除機能を作った時に、sessionに関して疑問に思ったことを少し。
セッション機能を使う時にPHPの場合は、通常まずsession_start()から始めます。
この関数を使った後は、セッション変数を作ったり使ったりできるようになるわけです。
そこでふと思ったのは、セッション変数等のデータのためにサーバに作られる一時ファイルはいつ、どのタイミングで作られるのだろうかと。
session_start()の時か、はたまた最初にセッション変数を作ったときか。
まぁ、これは自分のコンピュータにApacheでローカルサーバーを立てて、実際に試してみればわかる事です。
で、やってみるとsession_start()の時点で、サイズが0のファイルが作成されているのがわかりました。当然と言えば当然ですか。
しかし、そうなると少し気にかかることが。
コメントの編集、削除機能は、編集か削除のボタンを押してフォームをサブミットしたときに自らのファイルをリロードさせて、postで送信されたデータとセッションに作ったセッション変数のデータによって処理を続けさせるという具合にしました。
とりあえず編集、または削除ボタンを押した時は、その後、エラーや気が変わって途中でやめた時は別ページを呼び出すことで、また最後まで完了した時はその処理の一貫でセッション用一時ファイルは削除するようにしてあります。
主にコメントを受け付けるフォームを表示するのは、単一投稿ページ(テンプレートでいうとsingle.php)や固定ページだと思いますが、これらのページにはsession_start()が記述してあり、ということはページを開くだけでサイズ0の一時ファイルが作られることになります。
コメントの編集、削除のボタンを押さないとそれがゴミファイルとして溜まっていくという事になりますね。
一般的にはどのように処理してんだろうか。
そもそもリロードさせるやり方がまずいんだろうか。
と、思いつつ、サイズが0なのでそのままほっといて、ガベッジコレクタにお任せしておけばいいようにも思いますが、やりっぱなし、ほったらかしというのはどうにもすっきりしないのです。
そこで、少しでもゴミが減るようにとあれこれ考えて打った手を。
ひとつは、urlからページのIDを得て、そのIDからその投稿にコメントがあるかどうかを判断して、ない場合は不必要なsession_start()を起動しないということ。
単一投稿ページでデフォルトの状態だとurlに?p=28208のように投稿IDがついています。この状態であれば以下の式にてその投稿あてのコメントの数を得る事が出来ます。
<?php
$pageid=$wp_query->get('p');
$comcount=get_comments_number($pageid);
?>
固定ページ等の場合のurlには?page_id=26870のようにページIDが指定してあるので、この場合は、
<?php
$pageid=$wp_query->get('page_id');
$comcount=get_comments_number($pageid);
?>
で、得る事が出来ます。
urlにスラッグを指定してある場合、たとえばカスタム投稿を使用しているここの場合ですと?diys=comment-edit-use-sessionというのが付いています。
この場合は、そのスラッグからページIDを求める処理が必要となります。
<?php
$pageque=$wp_query->get('diys');
$pageid=get_page_by_path($pageque,OBJECT,'diys');
$comcount=get_comments_number($pageid->ID);
?>
3行目がスラッグから投稿IDを得る関数となりますが、投稿がカスタム投稿の場合は引数にてそのカスタム投稿名の指定が必要となります。この場合は"diys"がそれに当たります。
ちなみにget_page_by_path()関数は2番目の引数にARRAY_AまたはARRAY_Nを指定することで配列で結果を得る事も出来ます。
戻り値はget_page()関数と同じで以下の一覧の通りです。
[ID] => (integer)
[post_author] => (integer)
[post_date] => (YYYY-MM-DD HH:MM:SS)
[post_date_gmt] => (YYYY-MM-DD HH:MM:SS)
[post_content] => (all post content is in here)
[post_title] => (Post Title Here)
[post_excerpt] => (Post Excerpt)
[post_status] => (? | publish)
[comment_status] => (? | closed)
[ping_status] => (? | closed)
[post_password] => (blank if not specified)
[post_name] => (slug-is-here)
[to_ping] => (?)
[pinged] => (?)
[post_modified] => (YYYY-MM-DD HH:MM:SS)
[post_modified_gmt] => (YYYY-MM-DD HH:MM:SS)
[post_content_filtered] => (?)
[post_parent] => (integer)
[guid] => (a unique identifier that is not necessarily the URL to the Page)
[menu_order] => (integer)
[post_type] => (? | page)
[post_mime_type] => ()?)
[comment_count] => (integer)
[ancestors] => (object|array)
[filter] => (? | raw)
コメントの有無がわかればコメントが無い投稿に関しては無駄にセッション用の一時データを作成することは避けることができました。
やっかいなのはコメントが存在する場合に何もしなかった場合なのです。
とりあえず思いついたのはJavascriptのウィンドーを閉じるときのイベントonunloadを使ってXMLHTTPRequestでセッションデータを削除するphpファイルを起動させるというもの。
それなら、いつもウィンドーを閉じるときにこの処理をすればいいようにも思いますが、そうするとコメントの編集、削除のためにリロードするときにもセッションデータを失ってしまいます。
何もしなかったときだけを見分けるために編集処理をした場合は、それ用に用意したhidden属性のinput要素の値endをnextに書き換えて、元の値endのままの時だけ動くようにしました。
window.onunload=function(){
var tarstr=document.mainfrm.status.value;
if(tarstr=="end"){
var url="http://*****/seserase.php";
req=new XMLHttpRequest();
req.open("GET",url,true);
req.send(null);
}
}
formがname=mainfrm、input要素がname=statusです。
Javascript自体は上のように簡単なものです。
このJavascriptによって起動されるphpも簡単なものです。
<?php
session_start();
$_SESSION=array();
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time()-42000,'/');
}
session_destroy();
?>
ただ、やはりJavascriptを使用して処理しているのでJavascriptが使えない環境においては少しあとを濁してしまいます。
うーむ、ここまでか。
Post : 2012/11/22 22:02
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=28334