2016-03-23 11 views
2

Ist es möglich, einen Socket mit einer Funktion zu öffnen und Befehle an diesen Socket mit einer anderen Funktion alle von der gleichen Seite zu senden?PHP Share fsockopen zwischen Funktionen auf Seite

Wenn ich das versuche ich: Warning: fputs(): supplied argument is not a valid stream resource

Dies ist der Code, den ich

connect(); 
cmd("cd /home/tom\n ls\n"); 
close(); 

function connect() { 
    global $passwd; 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function cmd ($cmd) { 
    global $fp; 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close() { 
    global $fp; 
    fclose($fp); 
} 

Jede Idee, wie ich mit dieser Arbeit zu bekommen? Danke

+0

Der unmittelbare Grund hier ist, dass innerhalb 'connect()' Sie erklären _nicht_ '$ fp' als global, daher wird es als lokal behandelt und verloren, wenn Du lebst die Funktion. – arkascha

+1

Allerdings ist die Verwendung der 'global'-Anweisung ohnehin sehr schlecht, Sie sollten Ihren Code umschreiben, um es zu vermeiden. In der Regel implementiert man eine Klasse, die das Dateihandle als Eigenschaft enthält. Auf diese Weise können alle Methoden der Klasse darauf zugreifen, obwohl es nicht global ist, weil alle Methoden auf demselben Objekt operieren, das von der Klasse instanziiert wurde. – arkascha

+0

Entsprechend Ihrem Code sollten Sie $ fp als global am Anfang der connect() Methode deklarieren, um von cmd() aus zugänglich zu sein. –

Antwort

0

Sie müssen den Zeiger global speichern oder als Referenz übergeben.

Dies ist eine Möglichkeit, es

$fp = connect($passwd); 
cmd($fp, "cd /home/tom\n ls\n"); 
close($fp); 

function connect ($passwd) { 
    if (!$fp = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
     exit('Login Failed'); 
    } 
    stream_set_timeout($fp, 1); 

    fputs($fp, "tom\n"); sleep(1); 
    fputs($fp, "$passwd\n"); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 

    return $fp; 
} 

function cmd ($fp, $cmd) { 
    fputs($fp, $cmd); sleep(1); 
    $res = fread($fp,1024); 
    var_dump($res); 
} 

function close ($fp) { 
    fclose($fp); 
} 

ich über den Kontext nicht sicher bin, zu tun, in dem dieser Code wird leben, so ist es schwierig, anders oder besser Taktik hindeutet. Ich würde wahrscheinlich tut es mein Selbstobjektorientiert wie so:

$command = new Command($passwd); 
if($command->connect()){ 
    $res = $command->cmd("cd /home/tom\n ls\n"); 
    // Use $result of cmd() here 

    $command->close(); // close when done 
} 

class Command { 

    private $fp; 
    private $passwd; 

    public function __construct($passwd) { 
     $this->passwd = $passwd; 
    } 

    public function connect() { 
     if (!$p = @fsockopen("127.0.0.1", 23, $errno, $errstr, 5)) { 
      return false; // Or throw an exception 
     } 
     stream_set_timeout($fp, 1); 

     fputs($fp, "tom\n"); sleep(1); 
     fputs($fp, "$passwd\n"); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     $this->fp = $fp; 
     return true; // Or $res if you want to use it somewhere else 
    } 

    function cmd ($cmd) { 
     $fp = $this->fp; 

     fputs($fp, $cmd); sleep(1); 
     $res = fread($fp,1024); 
     var_dump($res); 

     return $res; // if you want to use it else where 
    } 

    function close() { 
     fclose($this->fp); 
    } 
}