Получать большое количество реестров моего BD MySQL посредством PHP

Сердечный привет. Они будут видеть, у меня есть таблица "движения" приблизительно с 300 тысячами реестров, которые я хочу получить посредством PHP, но в момент реализации моей консультации, я не получаю результаты, если только он не поместит LIMIT.

Это мой код:

$query = "SELECT * FROM movimientos";
$sql = $this->conex->prepare($query);
$sql->execute();
$movimientos = $sql->fetchAll(PDO::FETCH_ASSOC);
if($sql->rowCount()>0) var_dump($movimientos);
else echo "No hay movimientos";

Деталь состоит в том, что, как уже я прокомментировал, не бросает мне результаты и даже не вводит "else", только остается в мишени мой рукописный шрифт.

НО, если я изменяю мой query в:

$query = "SELECT * FROM movimientos LIMIT 50000";

Тогда, если я получаю мои результаты.

Почему могло бы происходить это? Я исследовал немного, и я нашел немного связанный с переменными post_max_size и memory_limit, php.ini. Уже я увеличил эту стоимость, но я остаюсь, не получая результатов.

Я надеюсь, что они могут помогать мне, заранее спасибо. Привет!


-------------------Изданный (Решение)-----------------

Извините, у него не было время имения моего решения. Я предупреждаю, что я не знаю, если это самое рекомендуемое, uds они будут думать... Но вот тем, что в меня я функционировало.

Сначала, я был должен увеличивать переменную memory_limit на меня php.ini в 3MB (я это знаю, слишком много!... ничто рекомендуемое, но думайте мне, что q без этого не функционирует мой рукописный шрифт). Переменная set_time_limit (конфигурировавшая в 1 min) не представляла проблему, так как рукописный шрифт не умирал во время, а из-за размера памяти / буфера (или так я это понял); а следовательно у меня не было q увеличивать ее.

После, у меня было q, делать соответствие в моей консультации, получив результаты, благодаря помощи, предоставленной в lawebdelprogramador, они предложили мне сделать эти изменения.

У меня был мой рукописный шрифт формы, упомянутой ранее, и это осталось так:

function prueba(){
 $query = "SELECT * FROM tarjetas";
 $sql = $this->conex->query($query); //Se ejecuta directo la consulta, ya que no hay parámetros
 $sql->setFetchMode(PDO::FETCH_ASSOC);
 $movs = array(); //array auxiliar para guardar los movimientos
 while ($row = $sql->fetch()) { //recomerremos una a una las filas obtenidas
    array_push($movs, $row); //guardamos el elemento en el array auxiliar
    unset($row); //eliminamos la fila para evitar sobrecargar la memoria
 }
    return $movs;
 }

Он также как и остался мой рукописный шрифт, как я повторяю, он был то q в меня оно я функционировало. Я жду кого-то, что он смог подавать его, и смогите комментировать относительно этого. Привет и благодаря всем!

0
задан 19.01.2017, 20:05
3 ответа

извините, у него не было время имения моего решения. Я предупреждаю, что я не знаю, если это самое рекомендуемое, uds они будут думать... Но вот тем, что в меня я функционировало.

Сначала, я был должен увеличивать переменную memory_limit на меня php.ini в 3MB (я это знаю, слишком много!... ничто рекомендуемое, но думайте мне, что q без этого не функционирует мой рукописный шрифт) переменную set_time_limit (конфигурировавшая в 1 min) он не представлял проблему, так как рукописный шрифт не умирал во время, а из-за размера памяти / буфера (или так я это понял); а следовательно у меня не было q увеличивать ее.

После, у меня было q, делать соответствие в моей консультации, получив результаты, благодаря помощи, предоставленной в lawebdelprogramador, они предложили мне сделать эти изменения.

У меня был мой рукописный шрифт этой форма:

public function prueba(){
    $query = "SELECT * FROM tabla"; //tabla con +300mil registros
    $sql = $this->conex->prepare($query); //primer error xD
    $sql->execute();
    $movimientos = $sql->fetchAll(PDO::FETCH_ASSOC); //Justo aqui moría mi   script
    $res = ($sql->rowCount()>0)  ? $movimientos : false; 
    return $res;
   }

