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?