Veranderen van PHP-code
Werkt perfect.
Nu wil ik de PHP-code veranderen van het voorbeeld project. (eerste keer dat ik PHP gebruik)
Als ik (om te beginnen) een simpel echo-statement of print statement toevoeg in de werkende PHP-module, dan krijg ik de run-time error:
localhost meldt het volgende: Something went wrong.
Wat moet ik nog doen om de wijziging te laten werken.
Wat doe je precies? En waar komt die (onduidelijke) melding vandaan?
Het voorbeeld project werkt perfect. Bestaat uit drie files: gpio.php, index.php en script.js. En natuurlijk de jpg-files voor de knoppen.
Nu wil ik de IO-aansturing veranderen in de file gpio.php. Deze file bevat een routine, die aangeroepen wordt als er een knop ingedrukt wordt.
Eerst heb ik een statement toegevoegd: echo ("button");
Daarna heb ik de Apache geherstart. En de browser gestart met localhost.
Als ik dan op een knop druk (op het scherm), dan wordt deze routine in de file gpio.php aangeroepen en komt meteen deze melding
Localhost meldt het volgende:
Something went wrong.
Toen heb ik dat opgezocht en er wordt iets verteld van development omgeving en productie omgeving.
Moet ik iets doen met 'make'? En met 'install'?
Lambert Mertens op 29/05/2019 12:26:58:
Moet ik iets doen met 'make'? En met 'install'?
Moet ik iets doen met 'make'? En met 'install'?
Nee zeker niet: het herstarten van Apache, of je device, was al overbodig!
Draai eerst die verandering in je script eens terug, en kijk of alles dan weer werkt. Daarmee sluiten we eerst uit dat het aan het herstarten ligt.
Dit heb ik verschillende maken herhaald.
hebt toegevoegd.
Dat is niet per se op elke plek mogelijk.
Bijvoorbeeld niet in een class-definitie.
Maar het kan ook zijn, dat je nu een output gegenereerd hebt op een plek waar PHP nog verwacht dat de buffer nog leeg is.
Als daarna nog een cookie geset moet worden bijvoorbeeld, dan krijg je een fout.
Eigenlijk een niet-fatale fout, maar gezien de melding kan het ook zijn dat er nog een laag bovenop php ligt. Dat is namelijk niet de foutmelding zoals PHP die normaal geeft
Toevoeging op 29/05/2019 13:59:32:
Wat voor pakket is het eigenlijk?
Ik denk dat gpio.php een file is waar je niet te veel in moet veranderen.
Zou zo maar een class kunnen zijn.
Ik had eerst aan het begin een echo-statement en daarna achteraan.
Ik heb ook een print-statement geprobeerd.
Het voorbeeldproject is:
https://www.instructables.com/id/Web-Controlled-8-Channel-Powerstrip/
Wat ik wil doen is, de code veranderen zodat er geen rechtstreekse koppeling meer is tussen de gebruikte knop en de IO-pin.
Bv nu is knop 0 gekoppeld aan IO-0.
Wil ik veranderen in: knop 0 is gekoppeld aan IO-2 (een klep) en aan IO-10 (de waterpomp)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( (is_numeric($pic)) && ($pic <= 7) && ($pic >= 0) ) {
//set the gpio's mode to output
system("gpio mode ".$pic." out");
//reading pin's status
exec ("gpio read ".$pic, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pic." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pic, $status, $return );
//print it to the client on the response
echo($status[0]);
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( (is_numeric($pic)) && ($pic <= 7) && ($pic >= 0) ) {
//set the gpio's mode to output
system("gpio mode ".$pic." out");
//reading pin's status
exec ("gpio read ".$pic, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pic." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pic, $status, $return );
//print it to the client on the response
echo($status[0]);
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
define('KLEPJE', 2);
define('WATERPOMP', 10);
$koppelen = ['0' => [KLEPJE, WATERPOMP]];
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( isset($koppelen[$pic]) ) {
foreach($koppelen[$pic] as $pinout) {
//set the gpio's mode to output
system("gpio mode ".$pinout." out");
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pinout." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//print it to the client on the response
echo('pin ' . $pinout . ' '.$status[0]);
}
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
define('KLEPJE', 2);
define('WATERPOMP', 10);
$koppelen = ['0' => [KLEPJE, WATERPOMP]];
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( isset($koppelen[$pic]) ) {
foreach($koppelen[$pic] as $pinout) {
//set the gpio's mode to output
system("gpio mode ".$pinout." out");
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pinout." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//print it to the client on the response
echo('pin ' . $pinout . ' '.$status[0]);
}
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
Toevoeging op 29/05/2019 14:43:26:
En als knop 3 gekoppeld moet worden aan pin 5 om een deur te openen dan worden de regels 6 tot en met 9
Code (php)
Gewijzigd op 29/05/2019 14:44:03 door Ivo P
Ga ik vanavond uitproberen.
Maar waarom deed het echo-statement het niet?
Kun je ook nog advies geven over een timer.
Uiteindelijk wil ik:
- knop 0 koppelen aan klep 0 en aan waterpomp, gedurende 30 minuten. (gras sproeien)
- Knop 1 koppelen aan klep 0 en aan waterpomp, gedurende 60 minuten (gras sproeien)
- Knop 2 koppelen aan klep 0 en aan waterpomp, gedurende 90 minuten (gras sproeien)
- Knop 3 koppelen aan klep 1 en aan waterpomp, gedurende 30 minuten (groententuin sproeien)
- Knop 4 koppelen aan klep 1 en aan waterpomp, gedurende 60 minuten (groententuin sproeien)
- Knop 5 koppelen aan klep 2 en aan waterpomp, gedurende 30 minuten (bloementuin sproeien)
- Knop 6 koppelen aan klep 2 en aan waterpomp, gedurende 60 minuten (bloementuin sproeien)
Als de timer afloopt kunnen alle outputs naar 0.
Hoe dan ook, het directe euvel / de directe aanleiding zou als het goed is in een errorlog moeten staan, heb je daar al in gekeken? Deze zou ergens onder /var/log/ moeten staan. Documentatie van Apache zou je hier ook verder wegwijs in kunnen maken.
Zelf doe ik zo iets met een poort: die heeft een puls nodig van 0.5 sec om te openen. (vergelijk deurbel)
en ook om te stoppen. (zolang hij niet vol open gaat na 10 sec.)
dus daar doe je dan bij te voet binnengaan:
PIN-0 naar 1
wacht 0.5 sec
PIN-0 naar 0
wacht 3 sec
PIN-0 naar 1
wacht 0.5 sec
PIN-0 naar 0
Dat heb jij ook nodig voor je sproeiers. Alleen: Apache is niet ingericht om zo lang als 30 minuten te gaan zitten wachten. Die is doorgaans na hooguit 30 sec. wel klaar.
Het kán wel, maar dan moet je een proces op de achtergrond aantrappen.
Dan kan Apache door en loopt het proces op de achtergrond door tot de tijd op is.
Bijvoorbeeld:
Code (php)
1
2
3
4
2
3
4
<?php $command = '/usr/bin/nohup /usr/bin/php /path/naar/je/script.php ' . $pinout. ' '. $tijd .
' > /dev/null & echo $!';
$PID = shell_exec($command);
?>
' > /dev/null & echo $!';
$PID = shell_exec($command);
?>
In script.php moet je dan via je programmatje gpio de pinnen schakelen en dan met sleep en./of een while-lus wachten tot je tijd verstreken is.
Is te doen, maar wijkt wel zo veel af van standaard gebruik van PHP dat ik me afvraag of je dat als kennismaking met PHP wilt doen
Of je maakt een crontab die elke minuut een triggerscript aanroept, en dan maak je een soort van tijdsschema die controleert of er iets moet gebeuren in dat specifieke tijdvak. Zul je wel een en ander in een database moeten bijhouden waarschijnlijk.
Localhost meldt het volgende:
Something went wrong.
Als ik de originele file terugzet, werkt alles weer. De foutmelding komt op het moment dat ik een toets activeer en dus als de file gpio.php wordt aangeroepen.
Ik heb geen meldingen in de error.log file.
De code is nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
define ('grasklep',0);
define ('groenteklep',1);
define ('bloemenklep',2);
define ('waterpomp',3);
$koppelen = [
'0' => [grasklep, waterpomp],
'1' => [grasklep, waterpomp],
'2' => [grasklep, waterpomp],
'3' => [groenteklep, waterpomp],
'4' => [groenteklep, waterpomp],
'5' => [bloemenklep, waterpomp],
'6' => [bloemenklep, waterpomp],
];
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( isset($koppelen[$pic]) ) {
foreach ($koppelen[$pic] as $pinout) {
//set the gpio's mode to output
system("gpio mode ".$pinout." out");
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pinout." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//print it to the client on the response
echo('pin' . $pinout . ' '.$status[0]);
}
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
//TheFreeElectron 2015, http://www.instructables.com/member/TheFreeElectron/
//This page is requested by the JavaScript, it updates the pin's status and then print it
//Getting and using values
define ('grasklep',0);
define ('groenteklep',1);
define ('bloemenklep',2);
define ('waterpomp',3);
$koppelen = [
'0' => [grasklep, waterpomp],
'1' => [grasklep, waterpomp],
'2' => [grasklep, waterpomp],
'3' => [groenteklep, waterpomp],
'4' => [groenteklep, waterpomp],
'5' => [bloemenklep, waterpomp],
'6' => [bloemenklep, waterpomp],
];
if (isset ( $_GET["pic"] )) {
$pic = strip_tags ($_GET["pic"]);
//test if value is a number
if ( isset($koppelen[$pic]) ) {
foreach ($koppelen[$pic] as $pinout) {
//set the gpio's mode to output
system("gpio mode ".$pinout." out");
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//set the gpio to high/low
if ($status[0] == "0" ) { $status[0] = "1"; }
else if ($status[0] == "1" ) { $status[0] = "0"; }
system("gpio write ".$pinout." ".$status[0] );
//reading pin's status
exec ("gpio read ".$pinout, $status, $return );
//print it to the client on the response
echo('pin' . $pinout . ' '.$status[0]);
}
}
else { echo ("fail"); }
} //print fail if cannot use values
else { echo ("fail"); }
?>
Ik heb gekeken naar de rechten van de files, en die liggen allemaal bij 'pi', dus dat klopt.
Toevoeging op 29/05/2019 21:33:51:
Ik heb eerst de declaraties toegevoegd, gesaved en getest. Toen kreeg ik geen fout.
Die kreeg ik pas toen ik de code veranderd had.
Betekent dit iets?
En hiermee bedoel ik in code, waar komt de frase "Something went wrong." precies vandaan.
Dat lijkt mij dan het startpunt van de verdere zoektocht.
Ook kan ik het mij niet voorstellen dat de error nergens gelogd wordt, dus daar zou ik nogmaals naar kijken. Of deze expliciet aanzetten, als je dat wel lukt zonder foutmeldingen :).
Om de bron van die melding te zoeken, raad ik aan om even wat code tijdelijk te isoleren door wat comments te plaatsen.