kostenloser Webspace werbefrei: lima-city


PHP Script im Hintergrund starten

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Hallo. Ich möchte gerne unter gewissen Bedingungen einen PHP Script starten, der im Hintergrund läuft und einige Sachen bezüglich Datenbanken und FTP macht. Das dauert im Durchschnitt 10 Sekunden und so lange soll der Nutzer nicht warten müssen.
    Also habe ich mir gedacht, es wäre eine super Idee, eine Meldung auszugeben und den eigentlichen Script im Hintergrund weiter laufen zu lassen.

    Ich habe diesbezüglich schon ein wenig gegooglet, aber nichts hat hier funktioniert. Deshalb frage ich das hier. Ich möchte den Script starten und gleichzeitig wissen, ob er noch läuft oder nicht. Also falls während er läuft noch andere auf die Seite zugreifen, dass zum einem der Script nicht nochmal gestartet wird und dass sie zum anderen auch die selbe meldung erhalten.

    Wie setzte ich das am besten um?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. projekt-brainstorming schrieb:
    Hallo. Ich möchte gerne unter gewissen Bedingungen einen PHP Script starten, der im Hintergrund läuft und einige Sachen bezüglich Datenbanken und FTP macht. Das dauert im Durchschnitt 10 Sekunden und so lange soll der Nutzer nicht warten müssen.
    Also habe ich mir gedacht, es wäre eine super Idee, eine Meldung auszugeben und den eigentlichen Script im Hintergrund weiter laufen zu lassen.

    Ich habe diesbezüglich schon ein wenig gegooglet, aber nichts hat hier funktioniert. Deshalb frage ich das hier. Ich möchte den Script starten und gleichzeitig wissen, ob er noch läuft oder nicht. Also falls während er läuft noch andere auf die Seite zugreifen, dass zum einem der Script nicht nochmal gestartet wird und dass sie zum anderen auch die selbe meldung erhalten.

    Wie setzte ich das am besten um?
    das machst du am besten mit php-cli. allerdings nicht auf dem lima-server, sondern auf deinem eigenen, wovon du auf lima auf diese art einwirken kannst. um genaueres dazu zu sagen, brauchen wir genauere angaben von dir ;)
  4. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Ich habe leider nur einen Lima-City Server.

    Also mein Script soll meinen Download FTP-Account durchsuchen und das ergebnis in einer Datenbank eintragen. Das dauert leider etwas zu lang. Deshalb möchte ich das gerne als gesonderten Script im Hintergrund starten und so lange er läuft soll der Client immer eine kleine Meldung erhalten.

    Welche Infos bräuchtest du noch?

    Also dieser Skript sollte aus einem anderen PHP-Script heraus ausgeführt werden.

    Beitrag zuletzt geändert: 29.9.2013 15:49:45 von projekt-brainstorming
  5. projekt-brainstorming schrieb:
    Ich habe leider nur einen Lima-City Server.

    Also mein Script soll meinen Download FTP-Account durchsuchen und das ergebnis in einer Datenbank eintragen. Das dauert leider etwas zu lang. Deshalb möchte ich das gerne als gesonderten Script im Hintergrund starten und so lange er läuft soll der Client immer eine kleine Meldung erhalten.

    Welche Infos bräuchtest du noch?
    du wirst doch einen computer bei dir zu hause haben!? wenn ja, dann kannst drauf php installieren, das reich allein für die von dir beschriebene aufgabe.
  6. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Du scheinst das falsch verstanden zu haben.

    Ich möchte, dass ein PHP Skript auf meinem Lima-City Server unter bestimmten Bedingungen ausgefürht wird. Diese Bedingungen werden nicht manuell ausgelöst, sondern können praktisch jeder Zeit passieren. D.h. Ich sitze nicht zwangsläufig an meinem Rechner, wenn das passiert.

    Wenn die Bedingungen getroffen werden, soll der Skript einmal gestartet werden. Alle anderen Seiten sollen in der Zeit eine klein Meldung ausgeben. D.h. ich muss wissen, ob der Skript noch läuft. Wie mache ich das.

    Der PHP-Skript muss leider wirklich hier auf dem Server laufen. ich hab schon ein wenig mit shell_exec und exec rumprobiert, aber nichts will klappen.

    Beispiel:

    shell_exec("echo test >> log.txt");
    exec("echo test >> log.txt");
    shell_exec("echo test >> /home/webpages/lima-city/projekt-brainstorming/html/download/log.txt");
    exec("echo test >> /home/webpages/lima-city/projekt-brainstorming/html/download/log.txt");


    Nichts davon will klappen. Die Datei wird nicheinmal erstellt. Wenn ich die Datei von Hande erstelle, klappts auch nicht!

    Beitrag zuletzt geändert: 29.9.2013 16:11:09 von projekt-brainstorming
  7. projekt-brainstorming schrieb:
    Du scheinst das falsch verstanden zu haben.
    wohl eher nicht ;)


    - du kannst (wie du sagtest) auf dem lima-server keinen script 'länger' laufen lassen. er wird erbarmungslos abgebrochen, ein gegenwirken deinerseits ist nicht vorgesehen.

    - für aufgaben, die durch ereignise gesteuert mal laufen und dann wirder nicht, eignet sich am besten der eigene rechner. du musst dabei nicht einmal den bildschirm einschalten um das ganze zu kontrollieren. dein script rennt und rennt, testet und testet und falls nötig erledigt dies und das!

    - über den eigenen zustand (rennt/nicht-rennt o. was auch immer) kann dein script dann ein notiz am lima-server (von mir aus in einer textdatei o. aber auch in einer datenbank) für die applikationen auf deinem lima-space hinterlassen.

    - summa summarum, dein script nicht nur nicht am lima-server laufen muss, sondern vorzugsweise auf deinem rechner und bloß nicht in einem web-interface sondern vom commandline (vulgo cli)!

    natürlich shell_exec (aund ein haufen firlefanz noch [siehe 'phpinfo();']) ist aus sicherheitgründen gesperrt. aber wie gesagt, all das ist überhaupt kein hindernis, dass du fast all das machen kannst, was verboten ist. nur wie gesagt von dir zu hause. klar, du musst dafür schon ein bisschen rumprogrammieren ;)
  8. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Gibt es da wirklich keine Lösung? Die lokale lösung würde ich gerne tunlichst vermeiden, da damit sher viel schiefgehen kann!
  9. projekt-brainstorming schrieb:
    Gibt es da wirklich keine Lösung? Die lokale lösung würde ich gerne tunlichst vermeiden, da damit sher viel schiefgehen kann!
    mann! du bist ein harter nuss ;)
    für die beispiele von dir brauchst du kein (shell_)exec!
    statt
    exec("echo test >> log.txt");
    kannst ruhig sagen
    file_put_contents('./log.txt', 'log_content', FILE_APPEND);

    eine pseudo_hintergrund-process kannst - aber auch schon wieder von außen - mit cronjobs machen (nach anbieter googlen), die allerdings regelmäßig und nicht ereignisgesteuert auf dem lima-server ausgeführt werden.

    ja. und was, wenn der cronjob-server ein mittagsschläfchen macht? internetlösungen sind so und so unsicher. dann ist es besser wenn etwas auf dem eigenen rechne flöten geht. den kannst ja einrichten auch so, dass er im fall des falles neustartet!
  10. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    @czibere: Nach einer dreistündigen Suche habe ich endlich die Lösung gefunden:

    Man sendet einfach ein stinck normales HTTP-Request an den entsprechenden Skript und wartet nicht darauf, dass dieser endet. Folgenden Code verwende ich dafür:

    function curl_request_async($url, $params=array(), $type='POST')
    {
      foreach ($params as $key => &$val) {
        if (is_array($val)) $val = implode(',', $val);
          $post_params[] = $key.'='.urlencode($val);
      }
      $post_string = implode('&', $post_params);
      
      $parts=parse_url($url);
      
      $fp = fsockopen($parts['host'],
          isset($parts['port'])?$parts['port']:80,
          $errno, $errstr, 30);
      
      // Data goes in the path for a GET request
      if('GET' == $type) $parts['path'] .= '?'.$post_string;
      
      $out = "$type ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
      $out.= "Content-Length: ".strlen($post_string)."\r\n";
      $out.= "User-Agent: Some special agent\r\n"; // Use if needed
      $out.= "Connection: Close\r\n\r\n";
      // Data goes in the request body for a POST request
      if ('POST' == $type && isset($post_string)) $out.= $post_string;
      
      fwrite($fp, $out);
      fclose($fp);
    }


    Wer hätte gedacht, dass es so leicht geht!

    Verwendung:

    curl_request_async("http://irgendeineseit.blub/pfad");
    curl_request_async("http://irgendeineseit.blub/andererpfad", array("mit" => "parametern", "gehts" => "auch!"));


    Beitrag zuletzt geändert: 29.9.2013 19:44:14 von projekt-brainstorming
  11. projekt-brainstorming schrieb:
    @czibere: Nach einer dreistündigen Suche habe ich endlich die Lösung gefunden:

    Man sendet einfach ein stinck normales HTTP-Request an den entsprechenden Skript und wartet nicht darauf, dass dieser endet. Folgenden Code verwende ich dafür:

    function curl_request_async($url, $params=array(), $type='POST')
    {
      foreach ($params as $key => &$val) {
        if (is_array($val)) $val = implode(',', $val);
          $post_params[] = $key.'='.urlencode($val);
      }
      $post_string = implode('&', $post_params);
      
      $parts=parse_url($url);
      
      $fp = fsockopen($parts['host'],
          isset($parts['port'])?$parts['port']:80,
          $errno, $errstr, 30);
      
      // Data goes in the path for a GET request
      if('GET' == $type) $parts['path'] .= '?'.$post_string;
      
      $out = "$type ".$parts['path']." HTTP/1.1\r\n";
      $out.= "Host: ".$parts['host']."\r\n";
      $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
      $out.= "Content-Length: ".strlen($post_string)."\r\n";
      $out.= "User-Agent: Some special agent\r\n"; // Use if needed
      $out.= "Connection: Close\r\n\r\n";
      // Data goes in the request body for a POST request
      if ('POST' == $type && isset($post_string)) $out.= $post_string;
      
      fwrite($fp, $out);
      fclose($fp);
    }


    Wer hätte gedacht, dass es so leicht geht!

    Verwendung:

    curl_request_async("http://irgendeineseit.blub/pfad");
    curl_request_async("http://irgendeineseit.blub/andererpfad", array("mit" => "parametern", "gehts" => "auch!"));
    das ganze war eigentlich ganz spannend (wobei einiges noch hinzugefügt werden konnte) und danke im namen der gemeinde dass du die lösung da veröffentlichst! kommt selten vor. so sollte eigentlich ein jeder thread abgeschlossen werden. (tun sich die wenigsten an!)

    wobei ich muss mich nach wie vor fragen, woher (ereignis!?) der script (wie anfangs beschrieben) gesteuert wird (bei lima)????

    Beitrag zuletzt geändert: 30.9.2013 2:55:14 von czibere
  12. Hallo

    wenn das regelmäßige Aufgaben sind (z.B. 1x am Tag)
    dann könte man das Script auch über einen CronJob starten

    einfach einen GET Request zum Auslösen des Script per CronJob senden
    also z.B. mit deinscript.php?run=backup&typ=mysql

    Der Webspace von Lima-City selbst bietet glaube ich keine CronJobs an
    aber es gibt verschiedene Dienste, die das auch mit externem Aufruf machen
    dazu einfach mal nach "free cron-job" googeln.

    Laufzeit 10 Sekunden ist relativ lang,
    wenn möglich, evtl. die Aufgaben in mehrere kleinere Scripte aufteilen,
    so dass jedes einzelne Script nur ca.. 3 bis 5 Sekunden Laufzeit braucht
    damit nicht wegen timeout das Script vor Erledigung seiner Aufgabe abgebrochen wird.


    PS: warum heisst diie Funktion curl_request_async() , obwohl sie fsockopen() verwendet
    bzw. anders gefragt ... warum nimmst Du da fsockopen() und nicht einen curl Aufruf ?!



    Beitrag zuletzt geändert: 30.9.2013 8:50:20 von btausch
  13. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    czibere schrieb:
    das ganze war eigentlich ganz spannend (wobei einiges noch hinzugefügt werden konnte) und danke im namen der gemeinde dass du die lösung da veröffentlichst! kommt selten vor. so sollte eigentlich ein jeder thread abgeschlossen werden. (tun sich die wenigsten an!)

    wobei ich muss mich nach wie vor fragen, woher (ereignis!?) der script (wie anfangs beschrieben) gesteuert wird (bei lima)????


    Ich versuche eigentlich immer die Lösung zu präsentieren, aebr trotzdem danke.

    Das Event ist eine einfache Überprüfung, ob eine Datei existiert oder nicht. Nur die Datei können mehre Personen hochladen. D.h. ich weiß praktisch nie, wann das ganze das nächste Mal ausgeführt wird.

    btausch schrieb:
    Hallo

    wenn das regelmäßige Aufgaben sind (z.B. 1x am Tag)
    dann könte man das Script auch über einen CronJob starten

    einfach einen GET Request zum Auslösen des Script per CronJob senden
    also z.B. mit deinscript.php?run=backup&typ=mysql

    Der Webspace von Lima-City selbst bietet glaube ich keine CronJobs an
    aber es gibt verschiedene Dienste, die das auch mit externem Aufruf machen
    dazu einfach mal nach "free cron-job" googeln.

    Laufzeit 10 Sekunden ist relativ lang,
    wenn möglich, evtl. die Aufgaben in mehrere kleinere Scripte aufteilen,
    so dass jedes einzelne Script nur ca.. 3 bis 5 Sekunden Laufzeit braucht
    damit nicht wegen timeout das Script vor Erledigung seiner Aufgabe abgebrochen wird.


    PS: warum heisst diie Funktion curl_request_async() , obwohl sie fsockopen() verwendet
    bzw. anders gefragt ... warum nimmst Du da fsockopen() und nicht einen curl Aufruf ?!



    1. Es ist keine regelmäßige Aufgabe, sondern eine Eventbasierte.
    2. Das Timeout liegt bei 20 Sekunden. Da ist also noch Luft. Falls notwendig werde ich das mit mehreren Dateien machen. Aber das ganze muss halt in einem Rutsch dirchgeführt werden.
    3. Ich habe die Funktion mehr oder weniger 1:1 aus dem Internet kopiert. Ich war nicht an dern Namensgebung beteiligt. Aber ich vermute, dass diese Funktion das Verhalten der entsprechenden CURL-Funktion der originalen C-Bibliothek nachempfindet. Mehr kann ich dazu nicht sagen.
  14. projekt-brainstorming schrieb:
    ...
    also es ist mir noch immer ein rätzel, wie du events handeln willst. das einzige was ich kenne ist die Event classe in PECL(1.2.6+), was ja bei lima nicht im traum installiert ist.
    also? wie stellst dir das praktisch vor?
  15. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Es ist kein wirkliches Event. Ich habe es bereits im Startpost zu erklären versucht.

    Also ein User ruft eine meiner Seiten auf. Diese überprüft dann ob gegebene Bedingungen erfüllt sind. Falls ja, startet sie im Hintergrund meinen Arbeiterskript und schaltet gibt eine Meldung aus. So einfach funktioniert das ganze.

    Ist das soweit verständlich oder soll ich es noch einmal erklären? ;)
  16. projekt-brainstorming schrieb:
    Es ist kein wirkliches Event. Ich habe es bereits im Startpost zu erklären versucht
    ok! mein schreck war so groß als ich das am anfang gelesen habe, dass ich es wahrscheinlich verdrängt habe ;)
    jetzt denke ich aber, dass du dein 'pseudoevent' überall dort, wo es gebraucht wird, 'reinspicken' musst. daher eine 'opalisierte' idee: du solltest den ganzen event-schmus in eine einzige klasse packen, die dann alles erledigt. dann hast du viel weniger in den betroffenen dateien herumzueditieren.
  17. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Soetwas ähnliches hatte ich auch vor. Wobei das sind jetzt wieder Sachen, die nicht wirklich relevant sind.
  18. Schon beim Eröffnungsthread kam mir die Frage:
    "Wo liegt dieser Download FTP-Account?"
    Das wird hier in keinem Beitrag deutlich.

    Meine Vermutung:
    Du bietest Downloads (welcher Art auch immer) auf deiner Lima-City Seite an, die der Besucher als Linkliste zu sehen bekommt.

    Meine Hoffnung:
    Der Download-Ordner befindet sich auf dem Lima-City Server.
    Und du oder wer auch immer lädt die Dateien per Webinterface auf den Server und nicht per FTP-Client.

    Dann wäre es doch am Leichtesten nach dem Upload ein weiteres Skript oder ein paar Zeilen auszuführen, die "mal eben" die Datenbank auf den neuesten Stand bringen.
    Ich sehe hier bisher gar kein Problem, dass diese Komplexität ausmachen soll, die du uns verkaufst.

    Für den Fall, dass der Download-Ordner auf einem anderen Server liegt, was ich aber nicht glaube, da du zugegeben hast, keinen eigenen Server zu besitzen, gebe es noch eine andere einfache Lösung:
    Wie bereits erwähnt wurde, kannst du freie Cron-Jobs nutzen, die von außerhalb dein Skript zeitgesteuert anstossen.
    Dieses Skript nutzt Transaktionen, um deine zu aktualisieren. Somit kannst du mit "LOCK TABLE" deine Datenbank bzw. Tabelle sperren.
    Kommt innerhalb dieser Zeit Besucher auf deine Seite, kannst du abfragen, ob die Datenbank/Tabelle gesperrt ist bzw. bekommst eh diese Meldung zurück. Diese Info gibst du deinem Besucher und lässt die Seite dann z. B. per JavaScript nach 10 Sekunden selbständig aktualisieren. Dem Besucher kannst du dafür einen Counter anbieten. 10 Sekunden sollte jeder warten können, wenn er weiß warum.
    Für all das brauchst du dann keine Kommandobefehle auf geschützten Systemen ausführen.
  19. Autor dieses Themas

    projekt-brainstorming

    projekt-brainstorming hat kostenlosen Webspace.

    Der einzige Grund warum der Skript so lange braucht ist, dass der Verbindungsaufbau zum FTP-Server sehr lange braucht.
    Leider kann ich mich nicht auf meine helfer verlassen und muss deshalb am besten alles automatisieren. Ein kleiner PHP Skript der alles auf Vorderman bringt ist optimal!
  20. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!