我目前在mysql表的流式传输结果方面存在问题。该表有超过10,000,000行。和结构</ p>
ID,IndexField1,Data1
在IndexField1的ID和索引上使用Primaryindex。
在PHP中,我绑定了数据的流部分(大约7 Mio)来计算和验证某些部分。出于这个原因,我有一个回调,每个响应都会调用它。
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 Error:(0)”
我是否以错误的方式得到了错误原因?服务器或客户端上是否有可配置的限制可能会产生此错误?
我正在使用Mysql 5.17.19和PHP 7.0.29。
答案 0 :(得分:0)
$row === FALSE
中的异常将始终抛出,因为在获取所有行后,$row
将为false。
$stmt->errno
将返回0,因为(引自文档:http://php.net/manual/en/mysqli.errno.php)
返回上一个MySQL函数的错误号,如果没有错误则返回0(零)。