我在page1.php中有一个表单,它都重定向到page3.php并且还在page2.php中触发了ajax帖子(没有成功函数),page2.php可能需要运行一个小时,但是用户没有不需要结果。我确实需要用户查看page2.php,但他可能会离开。
我需要在page2.php中使用这两个函数吗?或者只是其中之一?还是没有?我想确保page2.php中的脚本运行到最后。
page1.php中
<form id="form" action="page2.php" method="post">
<!--form input elements with names-->
</form>
<script>
$('#form').submit(function() {
$.post('page3.php', {
var1: $('input[name="name1"]').val(),
var2: $('input[name="name2"]').val(),
});
});
</script>
使page2.php
<?php
ignore_user_abort(true); // Allow user to navigate away
set_time_limit(0); // Allow script to run indefinitely
// a lot of code which will run for a while - between 3 minutes and an hour
?>
Page3.php
<html>
<!--some code here including links to go to page4.php-->
</html>
我问的部分是因为我认为不需要任何这些功能,但被告知要使用它们,但当我尝试使用它们时,尽管有die();
并且脚本停止,它仍然看起来处理某些东西而我害怕因为这个“无限期”它会在服务器上过多。
因为我不想添加不必要的负载。
答案 0 :(得分:0)
是的,你需要这两个功能才能达到目前的标准,我的建议是将其移出http协议。根据您的脚本实际完成的内容,如果它不需要客户端的进一步交互,最好在命令行中使用它。
使用理论是创建一个以所需间隔调用的cron脚本,然后它将访问page2.php将填充的队列。
如果有可用的队列,cron脚本将处理当前在page2.php上完成的信息。由于您的脚本运行了很长一段时间,我建议使用cron的锁定机制,请参阅php.net/flock以获取简单的文件系统锁定。如果文件锁定已经运行,请检查该文件。
这是一个简单的示例,您可以将其置于独立脚本中以通过cron进行处理:
$fp = fopen(DATA_PATH . '/locks/isLocked', 'w+');
if (!flock($fp, LOCK_EX | LOCK_NB)) { //locks the file
$logger->info('Already Running');
exit(0);
}
fwrite($fp, time()); //write our new time so we can inspect when it ran last if needed
try {
if (hasQueue()) { //checks to see if any jobs are waiting in mysql
run(); //process normally completed by page2.php
}
} catch (Exception $e) {
//something went wrong here could setup a log / email yourself etc..
}
flock($fp, LOCK_UN); //unlock the file