[PHP] Problem listen-socket & exec()

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von sparky, 25.01.2004.

  1. sparky

    sparky Mitglied

    Dabei seit:
    16.01.2004
    Beiträge:
    47
    Zustimmungen:
    0
    Servus, also folgendes Problem:

    Die Klasse macht einen ListenServer auf einem bestimmten Port (55555) und horcht auf Verbindungen. Die Commands die ankommen haben dann folgendes Format: array('command' => 'cm_xxx', 'arg1' => 'blubb' ...)

    Das ganze rennt dann natürlich in der Console:


    PHP:
    class    ListenServer extends BaseServer
    {
        var    
    $readEndCharacter    =    "\r\n\r\n";


        function    
    onReceiveData$clientId$data )
        {
            
    $request    =    unserialize$data );
            if( 
    preg_match("/^cm_/i"$request['command']) )
            {
                
                switch(
    $request['command']) {
                    case 
    'cm_system'$response $this->Run($response$request['arg1']);
                    break;
                    case 
    'cm_writefile'$response $this->writeFile($response$request['arg1'], $request['arg2']);
                    break;
                    case 
    'cm_getfile'$response $this->getFile($response$request['arg1']);
                    break;
                    default: 
                        
    $response .= "no action found";
                        
    $this->sendDebugMessage("Server::Receive(): no matching action");
                }
            }

            else
            {
                
    $response    =    "error\r\n"
            
    }

            
    $this->sendDebugMessage("Server::Send(): $response");
            
    $this->sendData$clientId$responsefalse);
            
    $this->closeConnection$clientId );
        }

        function 
    Run($res$cmd) {
            
    $this->sendDebugMessage("Server::Run(): $cmd");
            if(!
    escapeshellcmd($cmd)) return false;
            
    exec(escapeshellcmd($cmd), $o$r);
            
    $this->sendDebugMessage("Server::Run(): output: $o | res: $r | ret: ".serialize(array($o$r)));
            return 
    $res serialize(array($o$r'return' => 'command executed')) . "\r\n\r\n";
        }
        
        function 
    GetFile($res$file) {
              
    $str file($file);
            
    $this->sendDebugMessage("Server::getFile(): $file | str: " serialize($str));
            return 
    $res serialize($str) . "\r\n\r\n";
        }
        
        function 
    WriteFile($res$file$str) {
            
    $this->sendDebugMessage("Server::writeFile(): file: $file |str: $str");
            if(
    is_link($file)) {
                
    $this->sendDebugMessage("Server::writeFile(): deleting symlink: $file");
                
    $this->Run('rm -f ' $file);
                
    $this->Run('touch ' $file);
            }
              
    $fp fopen($file'w');
            foreach(
    $str as $value) {
                
    fwrite($fptrim($value) . "\n");
            }
            
    fclose($fp);
            return 
    $res "\r\n\r\n";
        }
    }


    in meinem PHP Script (nicht in der Console, sondern normal Webserver) kommunisizere ich dann mit diesem Code: ($data = serialisiertes Array)

    PHP:
    function DaemonSend($data) {
            
    $socket socket_create (AF_INETSOCK_STREAM0);
            
    $result socket_connect ($socket$ip55555);
            
    $in $data "\r\n\r\n";
            
    $out '';
            
    socket_write ($socket$instrlen ($in));

            while (
    $res socket_read($socket2048)) {
                
    $out .= $res;
            }
            
    socket_close ($socket);
            return 
    unserialize($out);
        }


    so jetzt das Problem:
    es geht alles reibungslos, nur wenn ich auf dem ListenServer die Methode Run() verwende und ein System Commando ausführen will, dann läuft mein PHP-Script auf dem Webserver in ner Endlosschleife. Bei allen anderen Methoden geht alles. Das System Commando wird sogar im Hintergrund gestartet & die Ausgaben umgelenkt (über ein Shellscript) so dass das Shellscript nur die PID von dem Ausgeführten Befehl zurückgibt. Wenn ich das gestartete Commando kille, dann lädt das Webserver-PHP File fertig.

    An was kann das liegen ? Wenn ich dieselbe Run() Funktion local auf dem seelben Rechner ausführe wie mein Webserver-Script, dann geht alles optimal.

    EDIT: ich habs auch mit anderen Fkt anstatt exec() versucht, aber mit allen dasselbe Problem
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. thorus

    thorus GNU-Freiheitskämpfer

    Dabei seit:
    03.11.2002
    Beiträge:
    757
    Zustimmungen:
    0
    Ort:
    Passau, Niederbayern
  4. sparky

    sparky Mitglied

    Dabei seit:
    16.01.2004
    Beiträge:
    47
    Zustimmungen:
    0
    hmpf keine Chance, ich hab ALLE versucht nochmal, das tolle ist ja, der Listen-Socket beendet die Verbindung:

    Debug:
    Code:
    2004-01-26 15:44:49 Server::Run(): output: Array | res: Array | ret: a:2:{i:0;a:1:{i:0;a:1:{i:0;s:5:"15987";}}i:1;a:1:{i:0;i:0;}}
    2004-01-26 15:44:49 Server::Send(): a:3:{i:0;a:1:{i:0;a:1:{i:0;s:5:"15987";}}i:1;a:1:{i:0;i:0;}s:6:"return";s:16:"command executed";}
    2004-01-26 15:44:49 Closed connection ( 0 ) from 192.168.0.161 on port 32812
    
    aber das empfangende Script scheint sich bei socket_read() aufzuhängen :(
     
  5. Steve

    Steve 13te

    Dabei seit:
    13.04.2002
    Beiträge:
    381
    Zustimmungen:
    0
    hi,

    du hast eigentlich ein Problem dabei warum sich dein Script so verhält und sich der Client beendet: Bei einem exec wird normalerweise (ich glaub bei PHP nicht) der Prozess durch das gestartete Programm ersetzt. Bei PHP gibt IMHO exec nur den Output zurück. Aber er blockiert, da er so lange wartet bis der Prozess fertig ist, deshalb denkt der Client IMHO auch, dass die Connection beendet wurde und er schließt sie deshalb auch.

    So nun ein Lösungsvorschlag: häng ein & an deinen Befehl an.

    Steve

    PS keine Ahnung ob stimmt. :)
     
  6. #5 sparky, 27.01.2004
    Zuletzt bearbeitet: 27.01.2004
    sparky

    sparky Mitglied

    Dabei seit:
    16.01.2004
    Beiträge:
    47
    Zustimmungen:
    0
    EDIT:

    also es liegt wohl an meinem Shellscript, denn ein "ls -l" oder ein shellscript mit einem einfachen "echo test" geht wunderbar.
    das script:

    Code:
    #!/bin/bash
    #export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
    cd $(dirname "$1")
    SVBIN=$(basename "$1")
    
    for param ; do
            if [ "$param" != "$1" ] ; then
                    SVARGS="$SVARGS $param"
            fi
    done
    
    ./${SVBIN}${SVARGS} 2>/dev/null 1>/dev/null &
    curr_pid=$!
    echo "$curr_pid"
    exit 0
    
    negativ.
    und wie gesagt, wenn ich denselben Code lokal aufrufe geht ja alles ...
     
