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

18年11月19日(Mon) 0時29分
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: 11569, today: 1, yesterday: 3
初版日時: 2006-11-17 (金) 21:37:48
最終更新: 2006-11-17 (金) 21:37:48 (JST) (4384d) by nao-pon
このページのTopへ
ログイン
ユーザ名:

パスワード:

オートログイン

Basic 認証 | SSLログイン

新規登録 | パスワード紛失



メインメニュー
UsersWiki メニュー
付箋メニュー
付箋メニュー 
付箋の編集
文字色: 背景色:
お名前:  線接続id:
 
ブックマーク
オンサイトブックマークは
ログインするとご利用になれます
[ログインする]
サイト内 Wiki
☆ 検索 ☆



高度な検索(サイト内)
FireFox検索プラグイン
オンライン状況
合計 60 人がオンライン中 :-)
(UsersWiki : 3 人)

登録ユーザ: 0 & ゲスト: 60

もっと...
サイト情報
管理人

nao-pon
 

登録ユーザ数: 4576


Web Services by Yahoo! JAPAN
楽天ウェブサービスセンター
Amazon.co.jpアソシエイト
現在ページのQRコード
現在ページのQRコード
[携帯対応]
参照元情報