У меня сейчас проблема с потоковой передачей результатов из таблицы mysql.Эта таблица содержит более 10 000 000 строк.И структура
ID, IndexField1, Data1
С Primaryindex для ID и Index для IndexField1.
В PHP я привязан к потоковым частямДанные (около 7 млн.) для расчета и проверки некоторых частей.По этой причине у меня есть обратный вызов, который вызывается для каждого отдельного ответа.
public function streamForIndexedColumn(int $columnId, callable $callback){
$stmt = NULL;
$sql = "SELECT id, indexedField, data1 FROm myTable WHERE indexedField1 = ?;";
if (! ($stmt = $this->mysqlConn->prepare ( $sql ))) {
throw new Exception("ERROR");
}
try {
if (! $stmt->bind_param ( "i", $columnId)) {
throw new Exception( "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error );
}
$item = new Item ();
if (!$stmt->bind_result($item->id,$item->indexfield1,$item->data1)) {
throw new Exception( "Binding output parameters failed: (" . $stmt->errno . ") " . $stmt->error );
}
if (! $stmt->execute ()) {
throw new Exception("Execute failed: (" . $stmt->errno . ") " . $stmt->error );
}
$cnt = 0;
while ( $row = $stmt->fetch() ) {
$cnt++;
$callback($cnt, $item);
}
if ($row ===FALSE){
throw new Exception("MySQL Error: (" . $stmt->errno . ") " . $stmt->error );
} finally{
$stmt->close ();
}
}
Это иногда выполняется в течение нескольких часов.Иногда это работает, иногда это терпит неудачу с сообщением "Ошибка MySQL: (0)"
Я получаю причину ошибки неправильно?Существуют ли настраиваемые ограничения на сервере или клиенте, которые могут вызвать эту ошибку?
Я использую Mysql 5.17.19 и PHP 7.0.29.