Php wil script niet uitvoeren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bart Maes

Bart Maes

13/05/2019 05:51:29
Quote Anchor link
Hallo, ik werk op een centos 7 server waarop php en apache geïnstalleerd zijn.
Ik wil dat wanneer iemand een button aanklikt er een Docker container opgestart wordt.

onder /var/www/html staat webscript.php
onder /var/www/cgi-bin staat docker_run.sh

webscript.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if($_POST["submitted"])
{
  
  exec ('/var/www/cgi-bin/docker_run.sh');
}

?>


<!DOCTYPE html>
<html>
<head>
    <title>?</title>
</head>
<body>
    <form method="post">
        <input type="hidden" name="submitted">
        <button type="submit">Run the script!</button>
    </form>
    <form action="exec(/var/www/cgi-bin/docker_run.sh)">
        <input type="submit" value="Open Script">
    </form>
</body>
</html>

docker_run.sh
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
#!/bin/bash

for i in {1..10}
 do docker run -name docker-nginx$i -P -d nginx
 sleep 3
done
Gewijzigd op 13/05/2019 08:37:10 door - Ariën -
 
PHP hulp

PHP hulp

25/08/2019 21:18:14
 
- Ariën -
Beheerder

- Ariën -

13/05/2019 08:32:20
Quote Anchor link
Wat doet die exec(...) in je action-attribute van je form? Zo voer je geen PHP uit.

Die laatste form is gewoon zinloos.
Gewijzigd op 13/05/2019 08:35:18 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

13/05/2019 16:03:44
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<input type="hidden" name="submitted">

Dit veld heeft geen value, dus dit if-statement:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if($_POST["submitted"])

Evalueert waarschijnlijk tot de waarde false. Daarmee wordt de inhoud van het if-statement blok ook niet uitgevoerd.
Gewijzigd op 13/05/2019 22:50:58 door Thomas van den Heuvel
 
Bart Maes

Bart Maes

14/05/2019 06:26:26
Quote Anchor link
Ok, zoals je kan zien ken ik er niet echt veel van ook al ben ik al dagen aan het lezen. Het laatste dat ik ooit gescript hebt, was nog in MS dos :)

Ik heb iets anders geprobeerd:

onder /var/www/html staat nu test.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_get['run']) {
  exec("test.sh");
}

?>


<!.. This link will add ?run=true to your URL, test.php?run=true -->
<a href="?run=true">Click me!</a>

mijn test.sh:
#!/bin/bash
sudo docker run -it ubuntu


Ik kan nu inderdaad in de browser op click me, maar er gebeurt niets?
 
- SanThe -

- SanThe -

14/05/2019 08:34:46
Quote Anchor link
$_get['run']

Moet met hoofdletters.

$_GET['run']
 
- Ariën -
Beheerder

- Ariën -

14/05/2019 11:39:38
Quote Anchor link
En is je test.sh ook wel uitvoerbaar?
En kijk ook eens wat de uitvoer is van je shell-script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  exec("test.sh",$output);
  echo "Uitvoer: ".print_r($output,true);
?>
 
Yoop Overmaat

Yoop Overmaat

14/05/2019 12:50:10
Quote Anchor link
Dat docker.sh script gaat niet werken want het script heeft het over een nginx terwijl je een apache2 geinstalleerd hebt.
 
Jelle Dnw

Jelle Dnw

14/05/2019 13:27:11
Quote Anchor link
Yoop Overmaat op 14/05/2019 12:50:10:
Dat docker.sh script gaat niet werken want het script heeft het over een nginx terwijl je een apache2 geinstalleerd hebt.


Waarom zou dat niet werken? Het gaat hier over nginx runnen in een docker container, dan maakt dat toch niet uit dat er apache op de hostmachine staat?

Toevoeging op 14/05/2019 13:30:24:

Misschien dit eens proberen:

Indien je script niet runt zou ik vooral wel gaan kijken of PHP rechten heeft om dat shell script uit te voeren. In de variabele $output wordt nu de output opgevangen en geprint op het scherm zodoende je verder kan debuggen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if ('POST' === $_SERVER['REQUEST_METHOD']) {  
  exec('/var/www/html/docker_run.sh', $output);
  var_dump($output);
}

