[PHP] Script reageert anders via Crontab dan CLI/Webbrowser

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 10-10 16:28
Ben met PHP bezig, en ik kom er momenteel helemaal niet meer uit. Ik heb een scriptje in elkaar geknutseld welke een lamp aanzet bij zonsondergang en uitzet bij zonsopkomst.

Dit werkt prima als ik het in m'n browser uitvoer (via Apache2) en als ik het uitvoer in de CLI als "php zon.php". Zodra ik hetzelfde script elke minuut wil laten uitvoeren via een cronjob werkt het niet 8)7 Via zowel de webbrowser als via CLI wordt netjes de GPIO poort aangepast als dat nodig is en schakelt mijn relais. Via de crontab wordt het relais niet geschakeld, terwijl volgens de output in zon.txt dit ook gebeurd moet zijn...

Mijn crontab is als volgt: * * * * * php /var/www/html/zon.php >> /var/www/html/zon.txt

Mijn crontab staat onder de user "pi", dezelfde user waarmee ik het op de CLI uitvoer. Via de webbrowser is het de user "www-data". Dit zou dus geen probleem moeten zijn...anyone? :X

Output is als volgt, maar niet geschakeld. Doe ik m'n cron commando via CLI dan krijg ik dezelfde output maar dan schakelt relais wel.
code:
1
[29-12-2015 22:36] Zon ondergegaan en status nog 0, op 1 gezet :-)


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
46
47
48
49
50
51
52
53
<?php
$bcm_pin                            = 4;

$huidige_tijd                       = date ( "U" );
$opkomst                            = date_sunrise ( time ( ), SUNFUNCS_RET_TIMESTAMP );
$ondergang                          = date_sunset ( time ( ), SUNFUNCS_RET_TIMESTAMP );

echo "[" . date ( "d-m-Y H:i" ) . "] ";

system                              ("gpio -g mode " . $bcm_pin . " out");
$huidig                             = exec ("gpio -g read " . $bcm_pin );

if ( $huidige_tijd > $opkomst AND $huidige_tijd < $ondergang )
{
    
    if ( $huidig == 1 )
    {
    
        system                      ("gpio -g write " . $bcm_pin . " 0" );
        
        echo                        "Zon opgekomen en status nog 1, op 0 gezet :-)";
        
    }
    else
    {
        
        echo                        "Het is licht en de lamp is al uit";    
        
    }
    
}
else
{

    if ( $huidig == 0 )
    {
    
        system                      ("gpio -g write " . $bcm_pin . " 1" );
        
        echo                        "Zon ondergegaan en status nog 0, op 1 gezet :-)";
        
    }
    else
    {
        
        echo                        "Het is donker maar de lamp is al aan"; 
        
    }
    
}

echo "\n"
?>

[ Voor 39% gewijzigd door WoBBeL op 29-12-2015 22:36 ]


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

xost schreef op dinsdag 29 december 2015 @ 22:32:
Mijn crontab is als volgt: * * * * * php /var/www/html/zon.php >> /var/www/html/zon.txt
Zet eens het volledige pad naar PHP (dus iets als /usr/bin/php) in je cron.

Wat is de output van /var/www/html/zon.txt na het draaien van de cron?

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 10-10 16:28
emnich schreef op dinsdag 29 december 2015 @ 22:36:
[...]


Zet eens het volledige pad naar PHP (dus iets als /usr/bin/php) in je cron.

Wat is de output van /var/www/html/zon.txt na het draaien van de cron?
Output heb ik in de OP gezet.
Aanpassen van "php" naar "/usr/bin/php" (wat de locatie is bij mij) mocht niks baten.

Als ik debug door get_current_user () mee te laten printen in de text file dan zie ik dat de cron ook door "pi" wordt gestart, dat lijkt dus goed te gaan. Het commando via CLI als de user "pi" gaat namelijk wel goed.

[ Voor 21% gewijzigd door WoBBeL op 29-12-2015 22:41 ]


Acties:
  • 0 Henk 'm!

  • base_
  • Registratie: April 2003
  • Laatst online: 18:43
Doe eens een phpinfo() via zowel .php als CLI en vergelijk die eens?
vaak gebruikt php een aparte php.ini voor CLI.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je doet ook helemaal niets aan error handling. Je kijkt niet naar return values, error reporting, de $return_var en $output argumenten van system() resp. exec.

Wellicht is je working dir anders of zoiets. Maar dat is een gok, doe eerst maar alles uit 1e alinea. ;)

O, en ik zou als ik jou was een wat algemener geaccepteerde style qua whitespace aanleren. :P

{signature}


Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 10-10 16:28
base_ schreef op dinsdag 29 december 2015 @ 22:42:
Doe eens een phpinfo() via zowel .php als CLI en vergelijk die eens?
vaak gebruikt php een aparte php.ini voor CLI.
Maar dat verklaart toch niet waarom ik hem zelf wel via de CLI kan starten maar crontab niet?
Voutloos schreef op dinsdag 29 december 2015 @ 22:43:
Je doet ook helemaal niets aan error handling. Je kijkt niet naar return values, error reporting, de $return_var en $output argumenten van system() resp. exec.

Wellicht is je working dir anders of zoiets. Maar dat is een gok, doe eerst maar alles uit 1e alinea. ;)

