Seite 6 von 7

Re: PB Interpreter

Verfasst: 18.10.2009 16:49
von AND51
Blackskyliner hat geschrieben:Mal so nebenbei...
Zeile 95

Code: Alles auswählen

Define source$, exe$=GetTemporaryDirectory()+"pb-executable_"+RemoveString(script_filename$, "/")
Erzeugt unter Windows einen Fehler, da ich ja den Pfad zu PB mit einem Doppelpunkt angeben muss was ein nicht erlaubtes Sonderzeichen für Dateinamen ist.... Das muss unbedingt noch gefiltert werden über ein RemoveString(script_filename$, ":")
Hallo Blackskyliner,

Bin seit ca. einem Monat umgestiegen von Linux-Server/Strato zu Windows-Server/HostEurope.
Da du auch Windows benutzt, hoffe ich optimistischerweise, du hast auch den IIS statt Apache? Wenn ja könntest du mir erklären, wie ich meinen Interpreter da einsetzen kann? Ich habe es noch nicht ganz herausgefunden und bin noch am Tüfteln...

Re: PB Interpreter

Verfasst: 25.03.2010 08:02
von dysti

Re: PB Interpreter

Verfasst: 25.03.2010 14:10
von bobobo
rumbasteln am IIS dauert eben etwas länger

Re: PB Interpreter

Verfasst: 26.03.2010 01:08
von AND51
Hi,

die Seite gibt es tatsächlich nicht mehr. Habe es in der ganzen Zeit niht hinbekommen, PureBasic mit IIS zu verknüpfen. Ich habe es unzählige Male probiert, leider keinen Erfolg. Ich beabsichtige aber eh, wieder auf Linux umzusteigen, wo ich dann den PB Interpreter wieder ins Leben holen will.

Von daher wird sich denke ich mal die Entwicklung von meiner Seite aus auf Lnux konzentrieren. Und wenn dann Tag X gekommen ist, an dem ich wieder auf Linux umsteige, dann werde ich den Code wahrscheinlich auch neu schreiben um die neuen Features seit 4.30 zu nutzen, auch wenn der Code an sich schon sehr Performanz ist.

Re: PB Interpreter

Verfasst: 10.04.2010 12:02
von Bisonte
Hallo...

Ich hab mir das mal angesehen und muss sagen ... geniale Idee.

Dann wollt ich das ganze auch mal ausprobieren uund hab dann auch gleich die "Anfängerprobleme" nehm ich an.

Windows 7 und Xampp (Apache) sind am laufen.
Eintrag in der httpd.conf geändert in : AddHandler cgi-script .cgi .pl .asp .pb
Einfach mein PBinstallations-verzeichnis in das htdocs verzeichnis kopiert und das Interpreter Listing
kompiliert und dort ins Hauptverzeichnis kopiert. Also localhost/purebasic/interpreter.exe

nun eine test.pb gemacht, und versucht zu starten... nix.

test.pb

Code: Alles auswählen

#!\purebasic\interpreter

OpenConsole()

; IMPORTANT: A CGI-PROGRAM MUST GENERATE A HTTP-HEADER!!!
PrintN("Content-Type: text/html")   ; this is the
PrintN("")                          ; http-header with traling empty-line
PrintN("Hallo")  
ich bekomme nun laufend folgende Fehlermeldung :
Serverfehler!
Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
Premature end of script headers: test.pb
Im error.log von Apache steht :
Premature end of script headers: test.pb
Compilation process did not finish correctly. Error: "/EXECUTABLE: Unknown switch\r
".
Also gehe ich mal davon aus, dass der Pfad usw. korrekt eingetragen ist... Aber es scheint beim aufruf von
localhost/web2/test.pb nicht kompilieren zu wollen... aber das Consolefenster sehe ich kurz aufblitzen.

Was mache ich also falsch ?

P.S.: Das Interpreter Listing aus dem ersten Posting hab ich verwendet.
Edit : Und auch das Listing aus dem englischen Forum... Gleiches Ergebnis....

Re: PB Interpreter

