【问题标题】:PHP Script Stopped Halfway?PHP 脚本中途停止?
【发布时间】:2017-01-15 18:09:44
【问题描述】:

我执行了一个 PHP 脚本 (第 1 部分)从 MySQL 中提取了一组 GET 参数和 API 身份验证密钥。 (第 2 部分)为 API 构建 多个 HTTP GET 查询并使用 cURL 发送它(每个身份验证密钥最多 100 个)。 (第 3 部分)解析来自 API 的 XML 响应。 (第 4 部分)构建了一个 MySQL INSERT 查询(使用 foreach 循环和连接),然后使用 mysqli 函数将其插入 MySQL。

第四部分的代码如下:

$dbQuery1 = 'INSERT INTO `MARC Records`(`Query`,`Record`, `OCLC Number`, `ISBN`, `Number of Fields`) VALUES ('; 
d($dbQuery1);
foreach ($XMLtexts as $query => $querygr) {
    echo "in loop first level";
    d($query);
    foreach ($querygr as $xmltext) {
    $xmltext = addslashes($xmltext);
    $oclcn = addslashes(parseXML($xmltext, "oclcn", "number", 1));
    $isbn =  addslashes(parseXML($xmltext, "isbn", "number", 1));
    $fieldn =  addslashes(parseXML($xmltext, "fieldn", "number", 1));
    $dbQuery1 .= "'".$query."', '".$xmltext."','".$oclcn."', '".$isbn."', '".$fieldn."'), (";    
    d($oclcn, $isbn, $fieldn, $dbQuery1);
    }
}

    $dbQuery1 = substr($dbQuery1, 0, -3);
    $mysqli = new mysqli('localhost','root','root','OCLC');

//Output any connection error
if ($mysqli->connect_error) {
    die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
}

//MySqli Insert Query
$insert = $mysqli->query($dbQuery1);

**注意:d() 是我使用的自定义函数,类似于 var_dump()。

在测试运行中: 我取出了 1 个身份验证密钥。 我为此密钥构建了 10 个 API HTTP GET 查询。 为每个查询返回的 XML 响应的解析将每个响应分解为 100 个子节点,每个子节点将作为一条记录插入 MySQL 中。 所以添加到 MySQL 大约需要 10X1000 = 1000 行。 我的代码是为这 1000 行数据构建单个 INSERT 查询。有 5 个字段。

我的脚本经过所有部分,直到到达第 4 部分,在将第 46 行数据连接到我的 SQL 查询后停止。我没有看到任何错误输出。 SQL 查询的长度为 231 066 个字符。它没有达到插入 MySQL 数据库的点。

为什么会发生这种情况,我可以做些什么来解决它?实际上,该脚本必须处理多达 10keysX100requestsX100rows = 100 000 行甚至更多,而我只对 1000 行进行了测试,即便如此它也停止了。我必须做什么才能处理那么多行? (虽然我希望得到假设我不会使用 MySQL 和 MAMP 改变我的答案,但我欢迎任何也需要我从根本上改变所涉及的软件(或硬件)的建议。)

注意:我已经检查了脚本停止时应该解析的 XML。根据验证器,它的格式正确,因此不太可能导致问题:

<record xmlns="http://www.loc.gov/MARC21/slim">
    <leader>00000cam a2200000Mi 4500</leader>
    <controlfield tag="001">920683102</controlfield>
    <controlfield tag="008">150908t20152015si a   f b    000 0 eng d</controlfield>
    <datafield ind1=" " ind2=" " tag="020">
      <subfield code="a">9789814641463 (rel)</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="020">
      <subfield code="a">9814641464 (rel)</subfield>
    </datafield>
    <datafield ind1="0" ind2="0" tag="245">
      <subfield code="a">Computer arithmetic.</subfield>
      <subfield code="n">Vol. II /</subfield>
      <subfield code="c">editor Earl E. Swartzlander, University of Texas at Austin, USA.</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="260">
      <subfield code="a">Hackensack, NJ ;</subfield>
      <subfield code="a">London ;</subfield>
      <subfield code="a">Singapore :</subfield>
      <subfield code="b">World Scientific,</subfield>
      <subfield code="c">cop. 2015.</subfield>
    </datafield>
    <datafield ind1=" " ind2=" " tag="300">
      <subfield code="a">1 vol. (XXXVIII-446 p.) ;</subfield>
      <subfield code="c">29 cm.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Computer programming.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Floating-point arithmetic.</subfield>
    </datafield>
    <datafield ind1=" " ind2="0" tag="650">
      <subfield code="a">Computer arithmetic.</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Arithmétique interne des ordinateurs.</subfield>
      <subfield code="2">ram</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Arithmétique en virgule flottante.</subfield>
      <subfield code="2">ram</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Computer arithmetic.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst00872029</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Computer programming.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst00872390</subfield>
    </datafield>
    <datafield ind1=" " ind2="7" tag="650">
      <subfield code="a">Floating-point arithmetic.</subfield>
      <subfield code="2">fast</subfield>
      <subfield code="0">(OCoLC)fst00927429</subfield>
    </datafield>
    <datafield ind1="1" ind2=" " tag="700">
      <subfield code="a">Swartzlander, Earl E..</subfield>
      <subfield code="4">edt</subfield>
    </datafield>
  </record>

根据我的问题可能与How to increase apache timeout directive in .htaccess? 重复的建议,我还仔细阅读了那里的回复并对我的 php.ini 文件进行了调整:

max_execution_time 21600

【问题讨论】:

标签: mysql sql


【解决方案1】:

这看起来你需要增加 max_allowed_pa​​cket 值,你的代码只检查连接错误,这可能是一个错误:

'Packets larger than max_allowed_packet are not allowed.'

您可以增加 max_allowed_pa​​cket,但是我认为当您处理生成大量 sql 查询时,最好将查询附加到文件中,其想法是生成一个包含所有查询并稍后执行的 sql 脚本使用 mysql,使用:

mysql > source /path/to/your/generated/script.sql

【讨论】:

  • 我没有收到此错误,我怀疑这是 MySQL 错误,因为当我将第 46 条记录连接到包含我的 SQL 字符串的 $dbQuery1 时,脚本停止了。还有 54 条记录需要连接。 mysqli->查询尚未到达。
  • 好吧,我认为最好的办法是查看 XML 解析错误,也许该记录存在编码问题
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2013-06-30
  • 1970-01-01
  • 2023-03-20
  • 2012-08-06
相关资源
最近更新 更多