heiseonline / shariff-backend-php

👮 PHP backend for Shariff. Shariff enables website users to share their favorite content without compromising their privacy.
http://ct.de/-2467514
133 stars 44 forks source link

Backend liefert nur für Pinterest Daten zurück #35

Closed CommanderBond closed 9 years ago

CommanderBond commented 9 years ago

Hallo,

ich habe das aktuelle Backend auf einem Windows Server 2008 R2 mit PHP 5.6.10 installiert und konfiguriert. Ein Testaufruf von https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at liefert aber nur {"pinterest":0} zurück, obwohl alle Services in der shariff.json sind:

{
    "cache": {
        "ttl": 60,
        "cacheDir": "C:\\Inetpub\\vhosts\\ulc-moedling.at\\httpdocs\\cache\\shariff_manuell"
    },
    "domain": "www.ulc-moedling.at",
    "services": [
        "GooglePlus",
        "Twitter",
        "Facebook",
        "LinkedIn",
        "Reddit",
        "StumbleUpon",
        "Flattr",
        "Pinterest",
        "Xing"
    ]
}

Das Cache-Verzeichnis existiert und darin befindet sich im Unterordner Shariff-8a eine Datei namens Shariff-c405a2c5b1796ce4d3d874fa29e33051.dat mit Inhalt {"pinterest":0}

Was könnte der Grund dafür sein, dass kein anderes Service bei uns Daten liefert? Rufe ich die API-Aufrufe der Services, die ich aus den Dateien wie src/Backend/Twitter.php extrahiert habe, manuell im Browser auf, wie z.B. https://cdn.api.twitter.com/1/urls/count.json?url=https://www.ulc-moedling.at liefern diese API-Aufrufe sehr wohl Daten zurück.

Ich würde mich sehr freuen, wenn ich diese Dinge mit eurer Hilfe lösen könnte!

pmb0 commented 9 years ago

Hi, steht was im Errorlog?

CommanderBond commented 9 years ago

Meinst du das PHP Errorlog oder hat Shariff auch eines (das ich noch nicht gefunden habe). In der PHP.ini steht ;error_log = php_errors.log, es ist also auskommentiert. log_errors = On ist aber gesetzt.

pmb0 commented 9 years ago

Ich meine das PHP-Errorlog bzw. das deines Webservers.

CommanderBond commented 9 years ago

Ich habe in der php.ini jetzt eine Log-datei angegeben, einkommentiert und den Application Pool recycelt. Es gibt (noch) keine php_errors.log & im Webserverlog finden sich auch keine Fehler – auch nicht nach Aufruf von https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at

pmb0 commented 9 years ago

Gibt es auch keine Einträge, wenn du den Cache leerst (also das Cache-Verzeichnis löschst)?

CommanderBond commented 9 years ago

Doch, dann schon. Dann wird wird ein entsprechender Fehler eingetragen. Und weil ich die echos aus Issue #23 eingetragen habe, sieht man auch eine entsprechende Ausgabe im Browser. Lege ich das Cache-Verzeichnis manuell wieder an, kommt wieder {"pinterest":0}

pmb0 commented 9 years ago

Und was ist das für ein Fehler?

CommanderBond commented 9 years ago

Der zu erwartende:

PHP Fatal error: Uncaught exception 'Zend\Cache\Exception\InvalidArgumentException' with message 'Cache directory 'C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\cache\shariff_manuell' not found or not a directory' in C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\vendor\zendframework\zend-cache\src\Storage\Adapter\FilesystemOptions.php:130 Stack trace:

0 C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\src\ZendCache.php(51): Zend\Cache\Storage\Adapter\FilesystemOptions->setCacheDir('C:\Inetpub\vhos...')

1 C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\src\Backend.php(37): Heise\Shariff\ZendCache->__construct(Array)

2 C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\index.php(21): Heise\Shariff\Backend->__construct(Array)

3 C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\index.php(26): Application::run()

4 {main}

thrown in C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\shariff-backend\vendor\zendframework\zend-cache\src\Storage\Adapter\FilesystemOptions.php on line 130

pmb0 commented 9 years ago

Leg bitte C:\Inetpub\vhosts\ulc-moedling.at\httpdocs\cache\shariff_manuell wieder an. Gibt es dann einen Fehler?

CommanderBond commented 9 years ago

Nein, {"pinterest":0} ist nach dem Wiederanlegen die Rückgabe, wie per https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at zu sehen.

pmb0 commented 9 years ago

Ich habe gerade versucht, das Problem unter Verwendung deiner Konfiguration auf meinem lokalen System nachzustellen. Bei mir funktioniert aber alles.

Kannst du in dem catch(){} ein echo/print_r einbauen? Ich vermute, dass es an dieser Stelle der Fehler auftritt und blöderweise ignoriert wird.

CommanderBond commented 9 years ago

Ja kann ich machen. In welcher Datei gehört das echo in welches catch (falls es dort mehrere gibt)?

pmb0 commented 9 years ago

Oops, Link kopiert, aber nicht eingefuegt:

https://github.com/heiseonline/shariff-backend-php/blob/master/src/Backend/BackendManager.php#L101

CommanderBond commented 9 years ago

Ich habe das catch folgendermaßen geändert:

try {
        $counts[ $service->getName() ] = (int)$service->extractCount($results[$i]->json());
    } catch (\Exception $e) {
         echo'Skip service if broken';// Skip service if broken
    }

