PHP PDO select查询在大量记录上失败

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

我有一个PostgreSQL数据库,需要查询一个包含2000万行的表。然后我将结果集推送到csv中,最后推送到S3中。我已经编译了一个php脚本来实现这一点。当我将查询限制为600万行时,它会成功,但任何超过这一行的查询似乎都会失败。即使启用了所有错误检查和参数,也不会记录或显示错误消息。还将我的Centos实例的内存增加到了3GB,真的不走运。我的代码如下:

//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万,但在本地,它工作正常。