PHP脚本中途停止?

时间:2017-01-15 18:09:45

标签: mysql sql

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

第4部分的代码如下:

$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中。 所以它是大约10X1000 = 1000行添加到MySQL。 我的代码是为这1000行数据构建一个INSERT查询。共有5个领域。

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

为什么会发生这种情况,我该怎么做才能解决它?实际上,脚本必须处理多达10个密钥X100请求X100行= 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

1 个答案:

答案 0 :(得分:0)

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

'Packets larger than max_allowed_packet are not allowed.'

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

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