目前,我在mysql表的流结果方面遇到了问题。此表有超过10,000,000行。和结构
ID,IndexField1,Data1
ID上有Primaryindex,IndexField1上有索引。
在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。
发布于 2018-06-13 13:35:13
$row === FALSE中的异常将始终被抛出,因为在获取所有行之后,$row将为false。
$stmt->errno将返回0,因为(引用docs:http://php.net/manual/en/mysqli.errno.php)将返回上一个MySQL函数的错误号,如果没有发生错误,则返回0(零)。
https://stackoverflow.com/questions/50838482
复制相似问题