Aus Bash Skript PHP mit Variable aufrufen

  • In meiner Webseite habe ich eine PHP Datei die aufgerufen wird und über $GET eine Variable übertragen wird.

    Darin werden alle Rollor nacheinander hoch oder runter gefahren, je nachdem welchen Wert ich über $GET mitgebe.


    Jetzt möchte ich das erweiten, sodas sie bei Sonnenaufgang bez Sonnenuntergang entsprechend öffnen oder schließen.


    Mein Problem liegt jetzt in der Datei "Sonne_Aufgang_Vergleich.sh"

    wo ich die entsprechende Rollor.php Script aufrufe.


    Sonne_Aufgang_Vergleich.sh

    Nur so bekomme ich die Fehlermeldung:


    Could not open input file: /var/www/html/rollor/Rollor.php?alle=1

    Zur Info mit alle= 1 bez. 2 wird festgelegt ob die Rollor sich öffnen oder schließen.


    Kann mir einer helfen, wie ich die Zeile ändern muss? Habe schon stundenlang gesucht, aber keine Lösung finden können.

    • Official Post

    Tell Eigentlich müsste das imho funktionieren, wenn php-cli installiert ist, was eigentlich bei einer PHP-Installation automatisch dabei ist. (Edit: Das war Quatsch.)


    //Edit


    cUrl war übrigens auch mein erster Gedanke. ;)


    Robby Womit und wie wird eigentlich das bashskript aufgerufen?

  • Erst einmal Danke für eure schnelle Antwort.

    Das Gefühl hatte ich auch schon das es als komplettes File aufgerufen wird.


    so kann ich das Script aufrufen

    Code
    sudo php /var/www/html/rollor/Rollor.php

    aber so kommt auch auf der Konsole die Fehlermeldung

    Code
    sudo php /var/www/html/rollor/Rollor.php?alle=1

    Das Script "Sonne_Aufgang_Vergleich.sh" wird je minute über crontab aufgerufen

  • Warum machst du dass den so?

    Ermittle um kurz vor 2:00 Uhr nachts die Sonnenaufgangszeit für diesen Tag und setzte für diese Zeit mittels "at" einen AT-Job, der dann das Rollo aufgehen lässt.

    Bash
    #!/bin/bash
    #import time
    read Datumaufgang Sonnenaufgang  Datumuntergang Sonnenuntergang  AufgangWert UntergangWert< ../../../../../tmp/Sonne.dat
    #/bin/echo $AktuelleZeit
    /usr/bin/php /var/www/html/rollor/Rollor.php?alle=1|at ${AktuelleZeit}

    Wobei der Pfad zu "../../../../../tmp/Sonne.dat" absolut sein sollte und zu überlegten ist, ob das ganze wirklich per "sudo" aufzurufen ist.


    Doch ein einem Cronjob sind absolute Pfade, auch vor dem aufzurufenden Programm, Pflicht.

    Selber denken,
    wie kann man nur?

  • Rasp-Berlin

    Danke für die Info, wäre eine Möglichkeit.

    Aber ich habe im Moment immer noch das Problem, das die Variable alle=1 nicht mit übergeben wird. Und ob ich die Zeile mit oder ohne sudo aufrufe bringt keine Änderung.

  • Robby ”Variablen” werden an Programme ja auch nicht übergeben in dem man sie an den Dateinamen anhängt. Shell und Dateinamen sind halt etwas anderes als Browser und URLs.

    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson

  • Aber ich habe im Moment immer noch das Problem, das die Variable alle=1 nicht mit übergeben wird.

    Lass dir doch, als ersten, von dem Script "/var/www/html/rollor/Rollor.php" ausgeben, wie welche Variablen gesetzt sind. Gibt es vielleicht einen anderen Fehler im Script, so dass dieses vorher abgebrochen wird?

    Wie sieht es aus, wenn du es im Webbrowser aufrufst? Kommentare im Script für diesen Fall nicht vergessen, um zu sehen, wie weit es läuft.

    Selber denken,
    wie kann man nur?

  • Rasp-Berlin

    Danke für deine Infos, aber so kompliziert war der Fehler nicht. Wie ich vermutete lag es an den Aufruf des Script.

    hyle

    Danke für den Code, das war genau das ich brauchte. Jetzt läuft alles so wie ich es haben wollte.


    Ich weiß das ich es auch etwas anders hätte machen können, aber dazu hätte ich meine ganze Web Seite umändern müssen und das wollte ich vermeiden. Da die Steuerung über Web schon einige Zeit läuft und dies hier als Ergänzung vorgesehen war.

  • Zur Ergänzung :


    Vom Web, z.B.

    http://xxx/test.php?wert=ersterwert&wert2=zweiterwert


    Auf der CMD :

    php /pfad/zum/script/test.php ersterwert zweiterwert

    Hier werden die Argumente mit $argvoder $getopt geholt.

    Ein Beispiel in einem Script welches sowohl vom Browser als auch der CLI aufgerufen wird :

    Code
    if (defined('STDIN')) {
      $type = $argv[1];
    } else { 
      $type = $_GET['type'];
    }

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Code
    if [ $AktuelleZeit -eq $AufgangWert ] 
    then 
        sudo php /var/www/html/rollor/Rollor.php?alle=1 
    fi


    Das ist zwar nicht die Ursache des Problems, aber kann es sein, dass du das Shell-Script jede Minute aufrufst?

    Du vergleichst $AktuelleZeit mit $AufgangWert auf Gleichheit -eq. D.h. wenn du die Minute verpasst in der das passiert, passiert gar nichts.


    Eigentlich könntest du das Script auch in PHP schreiben und dann mit Kommandozeile aufrufen.

    Dann ist noch zu klären, ob "Rollor.php?alle=1" ein GET- oder POST-Request sein muss.

    Richtig wäre ein post request, da der Zustand geändert wird.


    Auf jeden Fall solltest du curl oder wget verwenden, um die Rollos zu steuern.

  • Und ein File namens /var/www/html/rollor/Rollor.php?alle=1 existiert nicht

    An php können auch querys übergeben werden, sofern du den php cli nutzen würdest.

    Eigentlich reicht es aber aus curl zu verwenden oder läuft bei dir kein Webserver?


    hyle hatte bereits ein Beispiel gegeben.

  • An php können auch querys übergeben werden, sofern du den php cli nutzen würdest.

    Eigentlich reicht es aber aus curl zu verwenden oder läuft bei dir kein Webserver?


    hyle hatte bereits ein Beispiel gegeben.


    Ja, aber auf der CLI geht das ohne ? und wert=
    Außerdem werden diese im Script anders abgefragt, siehe meinen Post oben.

    Fakt ist

    php /var/www/html/rollor/Rollor.php?alle=1 geht nicht.

    php /var/www/html/rollor/Rollor.php 1 geht, allerdings im Script kein $_REQUEST["alle"] sondern $argv[1].

    wget oder curl  /var/www/html/rollor/Rollor.php?alle=1 geht nicht.

    wget oder curl http://bla.bla/Rollor.php?alle=1 funktioniert.


    Ist doch gar nicht so schwer.

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Auch wenn es schon glöst ist, was passiert den mit.

    *edit* hab gerade in der History geschaut nicht php-cli sondern php-cgi


    php-cgi /var/www/html/rollor/Rollor.php alle=1


    PS: wenn ich teste ging das immer so, obwho ich im Ordner war php-cgi Rollor.php alle=1. Es kann auch sein das php-cgi7.2 sein muss :)

  • Nennt man query-string.


    Bei http://xxx?all=1 wird z.B. dem Key "all" der Wert "1" zugewiesen.

    Bei Argumenten ist das nicht so. Die Argumente sind ein array und kein mapping.


    Array: Sequenz mit Strings

    Mapping: Strings, die auf andere Strings zeigen
    Ich schreib das dabei, da ich Begrifflichkeiten von PHP nicht kenne.
    Da gibt es signifikante Unterschiede zu Python.


    PHP: test_args.php
    <?php
    print($argv[1] . "\n");
    ?>
    Code
    public@miranda:~$ php test_args.php all=1
    all=1
    public@miranda:~$ php test_args.php all 1
    all


    Man braucht aber die Zuordnung "all" -> "1".

    Wie das ungefähr geht, hat Der_Imperator bereits erwähnt.


    Eigentlich will ich gar nichts von PHP wissen....

  • php-cgi /pfad/zum/script/file.php <> php /pfad/zum/script/file.php

    mit php rufst du das PHP command Line Interface auf.

    Mit php-cgi rufst du das PHP Common Gateway Interface auf.
    Das sind zwei verschiedene Dinge !!

    Mit php-cgi werden aufrufe wie /var/www/html/rollor/Rollor.php alle=1 in $_GET abgelegt.
    php hingegen füllt nicht das $_GET sondern legt dies in $argv

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?


    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.