Stefan Welscher: popen will nicht

Hallo,
ich veruche gerade die Ausgabe eines Perl-Scriptes über PHP zu verarbeiten, scheitere aber kläglich...

Das Perl-Script an sich arbeitet problemlos und wenn ich die PHP-Datei über die Shell aufrufe sehe ich auch die Ausgabe des Scriptes.
In PHP bekomme ich die Ausgabe aber weder über das Webinterface, noch über die Shell verarbeitet.

Folgenden Output produziert das Script:
ipc@nipc1:~/CoPS/Entwicklung/bin> perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ce-2851-4T1DSU-4ESW-SP
WAN     1       VWIC-2MFT-T1    Serial0/0/0
LAN     1       GigabitEthernet GigabitEthernet0/0
CROSS   1       GigabitEthernet GigabitEthernet0/1
SWITCH  1       HWIC-4ESW       FastEthernet0/2/0
SWITCH  2       HWIC-4ESW       FastEthernet0/2/1
SWITCH  3       HWIC-4ESW       FastEthernet0/2/2
SWITCH  4       HWIC-4ESW       FastEthernet0/2/3
ipc@nipc1:~/CoPS/Entwicklung/bin>

  
  
  
Und dieser Teilcode sollte das verarbeiten:  
[code]  
$ifc_hash{'wan'}{'count'}=0; $ifc_hash{'lan'}{'count'}=0; $ifc_hash{'backup'}{'count'}=0; $ifc_hash{'cross'}{'count'}=0; $ifc_hash{'switch'}{'count'}=0;  
  
$command="/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ".$ce_model;  
  
$shell=popen($command, "w");  
  
#DEBUG:  
echo "\nCOMMAND:|".$command."|\n";  
echo "Gettype:|".gettype($shell)."|\n";  
echo "Read:|".fread($shell, 2096)."|\n";  
echo "Print_R:|".print_r($shell)."|";  
  
while (!feof($shell))  
{  
 print "\nTEST!!!\n";  
 $line=fgets($shell,1024);  
 echo "\nLine=".$line."\n";  
 if (preg_match("/^\s*([a-z]+)\t(\d+)\t([a-z0-9-\/\\:]+)\t([a-z0-9-\/\\:]+)/i",$line,$ifc_array))  
 {  
  $type=strtolower($ifc_array[1]);  
  $nr=$ifc_array[2];  
  
  $ifc_hash{$type}{$nr}{'card'}=$ifc_array[3];  
  $ifc_hash{$type}{$nr}{'name'}=$ifc_array[4];  
  $ifc_hash{$type}{'count'}++;  
  $count_all++;  
 }  
}  
pclose($shell);  

Zurück bekomme ich aber lediglich:

  
COMMAND:|/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ce-2851-4T1DSU-4ESW-SP|  
Gettype:|resource|  
Read:||  
Resource id #2Print_R:|1|  

