PHP PDO select查询在大量记录上失败
我有一个PostgreSQL数据库,需要查询一个包含2000万行的表。然后我将结果集推送到csv中,最后推送到S3中。我已经编译了一个php脚本来实现这一点。当我将查询限制为600万行时,它会成功,但任何超过这一行的查询似乎都会失败。即使启用了所有错误检查和参数,也不会记录或显示错误消息。还将我的Centos实例的内存增加到了3GB,真的不走运。我的代码如下:PHP PDO select查询在大量记录上失败,php,postgresql,pdo,Php,Postgresql,Pdo,我有一个PostgreSQL数据库,需要查询一个包含2000万行的表。然后我将结果集推送到csv中,最后推送到S3中。我已经编译了一个php脚本来实现这一点。当我将查询限制为600万行时,它会成功,但任何超过这一行的查询似乎都会失败。即使启用了所有错误检查和参数,也不会记录或显示错误消息。还将我的Centos实例的内存增加到了3GB,真的不走运。我的代码如下: //connect to database $myPDO = new PDO('pgsql:host=127.0.0.1;port=54
//connect to database
$myPDO = new PDO('pgsql:host=127.0.0.1;port=5433;dbname=test', 'test', 'test');
$myPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
//time and memory usage variables
error_reporting(-1);
$time = microtime(TRUE);
$mem = memory_get_usage();
$stmt = $myPDO->prepare("SELECT * FROM table");
$stmt->execute();
$u = "export.csv";
$h = fopen($u, "w+");
$first = true;
//counter
$counter = 0;
//loop through all rows
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$counter++;
//export column header
if ($first) {
fputcsv($h, array_keys($row));
$first = false;
}
//export content
fputcsv($h, $row);
}
fclose($h);
require('AwsS3Upload.php');
//pdo error output
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
print_r(array('memory' => (memory_get_usage() - $mem) / (1024 * 1024), 'seconds' => microtime(TRUE) - $time));
更新-工作代码:
$myPDO = new PDO('pgsql:host=127.0.0.1;port=5433;dbname=test', 'test', 'test');
$myPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$myPDO->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$myPDO->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
//time and memory usage variables
error_reporting(-1);
$time = microtime(TRUE);
$mem = memory_get_usage();
for($i=0; $i<6; $i++){
$limit = 5000000;
$offset = $i * $limit;
$sql = 'SELECT * FROM table ORDER BY :order LIMIT :limit OFFSET :offset';
$stmt = $myPDO->prepare($sql);
$stmt->bindParam(':order', $order, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$u = "$i-export.csv";
$h = fopen($u, "w+");
$first = true;
//counter
$counter = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$counter++;
if ($first) {
fputcsv($h, array_keys($row));
$first = false;
}
fputcsv($h, $row);
}
fclose($h);
require('AwsS3Upload.php');
}
$myPDO=newpdo('pgsql:host=127.0.0.1;port=5433;dbname=test','test','test');
$myPDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$myPDO->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
$myPDO->setAttribute(PDO::ATTR_STRINGIFY_FETCHES,false);
//时间和内存使用变量
错误报告(-1);
$time=microtime(真);
$mem=内存获取使用率();
对于($i=0;$iprepare($sql);
$stmt->bindParam(':order',$order,PDO::PARAM_INT);
$stmt->bindParam(':limit',$limit,PDO::PARAM_INT);
$stmt->bindParam(':offset',$offset,PDO::PARAM_INT);
$stmt->execute();
$u=“$i-export.csv”;
$h=fopen($u,“w+”);
$first=true;
//柜台
$counter=0;
而($row=$stmt->fetch(PDO::fetch\U ASSOC)){
$counter++;
如果($第一){
fputcsv($h,数组_键($row));
$first=false;
}
fputcsv($h,$row);
}
fclose(小时);
要求('AwsS3Upload.php');
}
您必须将其分为更小的部分。类似如下:
for($i=0; $i<6; $i++){
$limit = 5000000;
$offset = $i * $limit;
$stmt = $myPDO->prepare("SELECT * FROM table ORDER BY `id` LIMIT $offset,$limit");
$stmt->execute();
// retrieve and write the records into file
}
for($i=0;$iprepare)('id`LIMIT$offset,$LIMIT'从表顺序中选择*);
$stmt->execute();
//检索记录并将其写入文件
}
thx看起来我们现在正朝着正确的方向前进。但现在我遇到了一个问题,我的id
列实际上是字符串类型,并收到一个错误:提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。我没有构建数据库,也无法控制列类型使其工作。将在上面发布工作代码。有人可以查看一下吗?嘿,我有大量数据,可能有数百万行。我正在尝试做的是循环数组。\u push()并将所有结果存储在一个变量中,但该变量在服务器上保存的记录不超过150万,但在本地,它工作正常。