我遇到问题 SIMILAR 阻止表单数据重新发布,但不完全相同。这个问题已被多次回答。给出的建议,如标题重定向和会话,对我来说不起作用。他们是否因为我的错误实施而失败,缺乏解决这个问题的经验,或两者兼而有之,我不知道。
我有一个Intranet Web应用程序,在启动时,从不同的服务器中提取数据,对其进行转换,然后将其加载到应用程序本地的数据库中。如果用户刷新主页面,则会再次运行ETL脚本并复制数据。
如何防止ETL脚本重新运行?对于这个应用程序,没有理由刷新页面。我是否应该在该页面上完全防止刷新,如果可能的话?我可能忽略了一些简单的事情。所以,我愿意接受建议。
更新:
我得到了这个测试代码来处理index.php页面。所以,我将在此基础上制定解决方案。我会告诉你的。
session_start();
$_SESSION['views'] = 1; // store session data
echo "Pageviews = ". $_SESSION['views']; //retrieve data
答案 0 :(得分:2)
我已经为您概述了一个非常基本的示例,说明如何使用会话来确保每次访问(每个用户)只运行一次脚本。这里的关键点是,如果超过1个用户使用该系统,脚本仍会运行多次。
为了解决这个问题,我只需使用您的本地数据库来跟踪上次运行脚本的时间。因此,您可以在数据库中拥有一个日期时间列,以跟踪执行上次“运行”的时间。
上述方法会使用户数量无关,因为所有检查都将针对中央数据集(即您的数据库)执行。它也可能更健壮,因为它将独立于浏览器和用户。
无论如何这里是一个会话(每个用户)方法:
<?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...................................................
?>
如果我错过了您想要做的事情,或者您想要对任何事情做进一步解释,请告诉我?
答案 1 :(得分:0)
查看the POST/REDIRECT/GET pattern。 (免责声明,我是该文章的作者)