2016-08-25 2 views
0

Ich habe einen Web-Scraper auf einem Server entwickelt, der funktioniert und macht, was ich will. Jetzt muss ich es in einer anderen Umgebung implementieren, und ich bin über ein Problem gestolpert, das ich bei der Entwicklung nicht hatte, das ich schwer zu identifizieren habe.PHP/Ajax anonyme Funktion, Iteration verursacht Fehler? + wie man Standard-PHP-Fehler bei der Verwendung von Ajax zeigt

Der einzige wirkliche Fehler, den ich zu gehen habe auf (von JS-Konsole):

POST http://my.cool.page/pro/company/scrape 502 (Bad Gateway) 

Der Entwicklungsserver (wo es funktioniert) ist PHP 5.4.16 verwenden, Implementierung Server auf PHP ist 5.4.45 . Ich verwende die gleichen Versionen von externem Code auf beiden Servern.

Die Umstände für den Start des Scraper sind in der Implementierung ein wenig anders, es wird jetzt durch Ajax statt als eine eigene Seite geladen.

Der Ajax-Aufruf:

$("#showScraperButton").click(function(){ 
      $.post('/pro/company/scrape', 
      { 
       'url': url 
      }, 
      function(result){ 
       //code... 
      } 
      ); 
     }); 

Funktion + Fall für Tags Anker Schaben mit 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; 
    } 

Daraus ergibt sich die oben beschriebenen Fehler.

Durch jede Zeile in dem Fall zu kommentieren, fand ich, dass der Fehler nicht bis

nicht zeigen
$n++; 

genannt wird. Wenn

$n++; 

NICHT enthalten ist, ist das letzte ein Element tatsächlich in $ tagContent vorhanden.

Dies führte mich zu der Annahme, dass der Versuch der Iteration in diesem Fall das Problem ist, und dass der Code sonst keine Fehler wirft. Ich habe dann versucht, mit einem anderen HTML-Tag, mit ähnlicher Syntax:

case 'h3': 
    $n = $i; 
    $crawler->filter($tag)->each(
    function ($node) use(&$tagContent, &$n, &$tag) 
    { 
     $tagContent[$tag][$n] = trim($node->text()); 
     $n++; 
    }); 
break; 

Dies funktioniert jedoch wie vorgesehen, was mich alle 40 Fälle von h3 auf der Seite, die ich Schaben bin.

Daraus habe ich einige Fragen: Bitte helfen? Könnte es mit PHP-Versionen zusammenhängen? Gibt es eine Möglichkeit, die "Standard" -PHP-Fehler bei Ajax-Aufrufen (anstelle von/zusätzlich zu http-Antwortcodes) zu drucken, da ich sicher bin, dass dort ein Hinweis darauf zu finden ist, was fehlschlägt. Vielen Dank für jede Hilfe!

Antwort

0

Es funktioniert jetzt mit

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 aus der mit Verschoben() Anweisung und in die Funktionsparameter. Ich glaube, ChromePhp könnte hier einige Probleme verursacht haben. Ich weiß immer noch nicht, was schief gelaufen ist. Aber jetzt funktioniert es ...

Verwandte Themen