Thema:

[PHP] Problem listen-socket & exec()

Die Seite wird geladen...

[PHP] Problem listen-socket & exec() - Ähnliche Themen

  1. CMS Problem [php]

    CMS Problem [php]: Ich hoffe es ist hier richtig. Ich habe folgendes Problem (klick HIER) und zwar unten bei den Kommentaren da Soll der Avatar des Users angezeigt...
  2. [PHP] Downline / Referalanzeige Problem

    [PHP] Downline / Referalanzeige Problem: Hi! Bei meinem neuen Projekt ist gerade das Refsystem dran. Hierzu hab ich eine Funktion geschrieben, die in X Ebenen die geworbenen Mitglieder...
  3. [PHP] Autologin-Funktion

    [PHP] Autologin-Funktion: HI, habe mir eben mal eine Autologin Funktion überlegt. Ich weiß zwar, das solche Funktionen zum teil, gerade im Web, argwöhnisch beliebäugelt...
  4. [PHP] file_exists und scandir, mal gehts mal nicht

    [PHP] file_exists und scandir, mal gehts mal nicht: HI, Ich habe zZ ein ein Problem mit den oben gennanten Funktionen. Ich sehe gerade nicht durch, in welchen Verzeichnissen diese Funktionen alles...
  5. [PHP] Session-Authentifizierung zentralisieren

    [PHP] Session-Authentifizierung zentralisieren: Hi, ich prüfe auf jeder geschützten Seite ob der enutzer befugt ist diese zu sehen oder nicht mittels: <?php session_start(); $hostname...