hypweb.net
XOOPSマニア  最新情報のRSS(サイト全体)
[ 自宅サーバーWebRing |ID=54 前後5表示乱移動サイト一覧 ]

TOP » UsersWiki » nao-pon » blog » 2006-11-17

PHP で非同期通信 anchor.png

PHPでWebサーバー側で処理をするとき、更新に時間がかかる処理だと、POSTしてからページが表示されるまでのタイムラグが気になります。

ページ表示に直接関係のない処理であれば、バックグラウンドで実行させることができれば、よりスムーズなブラウジングができるので、以前からいろいろと方法を考えていました。

PukiWikiMod では、PHPが自身でもう一度Webサーバーにリクエストするという方法をとっていますが、これは、いまいち美しくないし、かっこ悪いです。

そもそも、ローカルからのアクセスを禁止している場合もあるので、何とかしたいと思っていました。

そこで、今開発中の xpWiki では、ブラウザとの接続を一旦切って、もう一度リダイレクトさせたあとも、PHP側では実行を続けるという方法を考えてみました。

実際のスクリプトコードは、次のような感じです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$_udp_file = $const['CACHE_DIR'].$this->encode($vars['page']).".udp";
if (file_exists($_udp_file)) {
	$_udp_mode = join('',file($_udp_file));
	unlink($_udp_file);
 
	// ブラウザとのコネクションが切れても実行し続ける
	ignore_user_abort(TRUE);
 
	// ブラウザにはリダイレクトを通知
	$base = preg_replace("#^(https?://[^/]+).*$#i","$1",$const['ROOT_URL']);
	$uri = $base.$_SERVER['REQUEST_URI'];
	while( ob_get_level() ) { ob_end_clean() ; }
	$out = "\r\n";
	header("Content-Length: ".strlen($out));
	header("Connection: close");
	header("Location: " . $uri);
	echo $out;
	flush();
 
	// ブラウザは再表示し、PHPは実行を継続
	sleep(5);
	$this->plain_db_write($vars['page'], $_udp_mode);
	exit();
}

これは、 xpWiki の実際のコードで、時間の掛かる検索用テキストデータベースの更新を、バックグラウンドで行わせています。

終了時のイベントが新しいプロセスでリアルタイムに拾えるわけではないので、非同期通信もどきですが、結構使えるのではないかと思っています。





トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 564, today: 1, yesterday: 0
初版日時: 2006-11-17 (金) 21:37:48
最終更新: 2006-11-17 (金) 21:37:48 (JST) (6331d) by nao-pon
このページのTopへ
メインメニュー
ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録
最近の更新
オンライン状況
149 人のユーザが現在オンラインです。 (7 人のユーザが UsersWiki を参照しています。)

登録ユーザ: 0
ゲスト: 149

もっと...
サイト情報