Verfasst: 10.04.2010 14:58
von AND51
Einfach mein PBinstallations-verzeichnis in das htdocs verzeichnis kopiert und das Interpreter Listing
kompiliert und dort ins Hauptverzeichnis kopiert. Also localhost/purebasic/interpreter.exe
Die PB-Installation und der PB Interpreter an sich dürfen auch außerhalb des htdocs-Verzeichnisses liegen. Der PB Interpreter arbeitet nicht anders, wie auch auch ein Perl- oder PHP-Interpreter und diese liegen ja auch nicht im htdocs-Verzeichnis. Denn bedenke: Alle Inhalte in htdocs sind von außen zugreifbar, man könnte also deine PB-Installation von außen downloaden. Dies wäre eine signifikante Sicherheitslücke, da so jeder an deine Vollversion von PB kommt. Und das wollen wir doch nicht, oder?
Wenn du das ganze auf deinem Heimrechner machen willst, also nur so zu Testzwecken, dann kannst du theoretisch deine bereits vorhandene PB-Installation in C:\Programme\PureBasic benutzen. Besser dürfte es allerdings sein, du erstellst eine Kopie deiner PB Installation z. B. nach C:\PureBasic. Wichtig ist nur, dass sie sich in einem Verzeichnis befindet, auf die der Webserver bzw. der PB Interpreter zugreifen darf.
Diesen Pfad müsstest du dann an den Anfang des Skripts setzen. Da wir auf Windows arbeiten, musst du den kompletten Pfad benutzen, also nicht #!\purebasic\interpreter, sondern #!C:\PureBasic\interpreter.
ich bekomme nun laufend folgende Fehlermeldung :
Serverfehler!
Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
Premature end of script headers: test.pb
Der PB Interpreter verändert an der Ausgabe, die du mit deinem Skript erzeugst, nichts. Er reicht also den HTTP-Header, so wie du ihn erzeugst, samt aller anderen Daten an den Webserver wieder zurück. Dieser ist so freundlich und vervollständigt den HTTP-Header um alle nötigen Angaben, die der Client braucht. Gibst du aber nicht wenigstens den Content-Type zurück, kann der Server das schlecht selber hinschreiben, da er nicht weiß, ob du gerade eine HTML-Seite, ein Bild oder eine ZIP-Datei ausgibst. Auch wenn der PB Interpreter einen Fehler zurückgibt, ist die erste Zeile eine Fehlermeldung statt des erwarteten HTTP-Headers. Dies kreidet Apache auch an. Merke: Bei "Premature end of script headers" ist meist an dem Header was falsch.
Im error.log von Apache steht :
Premature end of script headers: test.pb
Compilation process did not finish correctly. Error: "/EXECUTABLE: Unknown switch\r
".
Schön, dass du zur error.log gefunden hast! Dort schreibt der PB Interpreter alle Fehlermeldungen rein. Tipp: Auch deine Skripte können in den error.log schreiben! Du weißt ja, es gibt stdin (Eingabe deines Programms), stdout (Ausgabe deines Programms) und stderr (Fehlerausgabe deines Programms). Mit Print() und PrintN() steuerst du stdout an. Seit Version 1.1 des PB Interpreters kannst du auch in den stderr schreiben mit ConsoleError(). So kannst du deine Skripte um Fehlermeldungen erweitern, wenn du z. B. eine Datei nicht öffnen kannst oder so.
Zurück zu diesem Problem: Öffne doch mal die Eingabeaufforderung cmd. Navigiere in das compilers-Verzeichnis deiner PB-Installation und führe "pbcompilers.exe /?" aus. Dort siehst du, dass die Parameter, die der PB Compiler akzeptiert geändert wurden. Kein Wunder, dass es bei dir nicht geht, denn PB 4.50 kennt kein /EXECUTABLE mehr. Es heißt jetzt /EXE. Bedenke: Ich habe den PB Interpreter mit PB 4.30 geschrieben und seitdem nicht mehr viel damit gemacht. Erst, wenn ich mich wieder mit PB beschäftige, kann ich den PB Interpreter an das aktuelle PureBasic anpassen. Damit du und alle anderen Fans des PB Interpreter aber in der Zeit nicht auf dem Schlauch steht, habe ich den PB Interpreter ja OpenSource gemacht und sogar ausführlichst kommentiert. So könnt ihr den PB Interpreter an eure Bedürfnisse anpassen.
Noch ein Tipp: hänge der Shebang-Zeile doch mal -w (seit v1.1) bzw. --warn (seit v1.5) an. Machen beide dasselbe, nur -w ist die Abkürzung für --warn. Ist dieser Parameter gegeben, versucht der PB Interpreter, Fehlermeldungen wie diese nicht nur im error.log zu schreiben, sondern auch im Browser auszugeben. So hat man die Fehlermeldung nicht nur im error.log, sondern gleich bequem auf dem Bildschirm. Hinweis: Dies sollte nur im Testbetrieb getan werden. Willst du eine Seite produktiv betreiben, würde ich mir dies überlegen, denn alle Fehlermeldungen, die einem Besucher angezeigt werden, sind möglicherweise Sicherheitsrisiken. Besonders, wenn der Besucher Pfade, Parameter oder sonstige Daten angezeigt bekommt.
Also gehe ich mal davon aus, dass der Pfad usw. korrekt eingetragen ist... Aber es scheint beim aufruf von
localhost/web2/test.pb nicht kompilieren zu wollen... aber das Consolefenster sehe ich kurz aufblitzen.

