我有一个基于wp的小脚本,用于抓取网页并使用preg_match_all()计算4个关键字的出现次数。
这是我知道包含关键字的网址的代码:
<?php
$url ='http://www.leggioggi.it/2013/08/16/i-tre-amici-discutono-di-servizio-sanitario-casuale-e-differenze-nord-sud/';
$response = wp_remote_get($url);
$the_body = wp_remote_retrieve_body($response);
//echo htmlentities($the_body);
$matches = array();
$matches_count = preg_match_all("/gravidanz|preconcezional|prenatal|concepimento/i", $the_body, $matches);
var_dump ($matches_count);
var_dump ($matches);
?>
我有一些奇怪的问题。在某些页面上我得到零匹配,即使我知道这些页面包含关键字。我注意到,对于那些页面,取消注释行echo htmlentities($the_body);
可以解决问题。如果我再次发表评论,那么奇怪就会回来。
我的猜测是涉及到一些缓存机制。
PS:代码不是写在模板文件上,而是写在pods框架页面中。
更新:
我在htmlentities线之后放了一个var_dump($the_body);
。这种行为很有趣。如果echo htmlentities($the_body);
被注释掉var_dump($ the_body);返回一个空字符串;如果同一行是活动的,var_dump($ the_body);返回整个页面的HTML。所以我真的不知道发生了什么!
解决: 我检查了$ response var(我的错误没想到)我发现当确实存在远程服务器错误时,wp_remote_get()返回的响应中报告了错误。 这就是我的回忆:
object(WP_Error)#30 (2) {
["errors"]=>
array(1) {
["http_request_failed"]=>
array(1) {
[0]=>
string(69) "Operation timed out after 5000 milliseconds with 25692 bytes received"
}
}
["error_data"]=>
array(0) {
}
}
答案 0 :(得分:1)
我检查了$ response var(我的错误没想到)我发现确实存在远程服务器错误,错误是在wp_remote_get()返回的响应中报告的。 这就是我的回忆:
object(WP_Error)#30 (2) {
["errors"]=>
array(1) {
["http_request_failed"]=>
array(1) {
[0]=>
string(69) "Operation timed out after 5000 milliseconds with 25692 bytes received"
}
}
["error_data"]=>
array(0) {
}
}
所以它解决了。我只需要检查http错误并重复请求有限次数,如果没有给出正确的响应,则忽略该资源。