PHP Andere Aktion während sleep durchführen

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
711
hi,

ich habe ein Script mit einer Schleife, welches jede Sekunde eine Aktion durchführt, solange ein Wert > 1 ist. das problem ist jetzt, dass der User während diesem "Countdown" keine andere Aktion mit diesem Script machen kann. erst wenn die Schleife durch ist wird die nächste Anfrage bearbeitet.

Teilweise Pseudo-Code:

PHP:
$deleteCooldown = 30;
 
 do {
    sleep(1); 
    $deleteCooldown--;
    editMessage($id, 'Nachricht wird in '.$deleteCooldown.' Sekunden gellöscht.');
}
while ($deleteCooldown > 1);

wie kann ich das machen, dass die Schleife davon nicht beeinträchtigt ist ?
 
PHP kann kein Multithreading. Speicher dir den Wert irgendwo zwischen oder setz nen Timestamp und lass nen Cronjob laufen, der prüft und entsprechend Aktionen später unabhängig vom Request tätigt.
 
Nimm einen Timer:
https://www.php.net/manual/en/event.addtimer.php
(Ich Glaub zumindest, dass es das ist was ich denke das es ist... kann auch Schmarn sein, kenne mich mit PHP nicht zu gut aus.)

Edit:
Ja, ich glaube es ist das, was ich meinte.
Hier ein praktikableres Beispiel, als das im PHP-Manual:
https://stackoverflow.com/questions/5031182/php-and-timer-events

Edit2:
U.U. auch das hier:
https://www.php.net/manual/en/class.ui-executor.php
Da müsste man nicht regelmäßig $events->CheckTimers() aufrufen.
Würde aber wohl die Ausührung von anderem Code unterbrechen, wenn ich das richtig verstehe.
 
Zuletzt bearbeitet:
Bissel wenig Info. Ist das eine Webanwendung?

Ja => Ajax und multithread "vollautomatisch".

Nein => kurz den Usecase umreißen, in der diese Situation auftritt. Dann kann man ein bißchen gezielter als ins Blaue schießen, wie man da am schlauesten rangehen könnte.

Ansonsten kann man auch mit PHP Subprozesse starten. Ob das für die Situation allerdings nützt, keine Ahnung.
 
Nein ein telegram chat Bot.

ich habe das jetzt mal auf Cronjob umgebaut und jetzt jetzt erst, dass Cronjob ja nur mindestens jede Minute laufen kann... daher habe ich jetzt das script geschrieben:

Bash:
#!/bin/bash

while true; do
      /usr/bin/curl https://example.com/script.php > /dev/null
      sleep 1;
done

Kann ich das so machen ? würde es dann immer in einem screen laufen lassen. Und kann ich das irgendwie nicht in das Apache log loggen lassen?
 
Zuletzt bearbeitet:
aber es gibt doch da sowas wie set_time_limit? dann müsste ich das ja auch auf "unendlich" setzen.
 
max_execution_time integer
Legt die maximale Zeit in Sekunden fest, die ein Skript laufen darf, bevor der Parser die Ausführung stoppt. Diese Einstellung hilft zu verhindern, dass schlampig geschriebene Skripte Ihren Server lahmlegen. Der Standardwert für diese Einstellung ist 30 Sekunden. Wird PHP von der Kommandozeile ausgeführt so ist der Vorgabewert 0.
Von PHP: Laufzeit-Konfiguration - Manual

Also kein Problem.

Ich hab das bei mir für ein kleines Script gemacht, was ein Dienst pollt und meine DB füllt. Das ganze hab ich dann in systemd als Service eingetragen.
polling .service
Code:
[Unit]
Description=snip
After=network.target

[Service]
User=snip
Type=exec
ExecStart=/usr/bin/php /snip/cron.php

[Install]
Wants=network-online.target
After=network-online.target
cron.php
Code:
#!/usr/bin/php
<?php
snip
while(true){
$t=time();
snip do the work here
if(time()<$t+1)
                time_sleep_until($t+1);
}
Über cron geht das sicherlich auch, da ist nur die Frage, wie du verhinderst, dass das Script doppelt läuft (PID/Lock-File?).
Prinzipiell ist dein Ansatz vollkommen OK, bloß die Resourcenverschwendung... Ein bash, ein curl, ein webserver, ein PHP auf dem Webserver, und das jede Sekunde... ;-).
 
Zurück
Oben