Was mache ich also falsch ?
Der Pfad scheint korrekt zu sein (siehe oben in diesem Posting). Aber ich verstehe trotzdem nicht, warum es auf deinem System mit diesem komischen Pfad funktioniert. Wie gesagt, ich würde sicherheitshalber den vollen Pfad hinschreiben. Das Konsolenfenster, welches du aufblitzen siehst, gehört zum PB Kompiler. Er wurde also erfolgreich vom PB Interpreter aufgerufen.
P.S.: Das Interpreter Listing aus dem ersten Posting hab ich verwendet.
Edit : Und auch das Listing aus dem englischen Forum... Gleiches Ergebnis....
Entschuldige, aber ich verstehe nicht, was du mit "Listing" meinst? Meinst du damit die aktuellste Version des PB Interpreters? Wie gesagt, bedenke, dass ich den PB Interpreter ursprünglich für Linux und in PB 4.30 geschrieben habe. Da PureBasic aber CrossPlattform-Kompatibel ist, kannst du den Code einfach nach Windows portieren. An deiner Stelle würde ich also den Code von Version 1.5 nehmen und ihn ggf. mit den Änderungen Linux->Windows und 4.30->4.50 anpassen.

Re: PB Interpreter

Verfasst: 11.04.2010 00:00
von Bisonte
Also das mit dem Anpassen ist nicht so ganz einfach ;)

Die Sache mit dem Switch hat sich erledigt ;) Das klappt noch... nun bekomme ich auch eine Compiler Ausgabe.
Allerdings nur mit -w in der Shebang-Zeile. Ohne -w wieder der Premature end of script headers Fehler.

Die Ausgabe ist :
Compilation process did not finish correctly. Error: "
Compiling C:\xampp\xampp\tmp\pb-executable_Cxamppxampphtdocsweb2test.pb.pb
Loading external libraries...
Starting compilation...
6 lines processed.
Creating executable "C:\xampp\xampp\tmp\pb-executable_Cxamppxampphtdocsweb2test.pb".
diese Dateien sind später auch im tmp verzeichnis von xampp, aber es erfolgt nicht die Ausgabe des scripts test.pb

Code: Alles auswählen

#!C:\purebasic\interpreter.exe -w

OpenConsole()
PrintN("Content-Type: text/html")
PrintN("")
PrintN("Hello from Purebasic 4.30 on your HTTP WebServer!")
auch sehe ich mittlerweile kein aufblitzen mehr des Consolefensters, aber Openconsole() ist noch drin, da ja sonst keine Meldungen kommen würden, wenn ich das richtig verstanden habe.

So wie ich das sehe, wird zwar kompiliert, aber dann ist irgendwo der wurm drin. nur wo ?