Он остался sig сформируй:

function prueba(){
            $query = "SELECT * FROM tarjetas";
            $sql = $this->conex->query($query); //Se ejecuta directo la consulta, ya que no hay parámetros
            $sql->setFetchMode(PDO::FETCH_ASSOC);
            $movs = array(); //array auxiliar para guardar los movimientos
            while ($row = $sql->fetch()) { //recomerremos una a una las filas obtenidas
                array_push($movs, $row); //guardamos el elemento en el array auxiliar
                unset($row); //eliminamos la fila para evitar sobrecargar la memoria
            }
            return $movs;
        }

Он также как и остался мой рукописный шрифт, как я повторяю, он был то q в меня оно я функционировало. Я жду кого-то, что он смог подавать его, и смогите комментировать относительно этого. Привет и благодаря всем!

0
ответ дан 03.12.2019, 18:38

Размести в начале рукописного шрифта set_time_limit(0) для того, чтобы тебе не задержалось время ejecuciГіn рукописного шрифта.

Другого, которое я могу рекомендовать тебе, состоит в том, чтобы ты не принес 300000, я регистрирую единственный раз но быть пролистанный для того, чтобы тебе была сделана консультация больше pequeГ±a.

оставил Тебе соединение ее explicaciГіn, у которого есть чиновник php: Идти официальный сайт php для mГ©todo (set_time_limit) .

1
ответ дан 24.11.2019, 12:09
  • 1
    Привет друг, спасибо за твой ответ / комментарий. Деталь состоит в том, что я нуждаюсь в том, чтобы получить реестры удара (по крайней мере я верю в это), потому что он не состоит в том, чтобы он захотел показать их, а они обработать один в один, и пролистанный в этом случае я не вижу, как он мог " activarse". Привет! – DevPHP 13.12.2016, 07:03

Я представляю, что это не то же самое делать один var_dump из 50000 реестров, что 300000, лучше - foreach на $movimientos и одном, начинаю, докуда, PHP убегает echos, хотя опоздает много рукописный шрифт, я схватил ты сможешь видеть, что, если тебя приносит консультация.

В конце концов решение, поскольку они прокомментировали ее тебе, состоит в том, чтобы делать пролистанного, это состоит, если, или если для этих случаев, нет другой.

-1
ответ дан 24.11.2019, 12:09
  • 1
    Привет друг @rodtux, спасибо за ответ. Рукописный шрифт умирает во время хотения получить все реестры. Он не прибывает, если он полюбил следующую lí nea. – DevPHP 14.12.2016, 01:33

Если ты не можешь конфигурировать server, ты можешь использовать пролистанного каждыми 50 тысячами реестров или которые желай.

Ты получаешь количество реестров:

function obtener_cantidad_registros()
{
    $query = "SELECT * FROM movimientos";
    $result = $sql->query($query);
    return = $result->num_rows;
}

Получать число страниц как количество реестров и размер страницы (количество реестров, которые ты покажешь из-за каждой страницы):

function obtener_numero_paginas($cantidad_registros, $tamaño_pagina)
{
  return ceil($cantidad_registros / $tamaño_pagina);
}

Получать число страницы, которая консультируется:

function obtener($numero_pagina)
{
  if(! $numero_pagina or ! is_numeric($numero_pagina))
  {
    return 1;
  }

  return $numero_pagina;
}

Эта просто стоившая функция, что число страницы было числовой стоимостью, а возврати 1, который равнялся бы тому, чтобы говорить, что это страница номер 1.

Потом ты вычисляешь начало реестров консультации как числа страницы и предела, который ты распределяешь (в этом случае я помещаю, что каждая страница напечатала 50000 реестров):

function calcular_inicio($numero_pagina, $tamaño_pagina)
{
  if($numero_pagina == 1)
  {
    $inicio = 0;
  }else{
    $inicio = ($numero_pagina- 1) * $tamaño_pagina;
  }

  return $inicio;
}

