3 Stimmen

.profile mit proc_open() laden

Die Situation ist wie folgt: Ich habe eine Backend-Anwendung geschrieben, die auf einem bestimmten Server läuft. Auf diesem Server gibt es ein Skript, das vom Front-End-Server über ssh ausgeführt werden kann. Mein Skript überprüft dann, ob die Umgebungsvariablen, die es benötigt, korrekt geladen sind, da ich im Skript selbst stark auf sie angewiesen bin.

Das funktioniert, wenn auch nicht so, wie ich es mir wünsche. Wenn die Verbindung hergestellt ist, wird das ./profile nicht nur mit exec('source /home/user/.profile'); funktioniert natürlich nicht. Da das Skript bereits läuft. Deshalb beginnt das Skript so:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'])
    {
        exec('/absolute/path/to/helperscript '.implode(' ',$argv),$r,$s);
        if ($s !== 0)
        {
            die('helper script fails: '.$s);
        }
        exit($r[0]);
    }

Dieses Hilfsskript ist ein ksh-Skript:

#!/path/ksh
source /.profile
$*

Laden des Profils und erneuter Aufruf des ersten Skripts. Ich möchte, dass dieses zweite Skript verschwindet, ich finde es albern... ein zweites Skript zu benötigen, um das erste auszuführen. Ich weiß, dass es möglich ist, Umgebungswerte mit proc_open zu setzen, aber das .profile als Array umzuschreiben, ist noch dümmer. Ich habe auch versucht proc_open eine Shell, laden Sie das Profil und führen Sie das Skript erneut von sich aus aus. Nur um festzustellen, dass das Skript sich selbst immer wieder aufruft, was mich zu der Annahme führt, dass das Profil gar nicht geladen ist.

Hier ist mein bisheriger Versuch:

#!/to/php/bin/php -n
<?php
    if (!$_SERVER['VAR_FROM_PROFILE'] && $argv[1] !== 'fromself')
    {
        $res = proc_open('ksh',array(array('pipe','r'),array('pipe','w'),array('pipe','w')),$pipes);
        usleep(5);
        fwrite($pipes[0],'source /home/user/.profile & '.$argv[0].' fromself');
        fclose($pipes[0]);//tried using fflush and a second fwrite. It failed, too
        usleep(1);
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
        proc_close($res);
        exit();
    }
    var_dump($_SERVER);
?>

Ich hatte bisher kein Glück damit, kann mir jemand sagen, ob ich hier etwas vergessen habe? Was mache ich falsch? Habe ich hier etwas übersehen?

4voto

galymzhan Punkte 5425

Ich habe keine ksh aber ich habe es geschafft, mit bash .

/home/galymzhan/.bash_profile :

export VAR_FROM_PROFILE="foobar"

/home/galymzhan/test.php :

#!/usr/bin/php -n
<?php
if (!isset($_SERVER['VAR_FROM_PROFILE'])) {
  $descriptors = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'));
  $process = proc_open('bash', $descriptors, $pipes);
  fwrite($pipes[0], escapeshellcmd('source /home/galymzhan/.bash_profile') . "\n");
  fwrite($pipes[0], escapeshellcmd('/home/galymzhan/test.php') . "\n");
  fclose($pipes[0]);
  echo "Output:\n";
  echo stream_get_contents($pipes[1]);
  echo "\n";
  fclose($pipes[1]);
  proc_close($process);
  exit;
}
print "Got env var {$_SERVER['VAR_FROM_PROFILE']}\n";
// Useful part of the script begins

Output, den ich habe:

[galymzhan@dinohost ~]$ ./test.php 
Output:
Got env var foobar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X