Re: PB Interpreter

Verfasst: 11.04.2010 22:30
von AND51
Also das mit dem Anpassen ist nicht so ganz einfach
Was genau ist denn so schwer? Wenn du weißt, wie genau der ganze Vorgang funktioniert, dann kannst du das ganz leicht anpassen. Ich erkläre es kurz:
Bild
  • Ein Besucher fordert eine in PB geschriebene Seite an (z. B. test.pb). Der Brwoser sendet seinen Request durchs Internet an den Webserver. Dieser merkt: "Hoppla, alle *.pb Dateien sind ja Skripte. Ich muss diese also durch den damit verknüpften Interpreter jagen, welcher mir daraus einen dynamischen Inhalt generiert."
  • Statische Objekte, z. B. HTML-Dateien, ZIP-Dateien oder TXT-Dateien werden sofort zurückgeliefert. Skripte, wie Perl, PHP oder PureBasic müssen gesondert behandelt werden, denn die Programmiersprache, in welcher das Skript geschrieben ist, kennt der Webserver nicht. Dafür gibts ja den Interpreter. Also ruft der Webserver über die CGI-Schnittstelle (CGI = Common Gateway Interface) den Interpreter auf (im Bild "Programm" genannt"). Bei PHP-Skripten ist das ein PHP-Interpreter, bei PB-Dateien ist das halt mein PB Interpreter, und so weiter.
    Alle Interpreter haben eines gemeinsam: Sie öffnen ein Konsolenfenster (OpenConsole()), in die der Webserver mittels RunProgram(#PB_Program_Open) und WriteConsoleData() diverse Informationen schreibt, unter anderem natürlich die Informationen, welche Datei der Besucher angefordert hat. Sonst weiß der Interpreter ja gar nicht, welche Datei er sich zur Brust nehmen soll.
  • Der Interpreter liest also (vereinfacht ausgedrückt mit Input()) diese Daten von der Programmeingabe, die man auch stdin nennt.
    • Dazu ruft der Interpreter den Compiler auf (im Bild "Daten" genannt (das Bild ist nicht von mir, sry)). Dies ist bei konventionellen Sprachen wie Perl oder PHP nicht so, denn diese Sprachen werden direkt interpretiert. PureBasic ist aber eine Hochsprache, die als EXE kompiliert werden muss, um zu funktionieren. (Deswegen ist PB genau genommen nicht für Webserver geeignet, weil das Kompilieren ein Extravorgang ist, der Zeit und Ressourcen braucht. Diesen Nachteil mache ich aber durch verschiedene Strategien wieder wett.)
    • Der Kompiliervorgang ist etwas heikel. Er kann klappen oder auch nicht. Falls nicht, versucht der Interpreter mit KillProgramm() die Notbremse zu ziehen, alles wieder auzuräumen und einen Fehler auszugeben. Der Interpreter hat auf den Kompiler keinen Einfluss. Falls also etwas schief läuft, kann der Interpreter gar nicht anders, als auszusteigen. Es ist zu komplexe Programmierarbeit, Fehler- und Erfolgsmeldungen des Kompilers (der seinerseits auch ein Konsolenfenster öffnet, in die der Interpreter die nötigen Informationen schreibt) auszuwerten. Die Fehlermeldungen sind für den Menschen gedacht und enthalten z. B. keine Fehlercodes, die man abgleichen könnte. Daher wird ein Fehler immer gänzlich dem error.log und ggf. Besucher mit --warn zugeführt, statt noch irgendwelche Rettungsmaßnahmen zu versuchen.
    • Der Compiler kompiliert test.pb also und gibt die Meldung zurück: "So, da haste deine EXE."
  • Der Interpreter ruft also die frisch kompilierte EXE auf, übergibt ihm z. B. Formulareinträge von der Webseite und erhält die Ausgabe (dies funktioniert auch wieder über ein Konsolenfenster).
  • Dann gibt der Interpreter die Ausgabe von test.pb wieder an den Webserver zurück.
  • Der Webserver gibt die Ausgabe an den Brwoser zurück.
Mit diesen Informationen kannst du meinen Source Code ganz einfach entlang gehen. Er ist ausführlich kommentiert, wobei oben erwähnter Ablauf mit erklärt wird. Die Anpassungen, die du vornehmen musst, sind gering und werden nur dadurch fällig, dass z. B. Pfadangaben anders geschrieben werden müssen. Wie gesagt, der Code ist primär für Linux konzipiert, auch wenn er komplett portierbar ist.


Wenn du den Source Code inklusive Kommentare genauer lesen würdest, würdest du feststellen, wo das Problem liegt:
Ich schrieb, dass die Statusmeldungen, die der Compiler ausgibt, zu komplex sind, als dass sie durch einfachen Programmcode ausgewertet werden können. Also betrachte ich nur 2 Fälle: Erfolg oder "nicht Erfolg". Alles, was nicht Erfolg ist, ist Fehler. Und bei Fehlern wird abgebrochen.
Um das zu erreichen benutze ich einen Trick. Ich benutze den Parameter /QUIET beim Compiler. Der sorgt dafür, dass kein Text ausgegeben wird, es sei denn, es trat ein Fehler beim Kompilieren auf. Mit anderen Worten: Ich lese am Ende des Kompiliervorgangs immer das Konsolenfenster des Kompilers aus (ReadProgramData()). Enthält die Ausgabe "" (Leerstring, nichts), dann war's ein Erfolg.

Dein Kompiliervorgang, den du zitiert hast, war laut Meldung erfolgreich, wird aber vom Interpreter (wie eben beschrieben) als Fehler behandelt. Deine Aufgabe ist es also, den pbcompiler.exe mal in der Kommandozeile aufzurufen, ob sich auch die Parameter geändert haben. Wie du ja gesehen hast, ist /EXECUTABLE ja zu /EXE geändert worden. Anschließend gehst du in den Source Code und nimmst dort ggf. Änderungen vor.

Re: PB Interpreter

Verfasst: 11.04.2010 23:45
von Bisonte
Vielen Dank für die Mühe, die ich gemacht habe ;) Nein im ernst...

Dank Deiner Veranschaulichung hab ich das jetzt begriffen. Mir war der Ablauf (Die Kette) nicht so ganz klar.

Besonders die Anregung :
Ich schrieb, dass die Statusmeldungen, die der Compiler ausgibt, zu komplex sind, als dass sie durch einfachen Programmcode ausgewertet werden können. Also betrachte ich nur 2 Fälle: Erfolg oder "nicht Erfolg". Alles, was nicht Erfolg ist, ist Fehler. Und bei Fehlern wird abgebrochen.
Um das zu erreichen benutze ich einen Trick. Ich benutze den Parameter /QUIET beim Compiler.
Ich hatte dann wohl die Sache mit den komplexen Statusmeldungen überlesen.
Ich hatte natürlich das /QUIET rausgenommen, da ich eine Meldung haben wollte. Nachdem ich das nun wieder
eingebaut hatte, lief das Ding endlich. Und ich hab mir schon das Hirn zermartert.... ;)

