0

フォームデータの再投稿を防ぐのと同様の問題がありますが、まったく同じではありません。その質問は何度も答えられています。ヘッダーのリダイレクトやセッションなど、与えられたアドバイスはうまくいきませんでした。実装が間違っていたのか、この問題を解決する経験がなかったのか、あるいはその両方が原因で失敗したのかはわかりません。

起動時に別のサーバーからデータを抽出して変換し、アプリケーションのローカル データベースにロードするイントラネット Web アプリがあります。ユーザーがメイン ページを更新すると、ETL スクリプトが再度実行され、データが複製されます。

ETL スクリプトが再実行されないようにするにはどうすればよいですか? このアプリの場合、ページを更新する必要はありません。可能であれば、そのページの更新を完全に防止する必要がありますか? 私はおそらく単純なものを見落としています。だから、私は提案を受け入れています。

アップデート:

このテスト コードを index.php ページで動作させることができました。ですから、それを基にソリューションを作成していきます。お知らせします。

session_start();
$_SESSION['views'] = 1; // store session data
echo "Pageviews = ". $_SESSION['views']; //retrieve data
4

2 に答える 2

2

セッションを使用して、スクリプトが1回の訪問(ユーザーごと)に1回だけ実行されるようにする方法の非常に基本的な例を概説しました。ここで重要な点は、複数のユーザーがシステムを使用している場合でも、スクリプトが複数回実行されることです。

これを回避するには、ローカルデータベースを使用して、スクリプトが最後に実行された日時を追跡します。したがって、最後の「実行」がいつ実行されたかを追跡する日時列をデータベースに含めることができます。

  1. したがって、PHPコードでは($ _SESSIONをチェックする代わりに)、データベースにクエリを実行して日時値を取得します。
  2. 最終実行日時を取得したら、現在の日時が許容される「更新時間」(たとえば24時間)を超えているかどうかを確認します。
  3. 時間が割り当てられた「更新時間」を過ぎた場合、たとえば25時間コードが実行され、日時がnow()に更新されます。
  4. 時間が割り当てられた時間内であれば、何も起こらず、dbの更新もスクリプトも実行されません。
  5. 3〜4を繰り返します。

上記の方法では、すべてのチェックが中央のデータセット(つまりデータベース)に対して実行されるため、ユーザーの数は関係ありません。また、ブラウザやユーザーに依存しないため、おそらくもう少し堅牢になります。

とにかくここにセッション(ユーザーごと)メソッドがあります:

<?php
/* 
 * Set PHP sessions to suit:
 * 
 * session.gc_maxlifetime is the number of seconds after which the data 
 * will be seen as garbage and cleaned up (session life) - 
 * 
 * Set to 86400 to in theory make the session last 24 hours - adjust this 
 * number to suit.
 * 
 * If this doesn't work you may have to try and adjust the php session lifetime
 * in either the php.ini file directly or htaccess file.
 * 
 */
ini_set('session.gc_maxlifetime',86400);
/* 
 * not strictly neccessary as this is default setting (but just to make sure)
 * This will keep the cookie alive (the link to your session) until the user
 * closes their browser. 
 * 
 * You could set it to > 86400 if you want that extra bit of certainity that 
 * the session will get renewed @ 24 hrs / the time you wanted to.
 */ 
ini_set('session.cookie_lifetime',0);
// Start PHP session
session_start(); 

// Check if the session is empty / exists (which it will be on first page entry)
if ( empty($_SESSION['hasVisited']) ) {

  /* 
   * Add your ETL script logic here:
   * 
   * This will only run on the first visit to the site
   */   
}

// Now set the session as the scripts have run once
$_SESSION['hasVisited'] = true;

// Continue on with your app...................................................

?>

あなたがやろうとしていたことを私が見逃した場合、または何かについてさらに説明が必要な場合は、私に知らせてください。

于 2012-06-13T22:01:00.983 に答える
0

POST/REDIRECT/GET パターンを調べます。(免責事項、私はその記事の著者です

于 2012-06-13T03:03:45.587 に答える