ふぁメモ

主に技術系のメモをしたいけどやっぱり適当日記。たまにPHPコード載ってるけどメモ書き程度のスクリプトなのでそのまま使っちゃダメ。

PHPで裏で作業させたまま強制遷移

時間のかかるメール送信プロセス動かしたあとignore_user_abort(true)でステータス画面に遷移、ってのをやろうとしているんだけどうまくいかず。

Locationヘッダ出そうとするとalready sentなエラーになる謎。
ob_cleanとかob_flashとか組み合わせてみたがダメだ。headers_sent(file,line)で調べようとしてもnullの0行とかになるし。

以前仕事で作ったサイトではどうやってたっけ?と探してみたら、

//META refreshは読み込み完了しないと動かないのでJavaScriptで

って自分でコメントつけてた。さすがに8年も前の試行錯誤は忘れているなあ…。

しかし遷移後の画面が処理終了まで開いてくれない。
どこで詰まっているのだ…とデバッグコードを大量に吐かせる。
DB接続で詰まってるのかとMDB2の設定を調べたりMySQLの設定を調べたり…。

しかしDB接続は関係なかったよ。

session_start()で詰まってた。
session_regenerate_id()は効果なし。
セッションは同じユーザーの場合は排他ロックかかるんだなあ。
セッション内容を別変数で保持するようにしてsession_write_close()で解決。
昔はセッション使ってなかったからなあ…。

//セッションを廃棄してブラウザ強制遷移
ignore_user_abort(true);
$html = <<<EOT
<html>
<head>
<script type="text/javascript"><!--
	setTimeout("top.location.href='/?act=showstatus';",100);
//--></script>
</head>
<body>
<a href="/?act=showstatus">click here</a>
</body>
</html>
EOT;

$html .= str_repeat(' ',1024);
ob_end_clean();
ob_start();
echo $html;
ob_end_flush();
ob_flush();
flush();
$_SESSION = array();
session_write_close();
...
...
...