Dann hätte ich nur noch eine Frage ;)

Das OpenConsole()..... kann man es irgendwie umgehen, dass es aufblitzt (sich kurz in den Vordergrund drängt und den Fokus klaut) ?
Also entweder dauerhaft offen sein lassen, oder eben verstecken beim aufrufen wie mit HideWindows bei Fenstern ?

:praise: Ich lobe die obige ausführliche Antwort ! Dafür gibts den Erklärbär :praise:

Re: PB Interpreter

Verfasst: 12.04.2010 00:35
von AND51
Dank Deiner Veranschaulichung hab ich das jetzt begriffen. Mir war der Ablauf (Die Kette) nicht so ganz klar.
Das habe ich gemerkt. Aber mach dir nichts draus, vielen ist diese Kette nicht klar.
Wie gesagt, es lässt sich im Grunde auf dieses hier reduzieren:

Code: Alles auswählen

Browser --> Webserver --> CGI --> Interpreter --> Compiler --> Executable
Außer beim Browser muss man natürlich nur wissen, dass die ganzen Programme untereinander über Konsolen kommunizieren. Das ist das ganze Geheimnis! Soweit war ich beim Entwickeln des PB Interpreters auch schon. Man muss nur noch rausfinden, welche Parameter die Programme erwarten und was sie ausgeben.
Ich hatte natürlich das /QUIET rausgenommen, da ich eine Meldung haben wollte. Nachdem ich das nun wieder
eingebaut hatte, lief das Ding endlich. Und ich hab mir schon das Hirn zermartert.... ;)
Natürlich darfst du gerne das /QUIET rausnehmen. Aber dann musst du die Ausgabe des Compilers auswerten. Und wie gesagt, diese Auswertung ist mir zu kompliziert und lohnt sich meiner Meinung nach auch nicht. Was bringt es dir oder dem Besucher, wenn der Compiler meckert, dass Library XY nicht gelinkt werden konnte? Also: Entweder Erfolg oder Fehler.
Wenn du das /QUIET rausnehmen möchtest, müsstest du die Compilerausgabe prüfen, ob sie den String "Creating executable XY" enthält. Das ginge per FindeString() oder MatchRegularExpression(). Aber: Diese Untersuchung kostet Zeit. Vielleicht nur Millisekunen, aber dennoch ist es meiner Meinung nach nicht lohnend.
Dann hätte ich nur noch eine Frage ;)

