这是一个奇怪的,我真的需要帮助搞清楚!我们为所有网站使用CentOS VPS,如果这有所不同的话。我们的业务为企业制作自定义Web应用程序,有时这些应用程序在提交表单之前保持打开状态超过30分钟。
我们遇到的问题是,如果表格暂时打开(我不知道确切的时间,但它已经超过20分钟,我确定)当您提交表单时,它只会刷新页面并且不会发送任何数据等。点击刷新并不会要求您重新提交表单数据或类似的内容。
以下是表单的代码:
<form action="/workorder/edit/" method="post">
<div class="col-md-12 padded-sm">
<label>Notes:</label>
<textarea name="notes" class="form-control" required></textarea>
</div>
<div class="col-md-12 padded-sm">
<label>Choose Hourly Rate:</label><br>
<div class="radio radio-success">
<input type="radio" name="rate" value="standard" id="checkoutrate-standard">
<label for="checkoutrate-standard">Standard</label>
</div>
<div class="radio radio-success">
<input type="radio" name="rate" value="overtime before 8" id="checkoutrate-otbefore8">
<label for="checkoutrate-otbefore8">Overtime Before 8pm</label>
</div>
<div class="radio radio-success">
<input type="radio" name="rate" value="overtime after 8" id="checkoutrate-otafter8">
<label for="checkoutrate-otafter8">Overtime After 8pm</label>
</div>
</div>
<div class="col-md-12 padded-sm text-right">
<input type="submit" name="checkoutsubmit" class="btn btn-success" value="End Time">
</div>
</form>
这是在提交表单时运行的简单PHP代码:
$checkoutsubmit = $_POST['checkoutsubmit'];
if($checkoutsubmit):
$checkinid = val_db($_POST['checkinid']);
$notes = val_db($_POST['notes']);
$rate = val_db($_POST['rate']);
$sql = "UPDATE workorders_labor SET userid='$userid',endtime='$time',notes='$notes',rate='$rate' WHERE id='$checkinid'";
$db->query($sql) or die($db->error);
$_SESSION['success'] = "You have successfully checked out of the job.";
redirect("/workorders/edit/");
endif;
我99%确定代码没有问题,因为当您加载页面,填写表单并提交时,它可以正常工作。但是如果你加载页面,让它静置一段时间,然后填写该表单并提交它只是刷新页面。
我只能重复几次这个问题,但我的一位客户一直都有这个问题。
值得注意:
我看不到PHP的错误。没有数据库错误。 $_SESSION['success']
没有成功消息。看起来它看起来根本就没有发送数据。
我最近将这些客户从GoDaddy VPS转移到另一个VPS提供商。相同版本的PHP,相同版本的CentOS ......据我所知,所有的Apache设置都是一样的(但它可能不是我们不能而且我只是不寻找合适的人。)
如果页面在提交表单之前保持打开一段时间,也会发生这种情况。加载页面并在几分钟后提交表格没问题。让页面静置30分钟,刷新它然后填写表格并提交是好的。让页面静置30分钟然后填写表单而不做任何其他事情,它只是刷新页面。
有问题的客户正在使用iPad,我们已经能够在我们的Macbook上重现......这可能是Apple相关的问题吗?但似乎在Macbook上发生了Chrome或Safari。
更新
在开发者工具中Chrome浏览器的“网络”标签的评论中使用建议后,现在发生了什么:
您加载页面并获得200 OK状态。 让表格坐30分钟,然后提交表格。 获得302临时重定向状态&amp;自动返回200 OK状态的同一页面。
Chrome的“网络”标签基本上显示了这一点:
如果我不让表格暂停一段时间(在我的测试用例中约30分钟),则在初始加载时返回200,在提交表单时返回200,然后当表单完成处理并重定向时,它会给出200再次。
更新#2
根据评论中的建议,我在Chrome的开发者工具中复制了来自302响应的Curl请求,并从Postman发送了Curl请求。我尝试了三次 - 一次等待几分钟,一次等待30分钟,再一次等待30分钟,所有三次返回200 OK并发布数据。它似乎发送为Curl不返回302.
更新#3
虽然我没有修复这个问题,但我确实找到了一种方法来避免它发生,而我试图弄清楚根本原因是什么。这可能有助于诊断发生了什么。我认为它可能在服务器端,因为这与实际的PHP代码没有任何关系。
为了解决这个问题,我使用jQuery&#39; $.get(url,function(data){})
功能的页面只是拍摄到我称为session_keep_alive.php
的空白页面。我每隔5分钟就有一段时间来获取该页面。当它运行时问题永远不会发生在表格中(至少在测试3次/1.5小时后......如果我在提交表格前等待30分钟,我可以100%的时间重现问题)。
所以我只能假设它可能是服务器端的东西而不是PHP代码。就像服务器在会话已经持续30分钟左右时强制302一样。与上述解决方法相比,有关永久修复的任何想法?