2016-08-25 48 views
0

我在一臺服務器上開發了一個網絡抓取工具,該工具可以正常工作,並按照我的要求進行工作。現在我必須在另一個環境中實現它,並且我偶然發現了一個我在開發時沒有的問題,而這個問題我很難找到。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錯誤,因爲我確定在那裏有關於失敗的提示。非常感謝您的幫助!

回答

0

現在它使用

case 'a': 
       $crawler->filter($tag)->each(
       function ($node, $n) use (&$tagContent, &$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; 

感動$ N OUT的使用()語句,進入功能參數。我相信ChromePhp可能在這裏引發了一些問題。仍然不知道出了什麼問題。但現在它可以工作...

相關問題