我在一臺服務器上開發了一個網絡抓取工具,該工具可以正常工作,並按照我的要求進行工作。現在我必須在另一個環境中實現它,並且我偶然發現了一個我在開發時沒有的問題,而這個問題我很難找到。PHP/Ajax匿名函數,迭代會導致錯誤? +如何在使用Ajax時顯示標準的PHP錯誤
唯一真正的錯誤,我得去爲(從JS控制檯):
POST http://my.cool.page/pro/company/scrape 502 (Bad Gateway)
開發服務器(如果它的工作原理)使用PHP 5.4.16,實現服務器是PHP 5.4.45 。我在兩臺服務器上使用相同版本的外部代碼。
啓動scraper的環境在實現上有點不同,現在它正在通過Ajax加載,而不是作爲它自己的頁面加載。
AJAX調用:
$("#showScraperButton").click(function(){
$.post('/pro/company/scrape',
{
'url': url
},
function(result){
//code...
}
);
});
功能+情況下用於刮擦錨標籤,使用Fabpot/GOUTTE:
function _getTagContent($crawler = '', $toScrape = '', $contentPatterns = '')
{
$tagContent = array();
ChromePhp::log("Hello _getTagContent");
foreach($toScrape as $tag) {
$i = 0;
switch ($tag) {
case 'a':
$n = $i;
$crawler->filter($tag)->each(
function ($node) use(&$tagContent, &$n, &$tag, &$crawler)
{
$nodeText = trim($node->text());
$tagContent[$tag][$n]['value'] = $nodeText;
$linksCrawler = $crawler->selectLink($nodeText);
try {
$link = $linksCrawler->link();
$magicDidHappen = true;
}
catch(Exception $e) {
$magicDidHappen = false;
}
if ($magicDidHappen) {
$uri = $link->getUri();
}
else {
$uri = $node->attr('href');
}
$tagContent[$tag][$n]['uri'] = $uri;
$n++;
});
break;
default:
break;
}
}
return $tagContent;
}
這導致上述錯誤。
通過註釋掉的情況下,各行,我發現該錯誤不顯示,直到
$n++;
被調用。如果
$n++;
不包括在內,最後一個元素確實存在於$ tagContent中。
這使我相信在這種情況下迭代的嘗試是問題,否則代碼不會拋出錯誤。然後,我用不同的HTML標記嘗試使用類似的語法:
case 'h3':
$n = $i;
$crawler->filter($tag)->each(
function ($node) use(&$tagContent, &$n, &$tag)
{
$tagContent[$tag][$n] = trim($node->text());
$n++;
});
break;
然而,這種按預期工作,給我我刮的頁面上H3的所有40個實例。
從這我有一些問題:請幫忙嗎?它可能與PHP版本有關嗎?有沒有辦法在進行Ajax調用時(而不是/除了http響應代碼之外)打印「標準」PHP錯誤,因爲我確定在那裏有關於失敗的提示。非常感謝您的幫助!