ひろぺいんのブログ

岡山在住「ひろぺいん」の日々の生活記録と趣味のブログ。 愛車セレナの各種DIY情報やスーパーGTをはじめレース観戦、冬場はスノーボード、そして岡山近辺のおでかけ情報も。 テーマは定まってませんが(汗)よろしくです。

カテゴリ:インターネット > プログラム

PHPのプログラム内に重い処理を実行する部分がある場合、普通はその処理が終わるまでプログラムは先に進みまない。
ホームページの表示途中で重い処理がある場合、その処理を終わらせないと、ページは表示されない。

せめて途中まででも表示してくれればと思うが、まったくダメ。
固まっているかのように表示が変わらない。

まず、ホームページの軽い部分だけでも先に表示しておいて、重い部分は「Loading」などを表示ながらバックグラウンドで実行。実行できたら結果をHPに表示する。
これが、やりたいことである。


実際やり方はいくつかあると思われる。
だが、なるべくカンタンな方法で実現したい。

いろいろ調べたが結局この方法が一番カンタンだということで自分の中で落ち着いた。
ajaxの非同期処理を使ってバックグラウンドでphpを実行する方法である。


重いphpの処理とはいろいろあると思うが、カンタンにsleep(10);で代用する。

例えば、a.phpというプログラムがある。
<!--a.php-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	</head>
<body>
表示スタート
<?php
sleep(10);

print "10秒経過!!";
?>
</body>
</html>
「表示スタート」を出力し、10秒経過後、「10秒経過!」を出力するというもの。
このページにアクセスすると、ページは10秒経過しないと表示されない。


これをajaxを使って、先にページを表示し、10秒かかる処理はバックグラウンドで実行するようにしてみる。
上記でphpで処理している部分をfullwait.phpに切り出す。
<?php
//fullwait.php
sleep(10); print "10秒経過!!";
?>


このphpプログラムをajaxを使って呼び出して実行するようにしてみると、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<!--jquery.min.js読み込みは必須-->
		<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'>
</script> <script type="text/javascript"> $(function(){ $("#sample").load("./fullwait.php"); }) </script> </head> <body> 表示スタート <div id="sample" align="center"> <!--処理を実行中に表示する内容を記載--> <img src="ajax-loader.gif"alt="Now Loading..." /> <!--ローディング画像--> <p style="text-align:center;">Loading・・・</p> <!--ローディング表示--> </div> </body> </html>
 
これで、phpの重い処理はバックグラウンドで処理される。
このプログラムでは、処理結果が<div id="sample">の中に、バックグラウンドで処理中の際に表示される内容を記載しておき、fullwait.phpの処理が終わったら、fullwait.phpでの出力内容が<div id="sample">に置き換わって表示される。

これで、多少重たい処理も気にならなくなるし、ロード中が今風でよい感じ!!


関連)
デコメテンプレートをスマートフォン(アンドロイド)にダウンロードするPHP

    このエントリーをはてなブックマークに追加

メールを装飾するコンテンツの「デコメテンプレート」
どちらかというと日本だけのガラパゴス機能だけど、ガラケー時代はそれなりに使う人も多かったのでは。

だが、スマートフォンになってからは、メール以外のいろんな伝達手段がアプリやサービスで出てきたことでデコメテンプレート自体を使う機会が減っているような気もする。。


まぁ、利用されるかどうかはさておき、ドコモ・au・ソフトバンクが出しているアンドロイド系スマートフォンでは、キャリアメール用のアプリを使うことで、ガラケー時代のデコメテンプレートがそのまま使えるのである。
しかしながらガラケー時代を考えると、キャリアが無理矢理対応している感が否めず、使い勝手はめちゃくちゃ悪いし不親切なんだよね。


ただ今回は、デコメテンプレートのスマホでの使い方の解説ではなく、ホームページ上からガラケー時代のデコメテンプレート形式のデータをスマホにダウンロードさせる方法の話。


ちなみに、ガラケー向けに配信する場合は、ドコモとソフトバンクはaタグでダウンロード可能。
auはobjectタグでダウンロードさせることができる。

では、スマートフォンの場合はどうするか。
ガラケー同様、aタグでダウンロードさせようとするとどのキャリア向けのデータでもダウンロードに失敗する。

というわけで、まず、aタグのリンクでデコメテンプレートのファイルを指定するのではなく、phpのプログラムを指定する。
続いて、その呼び出されたphpで、次のような処理をする。
//PHPを使ってデコメテンプレートをスマートフォンにダウンロードさせる方法

$pass="/path/to/template/"; //使用するサーバ環境にあったパス指定 switch($CARRY){ case "docomo": //ドコモの場合 $file="docomo.dmt"; header('Content-Disposition: attachment; filename='.basename($file)); header("Content-type: image/dmt"); readfile($pass.$file); break; case "au": //auの場合 $file="kddi.khm"; header('Content-Disposition: attachment; filename='.basename($file)); header("Content-type: image/khm"); readfile($pass.$file); break; case "sb": //ソフトバンクの場合 $file="softbank.hmt"; header('Content-Disposition: attachment; filename='.basename($file)); header("Content-type: image/hmt"); readfile($pass.$file); break; }

いずれの携帯キャリアの場合も、処理の流れは同じで、指定するファイルと、httpヘッダーのContent-typeの指定が違うだけ。あとはreadfile()でデータを出力すれば、OK。

こうすれば、少なくとも標準ブラウザではダウンロード可能で、ダウンロードされたファイルは
/mnt/sdcard/download」というフォルダにダウンロードされる。
※アンドロイド2.3で確認。


ちなみに、iPhoneやiPadは対象外。iPhoneやiPadでは、メールアプリなどでテンプレートを使う方法が準備されてないから使うこと自体できないため。というか、このような形式のファイルはそもそもダウンロードさえできないと思われる。

※【追記:要注意】
どうやらこの方法でダウンロード出来ない場合があるようだ。具体的にはサムスン製GaraxyシリーズでOSバージョンが2.3.6のもの。
ちょっと気になったから調べてみたけどGaraxy搭載の標準ブラウザの不具合だと思うんだよね。
contenttypeのimage/dmtがダメっぽいが、何か他のブラウザアプリをインストールして試すとダウンロード出来るし、OSバージョンが2.3.3とか4.0だと標準ブラウザでも出来るぽい。
サイトのプログラムで根本対応出来ないから最悪だなー。

関連)
⇒phpの重たい処理をバックグラウンドで後読みさせるには


    このエントリーをはてなブックマークに追加

このページのトップヘ