msphpsql: PHP hangs on PDOStatement::fetch for large SELECT query

.+Please check the FAQ (frequently-asked questions) first. If you have other questions or something to report, please address the following:

+## PHP Driver version or file name

  • pdo_sqlsrv and sqlsrv 5.8.1

+## SQL Server version

  • SQL server standard (64 bit) Version: 11.0.3128.0

+## Client operating system

  • Linux Debian 9 and Arch Linux

+## PHP version

  • 7.4.11

+## Microsoft ODBC Driver version

  • 5.8.1

+## Table schema +

+## Problem description

  • PHP will hangs once it get to a certain number of records depending of the query… usually in the several thousands range.

+## Expected behavior and actual behavior

  • The query complete instead of hanging at a specific record

+## Repro code or steps to reproduce

<?php

error_reporting(E_ALL);

try {
   $conn = new PDO('sqlsrv:Server=xxx.xxx.xxx.xxx;Database=Accpac', 'user', 'pass');

   $sql = 'SELECT FIELD1, FIELD2, FIELDX FROM TABLE';

   $stmt = $conn->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
   $stmt->execute();

   $number_row = 0;

   while ( $row = $stmt->fetch() ){

       $number_row++;

       if (($number_row % 1000) == 0) {
           echo $number_row . PHP_EOL;
       }
       if (($number_row > 48000)) {
           echo $number_row . PHP_EOL;
       }
   }

   echo "END";

   print $stmt->rowCount();

} catch ( PDOException $e ) {
   print $e->getMessage();
   die();
}

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 27 (11 by maintainers)

Most upvoted comments

I was meaning the clause ORDER BY either ASC or DESC. See below the complete schema. I will track down the exact rows once I get a chance.

