PHP MySQL курсор - PullRequest
       2

PHP MySQL курсор

3 голосов
/ 12 января 2011

Мне нужно создать курсор MySQL, чтобы отслеживать, какой номер строки у меня есть в данный момент, при обходе "огромной" (миллионы) таблицы.

пример таблицы базы данных:

CREATE TABLE  test (
id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
someText TEenter code hereXT NOT NULL
) ;

если в этой таблице 1000000 записей; Я выполняю следующий запрос:

select * from test where id >= 50;

И затем я обрабатываю данные по мере необходимости в моем php-скрипте (с ограничением в 1 минуту). Как отследить, до какой строки я прошел «тестовую» таблицу?

1 Ответ

0 голосов
/ 12 января 2011
// use a PHP session to store the id (could also use cookies...)
session_start();

// your 1 minute timeout
set_time_limit(60);

// query your results (may even put a known-out-of-reach limit on the
// query just to make sure you're not always pulling all the entries every
// reload (that would each up your timeout alone, depending)
$lastID = 0; // lowest possible ID value (e.g. MIN(id) )
if (session_is_registered('last_select_id'))
{
  $lastID =(int)$_SESSION['last_select_id'];
}
else
{
  session_register('last_select_id');
  $_SESSION['last_select_id'] = $lastID;
}
$dbResult = mysql_query("SELECT * FROM test WHERE id>{$lastID} ORDER BY id"/* LIMIT 10000 */);
if ($dbResult)
{
  while (($row = mysql_fetch_row($dbResult)) !== false)
  {
    // perform processing

    // mark as last processed (depending how many steps,
    // you may decide to move this from end to somewhere
    // else, just sh*t luck where your timeout occurs)
    $_SESSION['last_select_id'] = $row['id'];
  }
}

// it reached the end, save to assume we can remove the session variable
session_unregister('last_select_id');

Я могу исходить только из того, что вы мне говорите, хотя я чувствую, что это должно быть изначально задушено, а не просто ждать, пока PHP выплюнет тайм-аут.

РЕДАКТИРОВАТЬ Другой метод, расширяющий пакетную идею, - это ИЗМЕНИТЬ таблицу и добавить «обработанный» столбец, который вы можете обновить.

EDIT2 Кроме того, будьте осторожны.Я устанавливаю / сбрасываю значение сеанса.По этой причине это может привести к бесконечному циклу при обновлении, даже если вы получили успешную загрузку страницы вместо ошибки тайм-аута ($ lastID не увидит переменную сеанса, он начнется снова с 1 и продолжится черезопять же).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...