PHP MYSQL LOOP ЧЕРЕЗ БОЛЬШОЙ РЕЗУЛЬТАТ

Я нашел лучший способ, особенно потому, что я хотел, чтобы вывод был зарегистрирован, должен был использовать пакет «daemonize». Если вы находитесь в CentOS / Redhat, как показано ниже. Вероятно, для него есть и apt-пакет.

- name: yum install daemonize
  yum:
    name: daemonize
    state: latest

- name: run in background, log errors and standout to file
  shell:  daemonize -e /var/log/myprocess.log -o /var/log/myprocess.log  /opt/myscripts/myprocess.sh
-1
задан Sam 13 July 2018 в 19:32
поделиться

4 ответа

Вы должны использовать запрос INSERT с оператором SELECT, который выполняется намного быстрее. Пример:

INSERT INTO table (column1, column2)
SELECT column1, 
column2 
FROM table2

, где table2 - ваша таблица 0_suppliers.

2
ответ дан b4rt3kk 17 August 2018 в 12:11
поделиться
  • 1
    предполагая, что он выполняет это для всех поставщиков, ему нужно будет перебирать этот стол в какой-то момент. – NappingRabbit 13 July 2018 в 20:11
  • Использовать транзакции явно вместо того, чтобы полагаться на autocommit, чтобы уменьшить накладные расходы. Вы можете делать много операторов в транзакции. Но 12 000, вероятно, является верхним пределом того, что я уверен в работе в одной транзакции.
    mysqli_begin_transaction($daffff);
    $result= mysqli_query($daffff, "select * from 0_suppliers");
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
       //Several Inserts here
    }
    mysqli_commit($daffff);
    
  • Подготовьте инструкции INSERT перед циклом и просто выполните их повторно в цикле.
    $result= mysqli_query($daffff, "select * from 0_suppliers");
    
    $insert1 = mysqli_prepare($daffff, "INSERT INTO MyTable1 (col1, col2, col3) VALUES (?, ?, ?)");
    $insert2 = mysqli_prepare($daffff, "INSERT INTO MyTable2 (col1, col2, col3) VALUES (?, ?, ?)");
    
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
    
       mysqli_stmt_bind_param($insert1, "sss", $tran_pucha1we[0], $tran_pucha1we[1], $tran_pucha1we[2]);
       mysqli_stmt_execute($insert1);
    
       mysqli_stmt_bind_param($insert2, "sss", $tran_pucha1we[3], $tran_pucha1we[4], $tran_pucha1we[5]);
       mysqli_stmt_execute($insert2);
    
    }
    
  • Соберите ряд строк вашего запроса SELECT и используйте синтаксис вставки нескольких строк.
    INSERT INTO MyTable (col1, col2, col3) VALUES
      (?, ?, ?), (?, ?, ?), (?, ?, ?), ...
    

Вы можете комбинировать все описанные выше методы.

Вам также может понравиться, что вы можете изменить тайм-аут PHP. См. Этот вопрос: Как увеличить тайм-аут выполнения в php?

2
ответ дан Bill Karwin 17 August 2018 в 12:11
поделиться

Я рекомендую использовать limit и offset

MySQL Limit & amp; .

Здесь можно найти здесь .

0
ответ дан iStudLion 17 August 2018 в 12:11
поделиться

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

$howMany = queryExec("select count(*) from 0_suppliers") -> fetch_array()[0];
$current = 0;
// this is how many records to process per loop, if it times out still, make it smaller.   
$numToProcess = 100;

// this is what you really came for...  but be careful:
set_time_limit();

while($current <= $howMany){
    $result= mysqli_query($daffff, "select * from 0_suppliers limit $numToProcess, $current");
    while ($tran_pucha1we = mysqli_fetch_array($result)) {
       //Several Inserts here

       $current++;
    }
}

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

0
ответ дан NappingRabbit 17 August 2018 в 12:11
поделиться
Другие вопросы по тегам:

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