?>


<!DOCTYPE html>
<html>
<head>
    <title>?</title>
</head>
<body>
    <form method="post" action="">
        <button type="submit">Run the script!</button>
    </form>
</body>
Gewijzigd op 14/05/2019 13:31:00 door Jelle Dnw
 
Thomas van den Heuvel

Thomas van den Heuvel

14/05/2019 17:34:11
Quote Anchor link
Jelle Dnw op 14/05/2019 13:27:11:
Indien je script niet runt zou ik vooral wel gaan kijken of PHP rechten heeft om dat shell script uit te voeren.

Dit kun je toch in afzondering testen en dat hoef je (in eerste instantie, om dingen te testen) niet te doen via een form submit? Dat pogingen om een form submit af te handelen falen vanwege gebrekkige kennis lijkt mij een apart probleem.

Separation of concerns mensen.

Daarnaast wil je ook terugkopppeling over wat (niet) werkt, dus maak je scripts verbose (mondig).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if (<een of andere conditie die je hebt verzonnen>) {
    echo 'werkt prima';
}
else {
    echo 'no soup for you'; // <-- nu weet je dat je zut niet werkt
}
?>
Gewijzigd op 14/05/2019 17:36:28 door Thomas van den Heuvel
 
Bart Maes

Bart Maes

14/05/2019 19:20:48
Quote Anchor link
Ok, ben nog aan het werk maar ga er straks mee aan de slag, bedankt voor alle reacties. Ik hou jullie op de hoogte.
 
Jelle Dnw

Jelle Dnw

15/05/2019 14:27:12
Quote Anchor link
Thomas van den Heuvel op 14/05/2019 17:34:11:
Dit kun je toch in afzondering testen en dat hoef je (in eerste instantie, om dingen te testen) niet te doen via een form submit? Dat pogingen om een form submit af te handelen falen vanwege gebrekkige kennis lijkt mij een apart probleem.

Separation of concerns mensen.

Daarnaast wil je ook terugkopppeling over wat (niet) werkt, dus maak je scripts verbose (mondig).
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if (<een of andere conditie die je hebt verzonnen>) {
    echo 'werkt prima';
}
else {
    echo 'no soup for you'; // <-- nu weet je dat je zut niet werkt
}
?>


Je webserver user kan een andere user/group zijn dan wanneer je het script via SSH test, vandaar dat ik het even aanhaalde. Dan heeft je afgezonderde test een andere uitkomst dan je test via de webserver user.

Die else kan je aanwenden om het wat mooier weer te geven, ik verkoos een var_dump omdat je dan ziet wat de output van je exec is. Beetje programmeur kan er dan uit afleiden of het wel/niet werkt. Tenzij je die docker containers door iedereen wil laten op starten, maar dat denk ik nu niet.

Daarnaast gebruik ik trouwens bijna nooit else statements.
"Avoid else, return early." is een gouden regel in OO programming.
Gewijzigd op 15/05/2019 14:34:47 door Jelle Dnw
 
Thomas van den Heuvel

Thomas van den Heuvel

15/05/2019 15:59:23
Quote Anchor link
Mja, maar op dit moment belemmert dat form gedoe hetgene wat je uiteindelijk wilt testen.

Wanneer je je PHP code (tijdens ontwikkeling) mondiger maakt heb je meer voelsprieten en kun je veel sneller dingen uitsluiten.

Op het moment dat je getest hebt dat je conditie op de juiste momenten true oplevert kan dat else-statement natuurlijk weg, ik heb ook nergens aangehaald dat je dit soort debugconstructies in je code zou moeten laten zitten.

Idealiter test je één ding zo min mogelijk dingen tegelijkertijd, dit om dingen simpel te houden, om nog maar eens een ontwikkelparadigma aan te halen.
Gewijzigd op 15/05/2019 16:21:23 door Thomas van den Heuvel
 
Jelle Dnw

Jelle Dnw

16/05/2019 09:06:24
Quote Anchor link
Ja, die var_dump was om de TS op weg te zetten om zijn script te debuggen. Daarna kan hij vanzelfsprekend verder aan de slag om alles aan te passen naar zijn eigen weldunken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.