Column Name # Type Length Scale Precision Not Null Identity Default Description
INVUNIQ 1 decimal 9 [NULL] 19 TRUE FALSE [NULL] [NULL]
LINENUM 2 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
AUDTDATE 3 decimal 5 [NULL] 9 TRUE FALSE [NULL] [NULL]
AUDTTIME 4 decimal 5 [NULL] 9 TRUE FALSE [NULL] [NULL]
AUDTUSER 5 char 8 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
AUDTORG 6 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
LINETYPE 7 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
ITEM 8 char 24 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
MISCCHARGE 9 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
DESC 10 char 60 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
ACCTSET 11 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
USERCOSTMD 12 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
PRICELIST 13 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
CATEGORY 14 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
LOCATION 15 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
PICKSEQ 16 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
EXPDATE 17 decimal 5 [NULL] 9 TRUE FALSE [NULL] [NULL]
STOCKITEM 18 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
QTYORDERED 19 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
QTYSHIPPED 20 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
QTYBACKORD 21 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
INVUNIT 22 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
UNITCONV 23 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
UNITPRICE 24 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRICEOVER 25 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
UNITCOST 26 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
MOSTREC 27 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
STDCOST 28 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
COST1 29 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
COST2 30 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
UNITPRCDEC 31 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
PRICEUNIT 32 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
PRIUNTPRC 33 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRIUNTCONV 34 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRIPERCENT 35 decimal 5 5 9 TRUE FALSE [NULL] [NULL]
PRIAMOUNT 36 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
BASEUNIT 37 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
PRIBASPRC 38 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRIBASCONV 39 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
COSTUNIT 40 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
COSUNTCST 41 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
COSUNTCONV 42 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
EXTICOST 43 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
EXTINVMISC 44 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
INVDISC 45 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
EXTOVER 46 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
UNITWEIGHT 47 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
EXTWEIGHT 48 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
TAUTH1 49 char 12 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
TAUTH2 50 char 12 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
TAUTH3 51 char 12 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
TAUTH4 52 char 12 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
TAUTH5 53 char 12 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
TCLASS1 54 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TCLASS2 55 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TCLASS3 56 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TCLASS4 57 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TCLASS5 58 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TINCLUDED1 59 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TINCLUDED2 60 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TINCLUDED3 61 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TINCLUDED4 62 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TINCLUDED5 63 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TBASE1 64 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TBASE2 65 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TBASE3 66 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TBASE4 67 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TBASE5 68 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TAMOUNT1 69 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TAMOUNT2 70 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TAMOUNT3 71 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TAMOUNT4 72 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TAMOUNT5 73 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
TRATE1 74 decimal 9 5 15 TRUE FALSE [NULL] [NULL]
TRATE2 75 decimal 9 5 15 TRUE FALSE [NULL] [NULL]
TRATE3 76 decimal 9 5 15 TRUE FALSE [NULL] [NULL]
TRATE4 77 decimal 9 5 15 TRUE FALSE [NULL] [NULL]
TRATE5 78 decimal 9 5 15 TRUE FALSE [NULL] [NULL]
DETAILNUM 79 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
COMMINST 81 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
GLNONSTKCR 82 char 45 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
AVGCOST 83 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
LASTCOST 84 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
SHINUMBER 85 char 22 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
SHIDTLNUM 86 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
SHIPTRACK 87 char 36 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
SHIPVIA 88 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
VIADESC 89 char 60 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
DISCPER 90 decimal 5 5 9 TRUE FALSE [NULL] [NULL]
ORDQTYORD 91 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDQTYBKOR 92 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDQTYCOMM 93 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDQTYTCOM 94 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDQTYSTD 95 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDUNIT 96 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
ORDUNITCON 97 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
MANITEMNO 98 char 24 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
CUSTITEMNO 99 char 24 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
QTYCOMMIT 100 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
QTYTRUECOM 101 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
ORDNUMBER 102 char 22 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
ORDDTLNUM 103 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
REFRESH 104 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
ORIGQTYSHP 105 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
VALUES 106 int 4 [NULL] 10 TRUE FALSE [NULL] [NULL]
DDTLTYPE 107 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
DDTLNO 108 char 6 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
BUILDQTY 109 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
BUILDUNIT 110 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
BLDUNTCONV 111 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
EPOSPROMID 112 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
TERMDISCBL 113 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
BASEWUNIT 114 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
WEIGHTUNIT 115 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
WEIGHTCONV 116 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRWGHTUNIT 117 char 10 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
PRWGHTCONV 118 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
PRIBASWCNV 119 decimal 9 6 19 TRUE FALSE [NULL] [NULL]
DEFUWEIGHT 120 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
DEFEXTWGHT 121 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
PRPRICEBY 122 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
NEEDPCHECK 123 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
CAPPROVEBY 124 char 8 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
HDRDISC 125 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
ITRAMOUNT1 126 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
ITRAMOUNT2 127 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
ITRAMOUNT3 128 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
ITRAMOUNT4 129 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
ITRAMOUNT5 130 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
COG 131 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
COSTED 132 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
JOBRELATED 133 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
CONTRACT 134 char 16 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
PROJECT 135 char 16 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
CCATEGORY 136 char 16 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
COSTCLASS 137 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
PROJSTYLE 138 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
PROJTYPE 139 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
REVREC 140 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
BILLTYPE 141 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
REVBILL 142 char 45 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
COGSWIP 143 char 45 [NULL] [NULL] TRUE FALSE [NULL] [NULL]
RTGAMOUNT 144 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGPERCENT 145 decimal 5 5 9 TRUE FALSE [NULL] [NULL]
RTGDAYS 146 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
RTGDATEDUE 147 decimal 5 [NULL] 9 TRUE FALSE [NULL] [NULL]
RTGDDTOVR 148 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
RTGAMTOVR 149 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
RTGTXBASE1 150 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXBASE2 151 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXBASE3 152 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXBASE4 153 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXBASE5 154 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXAMT1 155 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXAMT2 156 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXAMT3 157 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXAMT4 158 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
RTGTXAMT5 159 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
PRICEOPT 160 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
PAYMNTDIST 161 decimal 9 3 19 TRUE FALSE [NULL] [NULL]
SERIALQTY 162 int 4 [NULL] 10 TRUE FALSE [NULL] [NULL]
LOTQTY 163 decimal 9 4 19 TRUE FALSE [NULL] [NULL]
SLITEM 164 smallint 2 [NULL] 5 TRUE FALSE [NULL] [NULL]
COMPANYID 165 int 4 [NULL] 10 TRUE FALSE [NULL] [NULL]
OPPOID 166 int 4 [NULL] 10 TRUE FALSE [NULL] [NULL]

@yitam @v-chojas indeed I was able to fetch the complete result set by disabling MARS !!

Thank you very much for your help.

Should I close the ticket or let it open to further investigate the issue ?