ブラウザの中止ボタンを押した後も処理を実行させる方法 タイムアウト以外の停止
PHPはブラウザの読み込み中止ボタン(読み込み停止ボタン)をクリックしたり、閉じるボタンで閉じてしまうと処理が途中で止まります。
またブラウザとのネットワークが切れてしまったときにも止まります。
つまり出力処理を受ける相手がいなくなるまたは反応がなくなると、処理を中断します。
そこでブラウザを閉じたり、ネットワークが切れたときでも処理を続行させるには次のようにします。
ignore_user_abort(true);
ここで処理に時間がかかってしまったときでもタイムアウトしないようにするには、タイムアウトを無制限にします。
[参考記事] PHPタイムアウトの対処法
ignore_user_abort(true); set_time_limit(0);
ただしこの場合は無限ループにならないように注意します。
このignore_user_abort()は、php.iniのignore_user_abortに値を渡す関数です。
つまりphp.iniの設定でも可能で、ignore_user_abortはPHP_INI_ALLなので.htaccessなどでも設定可能です。
php.iniやhttpd.conf
ignore_user_abort "1"
.htaccess
php_value "ignore_user_abort" "1"
ignore_user_abortの値が『0』だったとき、つまりデフォルト状態だったとき、どのタイミングで処理が止まるかというと、標準出力を受ける相手(ブラウザ)が受けとらなかったとき(破棄されたとき)です。
ブラウザの閉じるボタン、中止ボタンを押したときではありません。
なぜなら閉じるボタン、中止ボタンを押したときにサーバに信号を送らないため、サーバ(PHP)側にはわからないからです。
標準出力を送ったタイミングに判断されるというのは、正確にはechoをしたときではありません。
PHPではネットワークI/O負荷を軽減させるため、一定の出力をまとめてブラウザなどに送信します。(バッファリング)
flush()などを実行すると、このタイミングを制御することができます。
またクライアントの接続が切断される動作はブラウザ(クライアント)にもよりますが次のようなものがあります。
(1)ネットワークが切れたとき
(2)ブラウザの閉じるボタンを押したとき
(3)ブラウザの中止ボタンを押したとき
(4)別のページに移動したとき
PHPによる出力が遅い場合・処理が長い場合、プロキシなどネットワークがタイムアウトし切断されることもあります。
ignore_user_abortを『1』にしていても、コマンドラインで実行していた場合はttyが消えると、標準出力をしたときに処理が止まります。
ブラウザなどとの接続状態を知る関数もあるので、ignore_user_abortを『1』にしていたときの接続状態での振る舞いを制御することができます。
(ignore_user_abortの値が『0』のときには意味がありません。)
クライアントとの接続が切れているかどうかを知るには、connection_aborted()の戻り値が『1』なら切れている、『0』ならそれ以外となります。
connection_aborted()はこの2つしかありませんが、connection_status()を使うと、より詳しく知ることができます。
connection_status()の戻り値
| 定数 | 値 | 状態 |
|---|---|---|
| CONNECTION_NORMAL | 0 | アクティブ |
| CONNECTION_ABORTED | 1 | リモートクライアントが接続を切った |
| CONNECTION_TIMEOUT | 2 | PHP 側の時間制限にかかった |
これを利用すると、ブラウザが閉じたときなどに処理を実行させるということもできます。
<?php
// ユーザによる中断を無視する
ignore_user_abort(true);
// タイムアウトしないようにする
set_time_limit(0);
// 無意味なループを繰り返す
// 他のページに移動したり、"中止"ボタンを押すまでループする
while(1)
{
// 出力が破棄されたときループを抜ける
if(connection_status() != CONNECTION_NORMAL){
break;
}
// 10 秒間停止
sleep(10);
echo str_pad('',1);
flush();
}
// ここで、ブラウザが閉じたときなどの処理を行います
スポンサーリンク
関連記事
- SELECTタグで色を選択する場合のサンプル
- POSTでアップロードできるファイルサイズの制限を変更する方法
- Zend Optimizerのインストール
- Zend Serverとは
- Live Commerceとは
- SSL(HTTPS)でファイルのダウンロードができない場合
- ファイルダウンロード時のファイル名が文字化けする対処法
- simplexml_load_file()、simplexml_load_string()でparser error : Input is not proper UTF-8, indicate encoding !
- Deprecatedエラーを消す方法 (php.iniや.htaccess)
- Cactiのインストール RRDToolを利用したサーバ監視ツール
- JISコードでstrlenの文字数が合わない(目視の文字数とstrlenの文字数が異なる)
- echoしても文字は表示されないのに、emptyがtrueにならない
- [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)
- == と === の違い(比較演算子)
- Firefox、Chromeなどで文字化けを防ぐ方法 ヘッダー情報に文字コードを指定
- CakePHP、Symfony、Zend Frameworkの比較
- HTMLファイルのエンコードを『内容から判別する』にしない方法
- SQL Buddy ブラウザベースのMySQL管理ツール
- Twitter APIを使用する (Twitterアプリケーション登録)
- Mantisのインストール
- Mantisのユーザー管理テーブル(mantis_user_table)
- create_functionでメソッドを使用する方法
- strtotimeでmonthを使用するときの注意点
- コマンドラインからpearを実行するとエラーが出る 環境変数PHP_PEAR_PHP_BINの設定
- PEARを更新する方法
- zend_mm_heap corrupted とは
- switch文とif文の違い
- fgetcsv関数を文字化け対応 setlocaleの文字コード指定
- Deprecatedの修正例(POSIX)
- Fatal error: Call to undefined function imagecreatefromjpeg() の対処法
- PHPをyumでインストールする
- php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolutionの対応
- fsockopenでSSLサーバに接続する
- PHPでPDFファイルを作成する FPDF FPDI TCPDF
- 『このインターネットのサイトを開くことができません。』と出て、ファイルをダウンロードできない
- 複雑なExcelファイルをプログラムで作成する方法
- Excelで保存したときのCSVファイルの仕様
- フォーム要素の属性名の『ドット( . )』は『アンダーバー( _ )』に変わります
- サブドメインにアンダーバーがあるとクッキーは使えない
- アンダーバーのあるドメインではセッションクッキーは使用できません
- NetBeans6のインストール(JavaだけでなくRuby、PHP、C/C++に対応した統合開発環境)
- memcachedを使用する(memcacheライブラリ)
- date.timezoneを設定するとPHPが早くなる
- PHPフレームワークの一覧
- mbstringエミュレータ
- Fatal error: Maximum execution time of 30 seconds exceededの対処法
- PHPのインストール
- 例外処理(Exception)
- Windows版PHPにPEARをインストールする
- PHPをコマンドラインから使用する方法
- 画像の保存やメール転送を制限する方法
- PHPの閉じタグは書いてはいけない
- $_SERVER['PHP_SELF']は危険?
- Net_UserAgent_Mobile 携帯判別PEARパッケージの使い方と注意点
- stdClassクラスとは
- ユーザーエージェントからのキャリア、世代判別
- クラスとオブジェクト
- str関数、preg関数、ereg関数の速度比較
- 配列値格納の構文と組み込み関数による速度比較
- 正規表現のパターン文字列に日本語文字を使うときの注意
- ダブルクオート/シングルクオート/ヒアドキュメント、echo/printの速度比較
- forとforeachの速度比較
- SJISじゃなくてSJIS-win、EUC-JPじゃなくてeucJP-winを使おう
- 文字列の一部を得る関数mb_substrとmb_strcutの違い
- mb_strlenやmb_strimwidthの注意点
- failed: No space left on device
- VGA端末用に出力画像を拡大縮小する方法
- VGA端末の画像表示対応
- SSL通信かどうか
- docomo端末でCSSを使うには
- yumで、より新しいパッケージをインストールする方法(CentOS)
- 住所や駅名などから緯度経度を取得する
- empty関数について
- $_REQUESTに入る値と、その優先順位
- mail関数やmb_send_mail関数でReturn-Pathを設定する方法
- 携帯サイトのmailtoを端末ごとに書き換える関数
- MySQLのソケットエラー
- EclipseでPHPプロジェクトにする方法
- Softbankの携帯で文字の色を白にするときは注意
- mailtoの使い方
- 携帯サイトでのmailtoの使い方
- mailto本文での改行 ドコモのN、Pで送信に失敗します
- 数字(0〜9)のみかどうかを調べる正しい方法
- PCからデコメールを送るときの仕様
- PHPのバージョン表記の隠蔽
- quoted-printable文字列の変換
- Mantisのメール文字化け
- Issue-Tracker [バグ追跡システム]
- phpBugTracker [バグ追跡システム]
- eGroupWare [バグ追跡システム]
- OpenTask [バグ追跡システム]
- <docomo>タグ、<au>タグ、<softbank>タグの使用例
- 動的ページを静的ページに偽装する方法
- 『サイトが移動しました』を出さない方法
- セッション固定攻撃(session fixation)
- Softbankで絵文字を表示させる
- 位置情報・GPS情報の取得方法
- サイトを公開するときの設定
- クッキー(cookie)について
- セッションの有効期間とか設定とか挙動とかを調べました
- 携帯電話端末の判別ライブラリ Net_UserAgent_Mobile
- 個体識別情報・UIDの取得方法
- OpenPNEのツッコミどころ
- magic_quotes_gpc = On の対策
- Windows版PHPのインストール
- Mantis(マンティス) バグ管理システム
- CakePHP
- Symfony(シンフォニー)
- EC-CUBE
- Zen Cart(ゼン・カート)
- OsCommerce
- OpenPNE
- PukiWiki
- MediaWiki
- Wordpress
- Nucleus
- Movable Type
- NetCommons(ネットコモンズ)
- Joomla(ジュームラ)
- Drupal(ドルーパル)
- XOOPS Cube
- Geeklog(ギークログ)
- UTF-8からSJISで文字化け
- ファイル操作
- Smarty
- 正規表現
- ちいたん
- Symfony
- サンプルコード
- EC-CUBE
- Zend Framework
- Ethna
- OpenPNE
- CakePHP
- WordPress
- XOOPS Cube
- Drupal(ドルーパル)
- FPDF 1.52 リファレンス
- Doctrine
- 講座
- Yii
- Live Commerce
スポンサーリンク