Например, если он находится на странице 1, query будь должен делать пределом от 0 до 50000, если ты находишься на странице 2, предела должно быть от 50000 до 100000.

Сейчас получать консультацию:

function obtener_consulta($mysql, $inicio, $tamaño_pagina){
  $query = "SELECT * FROM movimientos LIMIT $inicio, $tamaño_pagina";
  return $mysql->query($query);
} 

И в конце концов получать ссылки для страниц:

function imprimir_paginacion($pagina, $tamaño_pagina)
{
 for($i = 0; $i <= $tamaño_pagina; $i++)
 {
   $i == $pagina ? print($pagina) : print('<a href="'.$url.'?pagina='.$i.'">'.$i.'</a>  ');
 }
}

Чтобы это скроллировать, это так:

$total_registros = obtener_cantidad_registros();

$tamaño_pagina = 50000;
$total_paginas = obtener_numero_paginas($total_registros, $total_registros);


$pagina = isset($_GET['pagina']) ? $_GET['pagina'] : 0;
$pagina_actual = obtener($pagina);

$inicio = calcular_inicio($pagina_actual, $tamaño_pagina);

$result = obtener_consulta($mysql, $inicio, $tamaño_pagina);

while($row = $result->fetch_array(MYSQLI_NUM))
{
   // Imprimes registros obtenidos de la consulta
}

imprimir_paginacion($pagina_actual , $tamaño_pagina);

Заметь: я основался на этой статье.

0
ответ дан 24.11.2019, 12:09
  • 1
    Привет друг, спасибо за ответ. Это немного различный подход, дело не в том, что он захотел принести реестры, чтобы показывать их из-за pá ginas, а я нуждаюсь в том, чтобы обработать их, чтобы потом хранить их в другой таблице. Таким же образом iré тестируя пролистанного, хотя я даже не даю себе хорошо идею пролистанного без одной " acció n" что это включил, а в automá костариканский. Спасибо, привет! – DevPHP 13.12.2016, 07:01

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

1. - Добавлять колонну в твоей таблице (executed TINYINT 1 UNSIGNED)

2. - Создавать рукописный шрифт tarea_programada.php

<?php

$query = "SELECT * FROM movimientos WHERE executed = 0 LIMIT 50000";
$sql = $this->conex->prepare($query);
$sql->execute();
$movimientos = $sql->fetchAll(PDO::FETCH_ASSOC);
$ids_procesados = "";

for($i=0;$i<=count($movimientos)-1;$i++){
    //Ejecutar algun proceso personalizado
    $movimientos[$i]["test"] = $movimientos[$i]["test"] * 1;

    //Primary key
    $ids_procesados.=$movimientos[$i]["id"].",";
}

if (!empty($ids_procesados)){
    $ids_procesados = preg_replace(",$", "", $ids_procesados);
    $query_update = "UPDATE movimientos SET executed = 1 WHERE id IN(".$ids_procesados.")";
    $sql_update = $this->conex->prepare($query_update);
    $sql_update->execute();
}


?>

Главным образом то, что мы делаем с этим рукописным шрифтом, состоит в том, чтобы обрабатывать 50.000 реестров в раз ища реестры, которые не были бы обработаны, и закончившись мы помечаем их как обвиняемые. Ты был бы должен тестировать твой рукописный шрифт и видеть, которые являются пределами, с которыми ты обрезаешь работать. Ты был бы должен конфигурировать CRON / задание, запрограммированное на твоем сервере для того, чтобы он выполнил этот рукописный шрифт каждые X минут.

Метод, чтобы обеспечивать себе тебя в том, что твой рукописный шрифт не остался работая в background, и что произвелся overlap данных, мог бы состоять в том, чтобы создавать файл на сервере, начав обрабатывать часть реестров и удалять это, закончившись. Тогда, в начале твоего рукописного шрифта ты проверил бы сначала, что этот файл не был создан, чтобы выполнять процесс.

1
ответ дан 03.12.2019, 18:38

Теги

Похожие вопросы