Я пишу запрос, который выбирает много миллионов строк из таблицы и помещает их в текстовый файл.
$sQuery = " ( ";
$sQuery .= " SELECT number ";
$sQuery .= " INTO OUTFILE '".$outputfile_dnd."' ";
$sQuery .= " FIELDS TERMINATED BY ',' ";
$sQuery .= " LINES TERMINATED BY '\r\n' ";
$sQuery .= " FROM `".$database."`.$temp_table_name";
$sQuery .= " WHERE number IN (SELECT number FROM `db_dnd`.`dnd` )";
$sQuery .= ")";
Так как данных будет очень много, иногда это может занять несколько минут. Я хочу, чтобы пользователи знали, сколько еще времени будет выполняться (примерно). Я думаю сохранить кнопку во внешнем интерфейсе, когда пользователь нажимает кнопку, она должна показывать оставшееся время. Если невозможно узнать оставшееся время, Если я могу получить истекшее время и количество выбранных строк, то также хорошо. Любая помощь?
В худшем случае я думаю пойти с INSERT IN TO в другую таблицу, а затем положить в файл после того, как все вставлено.
Вы можете запустить ajax-запрос к php-скрипту, когда пользователь нажимает кнопку. Затем вы можете посчитать в Javascript время, пока вы не получите ответ из файла AJAX.
Чтобы узнать, сколько времени прошло в php, вы можете сделать следующее (предполагается, что вы используете mysqli):
$startTime = microtime();
$result = $mysqli->query($sQuery); #This is your function that runs the actual query
$endTime= microtime(true);
$timeTaken= $endTime- $startTime;
Чтобы получить количество строк (в mysqli), вы можете просто извлечь его из результирующего объекта.
$numRows = $result->num_rows;
Изменить для версии Js Ajax:
Так что если у вас есть Jquery на вашем веб-интерфейсе, будет работать следующее. Так что это включает в себя разделение всего вашего php, который запускается и отображает запрос в отдельный файл. Затем позвоните по URL-адресу этого файла ниже, и он покажет, сколько времени прошло до вывода указанного файла.
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script type="text/javascript">
$(document).ready(function(){
var startTime = new Date().getTime();
var requestInterval = window.setInterval(function() {
$("#content_area").html("Time Elapsed :"+(new Date().getTime() - startTime) / 1000+" Seconds");
}, 500);
jQuery.get('URLofYOURScriptHERE',
function(data, status, xhr) {
clearInterval(requestInterval)
var timeTaken = new Date().getTime() - startTime;
$("#content_area").html(data);
}
);
});
</script>
<body>
<div id="content_area">
</div>
</body>
Других решений пока нет …