我执行了一个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
答案 0 :(得分:0)
这看起来你需要增加max_allowed_packet值,你的代码只检查一个连接错误,这可能是一个错误:
'Packets larger than max_allowed_packet are not allowed.'
你可以增加max_allowed_packet,但是我认为当你处理生成大量的sql查询时,最好将查询附加到文件中,我们的想法是生成一个包含所有sql脚本的sql脚本。你的查询,稍后用mysql执行它,使用:
mysql > source /path/to/your/generated/script.sql