【发布时间】: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
【问题讨论】:
-
我已经调整了 php.ini 设置。我似乎在 Apache 的 httpd.conf 中找不到 Timeout 指令。谁能告诉我为什么?我正在使用 MAMP。