mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Sa 27.04.2024 03:52 Benutzername: Passwort: Auto-Login

Thema: Problem mit MemCached nach exec() Aufruf einer PHP Datei vom 12.04.2012


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Problem mit MemCached nach exec() Aufruf einer PHP Datei
Autor Nachricht
mikzaxz
Threadersteller

Dabei seit: 11.01.2012
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 12.04.2012 20:40
Titel

Problem mit MemCached nach exec() Aufruf einer PHP Datei

Antworten mit Zitat Zum Seitenanfang

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:
Code:
Code:
exec("php product_list_functions.php ".escapeshellcmd("refresh")." ".escapeshellcmd($_GET['id'])." > /dev/null &");



Hier ist die (vereinfachte) product_list_functions.php:

Code:
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
  View user's profile Private Nachricht senden
choise

Dabei seit: 01.02.2007
Ort: Würzburg
Alter: 35
Geschlecht: Männlich
Verfasst Do 12.04.2012 21:05
Titel

Antworten mit Zitat Zum Seitenanfang

hmmm.

ich hab jetzt nicht so die erfahrung mit exec, aber wenn ich das richtig sehe führst du ja hier praktisch einen shell befehlt.
ist denn die php-version die du in deinem exec ausführst die gleiche, die dein webserver verwendet?

Zitat:
exec("php


vielleicht mal den absoluten pfad verwenden.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 13.04.2012 10:10
Titel

Antworten mit Zitat Zum Seitenanfang

Ja raff ich net, Du kannst ja auch nix draus lesen, wenn Du die Ausgabe direkt ins nulldevice schreibst. Da Dein CLI-PHP möglicherweise anders konfiguriert ist als Dein Apache-PHP oder CGI-PHP, oder aber einfach nur das error_reporting ausgeschaltet ist, oder ... oder ... oder ... Da sind viel zu viele systemische Unwägbarkeiten drin, um wirklich Böcke zu haben, das zu debuggen.

Ggf. kannste es mal mit zwei vernünftigen Bibliotheken versuchen:

https://github.com/symfony/Console
https://github.com/symfony/Process
  View user's profile Private Nachricht senden
mikzaxz
Threadersteller

Dabei seit: 11.01.2012
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 13.04.2012 11:49
Titel

Antworten mit Zitat Zum Seitenanfang

@choise

es hat sich jetzt gezeigt, dass es sehr wahrscheinlich genau daran liegt.
phpinfo(); , einmal über die Kommandozeile und einmal über den Browser angezeigt, zeigt bei der Kommandozeile das memcache Modul nicht.

Habe eben den hoster kontaktiert. Oder weiss einer, wie man dieses Problem lösen kann?
  View user's profile Private Nachricht senden
mikzaxz
Threadersteller

Dabei seit: 11.01.2012
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 13.04.2012 14:19
Titel

Antworten mit Zitat Zum Seitenanfang

So,hier is die Lösung, danke @all


Code:
exec("php53 -c ORT-DER-PHP-INI product_list_functions.php $param1 $param2 > /dev/null &");
  View user's profile Private Nachricht senden
 
Ähnliche Themen [Flash, AS2] Problem: Aufruf einer .BAT-Datei mit fscommand
Direktor Aufruf abwarten, aber wie erstelle ich einen Aufruf
Mitgeben eines Suchbegriffs beim Aufruf einer PDF-Datei
php per exec entpacken
Seitenaktualisierung bei Aufruf
PHP - Dateien vor Aufruf schützen (+ Umfrage)
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.