Das OpenConsole()..... kann man es irgendwie umgehen, dass es aufblitzt (sich kurz in den Vordergrund drängt und den Fokus klaut) ?
Also entweder dauerhaft offen sein lassen, oder eben verstecken beim aufrufen wie mit HideWindows bei Fenstern ?
Auflassen geht. Dafür müsstest du in deinem Skript (test.pb), ein Input() setzen, da dein test.pb ja eine Konsolenanwendung ist.
Aber wozu?
Du möchtest ja eh nicht in den Prozess eingreifen, also kannst du das Fenster natürlich verstecken. Das geht ganz einfach: Mit #PB_Program_Hide!
Such dir einfach die RunProgram()-Zeile, wo der PB Interpreter das Executable aufruft und füge diese Konstante noch mit ein. Ach ja: Und dann versteck doch auch das zweite Konsolenfenster, welches ja vom Kompiler immer erstellt wird!
:praise: Ich lobe die obige ausführliche Antwort ! Dafür gibts den Erklärbär :praise:
Vielen Dank!! :D
Ich freue mich riesig über dieses Lob! Sowas gibt mir die Motivation, weiter zu machen.
Zugegeben: Zurzeit arbeite ich gar nicht mehr mit PB (schon seit 4.30 nicht mehr), mangels Zeit. Aber ich träume davon, von meinem popeligen Windows-Server wieder auf einen Linux-Server umzusteigen. Sollte ich dann eine Webseite bekommen, möchte ich sie gern in PB umsetzen.




Mal eine Gegenfrage: Wie weit hast du die Arbeitsweise des PB Interpreters denn verstanden? :wink:

Pro Seitenaufruf (!) eines Skriptes schmeißt der Webserver den PB Interpreter an und dieser wiederum ruft den Compiler und anschließend das Executable auf. Nach dem Aufruf der EXE wird diese in v1.0 wieder gelöscht, um Speicherplatz (kostbaren Webspace) freizugeben. Dieses Verhalten wird auch durch den Parameter -f bzw. --force in späteren Versionen erzwungen.

Nachteil: Diese Routine kostet extrem viel Zeit. Auf meinem kleinen virtuellen Server damals mehr als 250 ms, bis die HTML-Ausgabe an den Browser gesendet wird!

