[PHP] proc_open output stopt

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10
Ik heb een class gemaakt waarmee ik via php interactieve unix commando's kan aansturen. Met deze class heb ik al succesvol een telnet sessie aan kunnen sturen.

Hier is de code die gebruikt wordt om het proces te starten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function start()
{
    $descriptorspec = array(
        0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
        1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
        2 => array("pipe", "r")); // stderr is a file to write to
    $this->mProcess = proc_open($this->mCommand, $descriptorspec, $this->mPipes);

    if (is_resource($this->mProcess))
    {
        // don't block php-script while reading when there is nothing to read
        stream_set_blocking($this->mPipes[0], false);
        stream_set_blocking($this->mPipes[1], false);
        stream_set_blocking($this->mPipes[2], false);
    }

    return is_resource($this->mProcess);
}


Het probleem is nu dat als ik de class op de productie server neer zet en ik probeer een telnet sessie aan te sturen, dan krijg ik geen login meer. Het enige wat ik nog krijg is:
code:
1
2
3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Het proces draait nog wel. Als ik de login gegevens verstuur naar het proces en dan de opdracht geef om een directory aan te maken, dan zie ik die directory ook verschijnen. Maar ik krijg geen output meer van het proces.

Door wat te proberen met een apparte apache instantie, heb ik ontdekt dat het te maken heeft met het aantal apache logfiles dat geconfigureerd is. Als er meer dan 4 logfiles gebruikt worden, dan gaat het fout. En aangezien er 3 virtual hosts geconfigureerd zijn voor de betreffende apache configuratie, is dat net te weinig.

Nog wat overige informatie:
- Het gaat hier over php versie 4.3.4 en apache versie 2.0.48 draaiende op SunOS Solatis 5.9.
- Het aanmaken van een directory is gewoon een test case, niet het uiteindelijke doel.

Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

PHP 'erft' de fd's van Apache. De array die je als eerste vult dienen valide fd's te zijn. Het enige wat ik me kan bedenken is dat Apache fd 0,1,2 zelf in gebruik heeft. Een dirty hack zou zijn om de betreffende fd's gewoon even te sluiten voordat je bovenstaande code gebruikt.

De echte oplossing is daarna om FD's te pakken die niet in gebruik zijn.

[ Voor 7% gewijzigd door igmar op 15-12-2004 09:54 ]


Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10
Volgens mij zijn het de filedescriptors van het te starten proces (0 = stdin, 1 = stdout, 2 = stderr).
Ik heb toch eens geprobeerd om ze eerst te sluiten (via @fclose(0) etc.) maar dat werkte niet. Ook heb ik eens wat zitten spelen met de nummertjes, maar dat maakte het alleen maar erger. Ik kreeg dan helemaal geen output meer of kreeg de stderr binnen via de pipe waarop ik stdout verwachte.

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10
Ben nog wat verder aan het testen geweest en het lijkt er sterk op dat het probleem direct gerelateerd is aan telnet. Als ik andere commando's probeer (ls, find, du) dan gaat het namelijk wel goed. En als ik de output van telnet naar een bestand doorsluis, dan komt ook daar slechts een deel te staan.

Maar ik ben dus nog niets dichter bij een oplossing :(

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 20-09 23:02
Je stdout is writeonly en stderr readonly. Moeten ze niet allebei writeonly zijn?

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10
Daar heb ik ook al diverse combinaties geprobeerd. Maar volgens mij is dit zoals ik het van php.net gehaald heb. En, zoals ik in mijn vorige post ook al aangaf, met andere unix-commando's werkt het wel zoals verwacht.
Pagina: 1