0

$_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 を生成しようとします

そして、ユーザーが特定の動作に気付き始めるまで、すべてが順調でした。

  1. スクリプトを使用して PDF を生成します
  2. SESSION がバックグラウンドで期限切れになるまで、しばらくブラウザをアイドル状態にしておきます。
  3. 次に、ブラウザーの名前を付けて保存機能を使用して 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を保存できるようにしたいと考えています。私の質問は「どのように」です。

どのように?私に何ができる?

4

1 に答える 1

0

pdfのことは確かにブラウザのバグのようです。ただし、GET を使用する必要があります。

post はアクションを実行することであり、ブラウザーはその要求を正しく再発行しません。あなたの説明から、pdfを表示してもアクションが実行されているようには見えません。

GET を使用する場合は、これらのパラメーターを使用してこのデータを取得することを意味します。ブラウザはそれに応じてそれを処理します。

アクションの結果である場合は、アクションとレポートを 2 つの要求に分割します。たとえば、結果の PDF レポートの表示をアクションの応答のリンクにします。たとえば、誰かをオンラインで購入するときに、このパターンを見ることができます。支払い POST リクエストは、GET を介して請求書へのリンクを提供します。

于 2015-03-13T22:03:17.377 に答える