Sieht jemand von euch den Fehler?
Danke!!

  1. echo $begrüßung;

    Sieht jemand von euch den Fehler?

    Den nicht direkt, aber mehrere andere.

    $ifc_hash{'wan'}{'count'}=0; $ifc_hash{'lan'}{'count'}=0; $ifc_hash{'backup'}{'count'}=0; $ifc_hash{'cross'}{'count'}=0; $ifc_hash{'switch'}{'count'}=0;

    Das ist zwar gültige PHP-Syntax, maacht aber vermutlich etwas anderes als du willst. PHP unterscheidet nicht zwischen verschiedenen Array-Typen. Es gibt nur eine Sorte Array, und auf Elemente greift man mit [] zu. {} ist (mittlerweile alte) Syntax für zeichenweisen Stringzugriff.

    $command="/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ".$ce_model;

    $shell=popen($command, "w");

    #DEBUG:
    echo "\nCOMMAND:|".$command."|\n";
    echo "Gettype:|".gettype($shell)."|\n";
    echo "Read:|".fread($shell, 2096)."|\n";
    echo "Print_R:|".print_r($shell)."|";

    Wenn du möchtest, dass print_r() etwas zurückgibt anstatt es direkt auszugeben, solltest du als zweiten Parameter true übergeben.
    Ebenfalls günstig für die Debug-Ausgabe von Variableninhalten ist var_dump(). Das zeigt Variablentyp und Länge des Inhalts an. Du kannst dir dann das Einrahmen in || sparen.

    Zurück bekomme ich aber lediglich:
    COMMAND:|/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ce-2851-4T1DSU-4ESW-SP|
    Gettype:|resource|
    Read:||
    Resource id #2Print_R:|1|

    popen() gibt laut Handbuch auch dann eine Ressourcenkennung zurück, wenn ein Fehler auftrat. Das macht es, um den Fehlermeldungstext empfangen zu können. Dazu muss dieser aber auf die Standardausgabe umgeleitet werden. Füge doch mal, wie im Handbuch zu sehen, ein >2&1 an deinen Befehl an, und schau mal, ob fread() dann etwas zurückgibt.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      OK, Danke für den Hinweis mit den Klammern, hab immer ein wenig Probleme beim Wechsel zwischen PHP und Perl ;)

      ich hab das jetzt mal umgebaut:

        
      $command="/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ".$ce_model." 2>&1";  
        
      $shell=popen($command, "w");  
        
      #DEBUG:  
      echo "\nCOMMAND:|".$command."|\n";  
      echo "Gettype:|".gettype($shell)."|\n";  
      echo "Read:|".fread($shell, 2096)."|\n";  
      echo "Print_R:|".print_r($shell, true)."|";  
      echo "Var_Dump:|".var_dump($shell)."|";  
        
      while (!feof($shell))  
      {  
       print "\nTEST!!!\n";  
       $line=fgets($shell,1024);  
       echo "\nLine=".$line."\n";  
       if (preg_match("/^\s*([a-z]+)\t(\d+)\t([a-z0-9-\/\\:]+)\t([a-z0-9-\/\\:]+)/i",$line,$ifc_array))  
       {  
        $type=strtolower($ifc_array[1]);  
        $nr=$ifc_array[2];  
        
        $ifc_hash[$type][$nr]['card']=$ifc_array[3];  
        $ifc_hash[$type][$nr]['name']=$ifc_array[4];  
        $ifc_hash[$type]['count']++;  
        $count_all++;  
       }  
      }  
      pclose($shell);  
      
      

      und bekomme folgendes zurück:

      "COMMAND:|/usr/bin/perl /home/ipc/CoPS/Entwicklung/bin/get_interfaces_php_exporter.pl ce-2851-4T1DSU-4ESW-SP 2>&1|
      Gettype:|resource|
      Read:||
      Print_R:|Resource id #2|resource(2) of type (stream)
      Var_Dump:||"

      Kannst du damit was anfangen?

      $verabschiedung $name

      1. echo $begrüßung;

        und bekomme folgendes zurück:
        Read:||
        Kannst du damit was anfangen?

        Also kommt keine Fehlermeldung, ah, Moment mal ...

        $shell=popen($command, "w");

        Warum öffnest du den Prozess zum Schreiben (w) wenn du doch daraus lesen (r) möchtest?

        echo "$verabschiedung $name";

        1. Warum öffnest du den Prozess zum Schreiben (w) wenn du doch daraus lesen (r) möchtest?

          Das war nur mal ein Versuch, da es mit "r" nicht geklappt hatte...

          Aber ich hab es tatsächlich geschafft den Fehler zu finden....
          Wenn ich den command mit system() ausgeführt habe kam ein "permission denied" zurück. Hab dann die Rechte am Perl-Script geändert und "w" wieder durch "r" ersetzt und siehe da.... funzt wie geschmiert :)

          Danke für deine super Mithilfe!