Angezeigt wurde nie etwas. Wenn ich ein echo testweise vor das try einfüge, sodass es auf jeden Fall und immer angezeigt werden müsste, geschieht etwas Seltsames: Es wird genau beim ersten Aufruf von https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at angezeigt. Nach einem Reload nie wieder. Füge ich dann ein echo gleich am Beginn der foreach Schleife ein, wird auch dieses genau beim ersten Aufruf angezeigt. Nur eine blöde Frage: Könnte da der OpCache von PHP oder der File Cache von WinCache schuld sein?

liayn commented 9 years ago

Das liegt am Caching. Kommentiere mal Zeilen 76-78 aus und probier nochmals. Dann ist der shariff cache mal "abgeschaltet".

Probier auch ein

var_dump($this->services);
var_dump($results);

vor der Zeile 96

pmb0 commented 9 years ago

Klingt so, als ob $this->services nur einen Eintrag enthält. Kannst du das mal dumpen?

CommanderBond commented 9 years ago

Danke für den Hinweis bzgl. Cache. Also: Die foreach Schleife schaut nun folgendermaßen aus:

        foreach ($this->services as $service) {
        echo $i;//Echo des Schleifenzählers eingefügt
        if (method_exists($results[$i], "json")) {
            try {
                    echo $service->getName(); //Echo des Servicenamens eingefügt
                    $counts[ $service->getName() ] = (int)$service->extractCount($results[$i]->json());
                } catch (\Exception $e) {
                    echo'Skip service if broken';// Skip service if broken
                }
            }
            $i++;
        }

Die Ausgabe ist dann: 01234567pinterest8{"pinterest":0}

Wenn foreach folgendermaßen definiert ist:

        foreach ($this->services as $service) {
        echo $i;//Echo des Schleifenzählers eingefügt
        echo $service->getName();//Echo des Servicenamens eingefügt
        if (method_exists($results[$i], "json")) {
            try {
                    echo $service->getName();//Nochmal Echo des Servicenamens eingefügt
                    $counts[ $service->getName() ] = (int)$service->extractCount($results[$i]->json());
                } catch (\Exception $e) {
                    echo'Skip service if broken';// Skip service if broken
                }
            }
            $i++;
        }

ist die Ausgabe 0googleplus1twitter2facebook3linkedin4reddit5stumbleupon6flattr7pinterestpinterest8xing{"pinterest":0} Für mich sieht das so aus, als wenn dann das if (method_exists($results[$i], "json")) fehlschlägt.

Wie kann ich $this->services dumpen? echo $this->services liefert nur "array" zurück (wie gesagt: ich bin ein PHP Dummy).

liayn commented 9 years ago

Schau dir meinen post von oben an. https://github.com/heiseonline/shariff-backend-php/issues/35#issuecomment-123706744

@pmb0 by reading, I'd rather say that $results has no results.

CommanderBond commented 9 years ago

@liayn meinst du das Abschalten des Caches? Den habe ich deaktiviert per Auskommentieren der Zeilen 76-78.

liayn commented 9 years ago

@kondrich

var_dump($this->services);
var_dump($results);

vor der foreach

CommanderBond commented 9 years ago

Das Ergebhnis seht ihr hier: https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at Ich habe das Dump auch als .txt abgepeichert (41MB) und wollte es hier gezippt posten, aber es sind nur Bilder erlaubt.

liayn commented 9 years ago

Ok, das ist dann bisschen gar viel. ;-) Schauen wir mal durch.

liayn commented 9 years ago

Problem with the SSL CA cert (path? access rights?)

Kann es sein, dass der Server falsch konfiguriert ist?

CommanderBond commented 9 years ago

@liayn: Ich sehe die Zeilen auch im Dump. Keine Ahnung, was cURL mit dem SSL Zertifikat hat oder ob da ein generelles Problem vorliegt. Nicht, dass ich wüsste.

liayn commented 9 years ago

Das ist definitiv kein shariff Problem. Dein Server kann mit den SSL Zertifikaten wohl nichts anfangen, oder kann sie nicht validieren. Da kann ich allerdings nicht mehr weiter behilflich sein. Sorry.

CommanderBond commented 9 years ago

In der php.ini sehe ich [curl] curl.cainfo="C:\Parallels\Plesk\Additional\PHPSettings\cacert.pem"

pmb0 commented 9 years ago

@liayn Dito.

CommanderBond commented 9 years ago

So, Guys @liayn & @pmb0. Alles gefixt: Die obige Angabe der cacert.pem zeigte ins Nichts. Das entstand durchs PHP Update auf 5.6 vor Monaten. In meiner Serveradministrationsdoku und der alten PHP 5.5 php.ini stand die Lösung: http://curl.haxx.se/ca/cacert.pem herunterladen und im Ordner der php.ini speichern, dann php.ini anpassen: [curl] curl.cainfo = "C:\Parallels\Plesk\Additional\PleskPHP56\cacert.pem" Einmal Application Pool recyceln und schon zeigt https://www.ulc-moedling.at/shariff-backend/?url=https://www.ulc-moedling.at alles an!

Herzlichen Dank für eure Hilfe! #crowdrules

pmb0 commented 9 years ago

Ok, dann viel Spaß mit dem Shariff-Backend und empfiehl es weiter ;)

CommanderBond commented 9 years ago

Der Vollständigkeit halber: Die bereits geschlossenen Issues habe ich vor dem Öffnen dieses Issues nicht gesehen. Dort weisen einige auf die SSL Problematik von cURL hin – und auf die korrekte und sichere Lösung mit der cacert.pem. Wäre evtl. einen FAQ Eintrag gut.