Daher lösche ich die Executables ab Version 1.1 standardmäßig nicht mehr. Sie bleiben im Temp-Ordner. Beim Aufruf werden sie einfach erneut ausgeführt und das ist der Clou: Die Zeit bis der Webserver dem Client eine Antwort senden kann fällt auf unter 1 ms! (Auf meinem Server jedenfalls.) Dies ist sogar schneller als gewöhnliche PHP- oder Perl-Skripte! Wieso? Nun, ein Skript zu interpretieren ist immer zeitaufwändiger (einlesen, auswerten, ausführen), als eine fertig kompiliertes Executable auszuführen, denn dieses wurde bereits einmal eingelesen und ausgewertet. Ich habe den PB Interpreter sogar so programmiert, dass er das Executable automatisch neu kompiliert, wenn sich der Source Code seit der letzten Kompilation verändert hat (ÄnderungsdatumSkript > ErstellungsdatumExecutable). Wenn das kein Service ist!
Nachteil: Da die Executables auf der Festplatte behalten werden (auch wenn es das Temp-Verzeichnis ist) wird doppelt Speicher belegt, denn einmal brauchen die Skriptdateien und das Executable Platz. Aber du erkennst meinen guten Willen: Ich habe die Möglichkeit eingebaut, die Executables mit UPX komprimieren zu lassen (Parameter -c bzw. --compress).

Die Zeit, die zur Erstellung des Executable benötigt wird, wird vom PB Interpreter gemessen und deinem Skript als Environmentvariable zur Verfügung gestellt. Wenn du in deinem Skript also

Code: Alles auswählen

Print(GetEnvironmentVariable("PB_Interpreter_CreationTime")
schreibst, siehst du die Anzahl der Millisekunden, die es brauchte, vom Aufruf des Interpreters durch den Websever, über den Kompilierungsvorgang bis zum Aufruf des Executable.
Tipp: Geh mal den Source Code durch und schau, welche nützlichen PB_Interpreter_* Umgebungsvariablen der Interpreter deinen Skripten zur Verfügung stellt!

Ich als PB Interpreter versuche stets, dir als PB Skript möglichst viel Arbeit abzunehmen und Informationen zur Verfügung zu stellen.
Tipp: Der Webserver Apache stellt einem Skript in Form von Umgebungsvariablen ebenfalls relevante Infos zur Verfügung (REMOTE_ADDR, QUERY_STRING, usw.). Diese werden eigentlich dem Interpreter übergeben, aber dieser vererbt sie automatisch auch an dein Executable, welches diese Environment-Variablen auslesen kann.


Tipp: Die QUERY_STRING Umgebungsvariable enthält die URL-Parameter. Mein PB Interpreter wertet diese automatisch aus und stellt sie deinem Skript zur Verfügung. Das heißt: Wird die Seite test.pb?name=Peter&alter=23 aufgerufen, werden deinem Skript die Environmentvariablen GET_name und GET_alter zur Verfügung gestellt. Diese kannst du mit GetEnvironmentVariable() lesen.
Der Source Code des PB Interpreters hat geschrieben:

Code: Alles auswählen

; for convenience, we provide all QUERY_STRING-parameters as environment variables for the program:
; the URI "www.and51.de/index.pb?site=downloads&sort=asc" would create the environment variables
; "GET_site" with the value "downloads" and "GET_sort" with "asc". then you can easily catch them with the
; GetEnvironmentVariable() command. caution: you must decode them manually if neccessary with URLDecoder()
If GetEnvironmentVariable("QUERY_STRING") And GetEnvironmentVariable("REQUEST_URI") ; check first param, but extract informations from second param
   Define query_exp=CreateRegularExpression(#PB_Any, "(?U)(?<=&).+(?==)")
   Dim querystrings.s(0)
   Define i, n=ExtractRegularExpression(query_exp, "&"+GetEnvironmentVariable("QUERY_STRING"), querystrings())
   For i=1 To n
      SetEnvironmentVariable("GET_"+querystrings(i-1), GetURLPart(GetEnvironmentVariable("REQUEST_URI"), querystrings(i-1)))
   Next
   SetEnvironmentVariable("PB_Interpreter_QueryStrings", Str(n))
EndIf
Wie gesagt, ein Blick in den Source Code offenbart so einiges! Setz dich ruhig mal mit nem Kakao davor und zieh dir das als Roman rein :wink:
So viel zu meiner Frage, wie weit du die Arbeitsweise des PB Interpreters nachvollziehen kannst.