$_POST に依存する PDF 生成
PHP スクリプトを使用してブラウザーで PDF を生成します。PDF 生成スクリプトは、POST 経由で送信される変数に依存します。POST が空の場合、PDF を生成できず、「PDF を再生成する必要があります」という警告が表示されます。
特定の状況により、POST 配列が空になりました。つまり、PDF のページにいるときにブラウザーの [更新] ボタンをクリックすると、何らかの理由で POST データが再送信されず、再送信を求めるプロンプトも表示されず、空になり、スクリプトがそれを検出し、警告が発行されます。警告はPDF Must be Regenerated
、コードで POST 配列が空のときに入れたものです。
$_SESSION に依存する PDF 生成の回避策
したがって、私が行った回避策は、POST データを SESSION に保存し、POST が空のときに SESSION を使用することです。以下のように:
if (empty($_POST))
{
// try restore from session first
$_POST['product_count'] = $_SESSION['product_count'];
if (empty($_POST['product_count'])) // if we failed.. session is empty
{
print 'PDF Must be Regenerated';
exit();
}
}
else
{
//save POST into SESSION
$_SESSION['product_count'] = $_POST['product_count'];
}
ブラウザーの保存機能は、SESSION の有効期限が切れた後に PDF を生成しようとします
そして、ユーザーが特定の動作に気付き始めるまで、すべてが順調でした。
- スクリプトを使用して PDF を生成します
- SESSION がバックグラウンドで期限切れになるまで、しばらくブラウザをアイドル状態にしておきます。
- 次に、ブラウザーの名前を付けて保存機能を使用して PDF を保存します。
ブラウザーは、メモリから PDF を保存する代わりに (PDF はブラウザー内で引き続き表示されます)、弊社が使用するブラウザー (Mozilla) は、サーバーに要求を行い、PDF の新しいコピーを要求します。しかし...そうしている間、POSTは再送信されていないためPOSTは空であり、アイドリング段階でSESSIONが期限切れになったためSESSIONは空です。
これにより、破損した PDF が生成されます。PDF は、実際には単語を含む ASCII テキスト ファイルですPDF Must be Regenerated
。手遅れになるまで、ユーザーはそれに気づきません。
しかし、Mozilla はどうやらサーバーに呼び出しを行い、PHP スクリプトはユーザーのログイン資格情報テストに合格しますが、その間ずっと POST と SESSION が空であるため、PDF が破損します。
ログイン資格情報のチェックは SESSION に依存しません。正直なところ、問題を簡単に再現できないため、テストが容易ではないため、それが何に依存しているかはまだわかりません。
回避策は、SESSIONが期限切れになる前に、生成された直後にPDFを保存することですが、ユーザーは「常に正しい」ため、SESSIONが期限切れになった場合でもユーザーがPDFを保存できるようにしたいと考えています。私の質問は「どのように」です。
どのように?私に何ができる?