O, en ik zou als ik jou was een wat algemener geaccepteerde style qua whitespace aanleren. :P
Als ik error_reporting op E_ALL zet en display_errors op 1 dan krijg ik geen output meer in m'n zon.txt als ik via crontab run :X via CLI werkt het dan nog wel. Verder programmeer ik voor m'n hobby, ik weet dat m'n opmaak verre van juist is 8)7
Hoe doe ik error handling op die system en exec waardes? Moet ik kijken of die false zijn?

[ Voor 57% gewijzigd door WoBBeL op 29-12-2015 22:45 ]


Acties:
  • 0 Henk 'm!

  • base_
  • Registratie: April 2003
  • Laatst online: 18:43
gebruik je via de crontab dezelfde user?
op BSD draait bij mij zowiezo niet alles aangezien php daar geen normale shell heeft b.v.

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 10-10 16:28
base_ schreef op dinsdag 29 december 2015 @ 22:45:
gebruik je via de crontab dezelfde user?
op BSD draait bij mij zowiezo niet alles aangezien php daar geen normale shell heeft b.v.
Ja, als ik hem via crontab aanroep kan ik via PHP de user laten printen ,dan krijg ik de user "pi" en dat is dezelfde als ik hem handmatig via de CLI doe.

Acties:
  • 0 Henk 'm!

  • ThinkPad
  • Registratie: Juni 2005
  • Laatst online: 21:07
offtopic:
Voordat je je helemaal uitleeft en allerlei regels gaat schrijven in PHP-scripts; dit soort dingen is Domoticz - open source domotica systeem - deel 2 juist voor gemaakt. Even SD-image downloaden en gaan met die banaan.Timers (sunrise/sunset ook), events zit er allemaal in.

[ Voor 9% gewijzigd door ThinkPad op 29-12-2015 22:48 ]


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Doe ook even het volledige pad naar gpio in je php.

Acties:
  • 0 Henk 'm!

  • WoBBeL
  • Registratie: Juni 2004
  • Laatst online: 10-10 16:28
emnich schreef op dinsdag 29 december 2015 @ 22:48:
Doe ook even het volledige pad naar gpio in je php.
Dit was het mensen _/-\o_

Ik neem de tips ter harte en zal mijn code wat netter maken :)
ThinkPadd schreef op dinsdag 29 december 2015 @ 22:47:
offtopic:
Voordat je je helemaal uitleeft en allerlei regels gaat schrijven in PHP-scripts; dit soort dingen is Domoticz - open source domotica systeem - deel 2 juist voor gemaakt. Even SD-image downloaden en gaan met die banaan.Timers (sunrise/sunset ook), events zit er allemaal in.
Ik ken het systeem, maar dat was te bloated voor mij :) en ik durfde mijn PHP vraag daar niet te stellen

[ Voor 51% gewijzigd door WoBBeL op 29-12-2015 22:54 ]


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

xost schreef op dinsdag 29 december 2015 @ 22:52:
[...]


Dit was het mensen _/-\o_

Ik neem de tips ter harte en zal mijn code wat netter maken :)
Je probleem in de code is dat je checked op ==0 en ==1. Als system bijv false terug geeft ga je al de fout in.

Je kan beter ook even de return status van je command controleren. (naast de tips die al gegeven zijn...)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als volledige pad de fix was, lag het idd aan wat ik gokte he. O-)
emnich schreef op dinsdag 29 december 2015 @ 23:04:
Je probleem in de code is dat je checked op ==0 en ==1. Als system bijv false terug geeft ga je al de fout in.
false==0

Wat jij zegt is enkel als je stricter dmv === vergelijkt.
Je kan beter ook even de return status van je command controleren. (naast de tips die al gegeven zijn...)
Maar dit is inderdaad sowieso het betere idee.

Over hoe die argumenten werken: Het _enige_ voorbeeld op https://secure.php.net/manual/en/function.system.php doet het gebruik van $return_val al voor, dus je zou een heel eind moeten komen adhv de docs. :)

{signature}


Acties:
  • 0 Henk 'm!

  • _Peter2_
  • Registratie: November 2008
  • Laatst online: 10-10 11:30
Verschil tussen jobs via cron en vanuit je shell is dat via cron je niet al je environment variabelen worden geladen. (Ik vermoed dat je .<shell>rc en je profile niet worden geladen).

Diablo III: <GOT> Pteer#2475 --- POE: Dwergux


Acties:
  • 0 Henk 'm!

  • jekker
  • Registratie: Februari 2001
  • Laatst online: 11-10 22:08
Je kan ook ipv van cron ook het "at" command gebruiken, je haalt 1x per dag je opkomst en ondergang tijden op en draait het script vervolgens in een "at" command.

een wat nettere oplossing dan de hele dag een script te laten draaien.

Spicy!


Acties:
  • 0 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Voutloos schreef op woensdag 30 december 2015 @ 09:34:
[...]
false==0

Wat jij zegt is enkel als je stricter dmv === vergelijkt.
Ja en dat zal je dus ook moeten doen want 'error' == 0 of 'gpio not found'==0.

Als gpio een 1 of een 0 terug geeft dan zal je dat met === '0' moeten checken.
Pagina: 1