Я разработал веб-скребок на одном сервере, который работает и делает то, что я хочу, чтобы он делал. Теперь я должен реализовать его в другой среде, и я наткнулся на проблему, которую у меня не было при разработке, и мне сложно идентифицировать ее.Функция PHP/Ajax Anonymous, итерация вызывает ошибку? + как показать стандартные ошибки PHP при использовании Ajax
Единственная ошибка, я должен пойти на это (от JS консоли):
POST http://my.cool.page/pro/company/scrape 502 (Bad Gateway)
Сервер развития (где он работает) использует PHP 5.4.16, сервер реализации на PHP 5.4.45 , Я использую те же версии внешнего кода на обоих серверах.
Условия для запуска скребка немного отличаются в реализации, теперь он загружается через 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;
Однако, это работает, как задумано, давая мне все 40 экземпляров h3 на странице я выскабливание.
Из этого у меня есть несколько вопросов: Пожалуйста, помогите? Может ли это быть связано с версиями PHP? Есть ли способ распечатать «стандартные» ошибки PHP при выполнении вызовов Ajax (вместо/в дополнение к кодам ответов HTTP), так как я уверен, что там есть намек на то, что не удается. Большое спасибо за любую помощь!