Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit MemCached nach exec() Aufruf einer PHP Datei

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit MemCached nach exec() Aufruf einer PHP Datei

    Hallo liebe Leute!

    ich sitze schon den ganzen Tag vor einem Problemchen und ich weiss echt nicht weiter... ist auch nicht ganz einfach was bei Google zu finden bei so einem derart speziellen Problem

    Folgendes Szenario:

    Ich will, dass wenn ich auf einen bestimmten Link klicke, im Hintergrund eine php Datei ausgeführt wird und der Output dieser Datei im Memcache gespeichert wird.

    Memcache ist installiert und funktioniert.

    Wenn ich diese php Datei (product_list_functions.php) im Browser aufrufe, und die benötigten Parameter über GET übertrage, funktioniert alles.
    Wenn ich das allerdings wie oben beschrieben, über die exec() Methode versuche, klappt alles, bis auf den Memcache set.

    Habe viel rumprobiert und bin mir sicher, dass es an Memcache liegen muss.

    Das ist der exec command:

    PHP-Code:
    exec("php product_list_functions.php ".escapeshellcmd("refresh")." ".escapeshellcmd($_GET['id'])." > /dev/null &"); 

    Hier ist die (vereinfachte) product_list_functions.php:

    PHP-Code:
    <?

    if(isset($_GET['action']) && $_GET['action'] == "refresh" && isset($_GET['id']) && $_GET['id'] > 0 ) {
        $param1 = $_GET['action'];
        $param2 = $_GET['id'];
    }
    if(isset($argv[1]) && isset($argv[2])) {
        $param1 = $argv[1];  //Parameter 1 - wird mittels exec() übergeben
        $param2 = $argv[2];  //Parameter 2 - wird mittels exec() übergeben
    }

    if(isset($param1) && $param1 == 'refresh' && isset($param2) && $param2 > 0) {
        //....arbeite.... das Resultat ist das Array $products
    }

    /*
    if (extension_loaded('memcache')) {
            $fh = fopen('test.txt', 'w');
         fwrite($fh, "test");
        fclose($fh);
    }
    /*

    /*
    if(class_exists('Memcache')) {
        $fh = fopen('test.txt', 'w');
        fwrite($fh, "test");
        fclose($fh);
    }
    */

    $memcache_data    = "kategorieliste_".$prodcatid;

    //Bis zu diesem Punkt passt alles

    $memcache_obj     = memcache_connect('localhost', 11211);

    /*sämtlicher ab dieser Stelle eingefügter Code wird vom PHP Parser vollkommen ignoriert, ich vermute dass Fehlermeldungen das Skript zum Abbruch bringen (gar nicht so einfach das so nachzuvollziehen, denn wenn ich die Datei per Browser öffne funktioniert ja alles, per exec() bleibt die Ausgabe einfach aus */

    $mem_del        = memcache_delete($memcache_obj, $memcache_data);

    $mem_action     = memcache_add($memcache_obj, $memcache_data , $products, false, 0);
    }
    ?>
    Ganz oben sieht man, optional die GET Parameter, mit denen habe ich die Funktion manuell überprüft.

    Nochmal zur Erinnerung: Diese Datei soll per exec() ausgeführt werden, nicht im Browser.
    Bei einer Ausführung über exec() wird nichts in den (mem)cache geschrieben (Beim Browseraufruf geht alles).

    Ich vermute, dass aus irgendeinem Grund die Memcache Erweiterung nicht geladen wurde. Wie man an den auskommentierten zeilen sieht, habe ich da schon etwas rumprobiert.

    Hat jemand ne Idee?

    MFG
    Chris

  • #2
    ajo, PHP liest wohl nicht die selbe PHP.ini im CLI-Modus ein.
    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

    Kommentar


    • #3
      Ähem... im CLI mode gibts kein $_GET/$_POST Array (bzw. sind die leer). Request Parameter gibts halt nur über Webserver-Requests.

      Aber wirf mal einen Blick ins $_SERVER Array...
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Prüf doch mal die Rückgabe von memcache_connect() - die liefert dir einen boolschen Wert zurück, den du unbedingt prüfen solltest. Du solltest dein error_reporting evtl hochschrauben, dann siehste auch die Notices, wieso der connect nicht klappte (siehe auch tr0ys Hinweis).

        Wieso denn eigentlich per exec?
        I like cooking my family and my pets.
        Use commas. Don't be a psycho.
        [URL="http://jscouch.de"]Blog[/URL] - [URL="http://coverflowjs.github.io/coverflow/"]CoverflowJS[/URL]

        Kommentar


        • #5
          @tr0y
          Danke, daran scheints wohl wirklich zu liegen - habe eben den hoster kontaktiert.
          Habe eine phpinfo() Datei über die Kommandozeile sowie den Browser ausgeführt. Bei der Kommandozeile wurde memcache nicht angezeigt.

          @Istlegelitz
          Ja, diese GET Parameter sind nur zum testen da. Irgendwie muss ich die Parameter ja einbringen, wenn ich die Datei über den browser aufrufe. Dieses Hilfsmittel wird gelöscht sobald das funktioniert.

          Kommentar


          • #6
            So, hier is die Lösung:

            exec("php53 -c ORT-DER-PHP-INI product_list_functions.php $param1 $param2 > /dev/null &");

            Kommentar


            • #7
              Crossposting http://www.php-resource.de/forum/php...tml#post660421
              while (!asleep()) sheep++;

              Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

              Kommentar

              Lädt...
              X