Long Polling: In der while-Schleife feststecken

Ich versuche, eine lange polling-function zu schreiben, die nur Daten an den Client zurückgibt, sobald einige benutzerdefinierte post_meta aktualisiert wird. Dieser benutzerdefinierte post_meta ist ein Unix-Zeitstempel, der dann mit dem Unix-Zeitstempel verglichen wird, der vom Client über AJAX an die function gesendet wird. Wenn der Wert post_meta höher als der Wert des Clients ist, wird der Wert post_meta an den Client zurückgegeben. Aber aus irgendeinem Grund bleibt die function in der while-Schleife stecken, die die beiden Zeitstempel vergleicht. Die Unix-Zeitstempel scheinen korrekt formatiert zu sein und können ohne Probleme verglichen werden. Ich habe das außerhalb der While-Schleife versucht. Aber während innerhalb der while-Schleife und der post_meta in der Zwischenzeit aktualisiert wird, wird die while-Schleife nicht gestoppt. Es scheint, dass sich die Bedingung für die while-Schleife niemals zu ändern scheint, ungeachtet des aktualisierten (und natürlich höheren) Wertes in der database. Was vermisse ich?

function my_sync_function () { $post_id = intval(wp_strip_all_tags($_GET['post_id'])); // make post ID integer $lastRequest = wp_strip_all_tags($_GET['timestamp']); // unix timestamp $lastModified = get_post_meta( $post_id, 'last_modified', true ); // unix timestamp // do nothing until the lastModified timestamp is greater than the lastRequest timestamp while ($lastModified <= $lastRequest) { usleep(2000000); clearstatcache(); $lastModified = get_post_meta( $post_id, 'last_modified', true ); // check for updated timestamp } $result['type'] = 'success'; $result['timestamp'] = $lastModified; $result = json_encode($result); echo $result; die(); } add_action('wp_ajax_my_sync_function', 'my_sync_function'); 

Solutions Collecting From Web of "Long Polling: In der while-Schleife feststecken"

PHP ist keine Multi-Tasking-Sprache, Sie sollten nicht versuchen, es als solches zu verwenden. Mit anderen Worten, langes Polling ist nichts, was Sie versuchen sollten, selbst wenn Sie ein Sprachkonstrukt verwenden, das entwickelt wurde, um es zu unterstützen.

Speziell zu Ihrer Frage, wahrscheinlich, weil WordPress die Angewohnheit hat, im Speicher als Mach-Informationen zu speichern, die aus der database abgerufen werden, wie es kann (das ist corefunktion, keine Plugins beteiligt). Zum besten meines Gedächtnisses, sobald Post-Metadaten abgerufen werden, wird es zwischengespeichert und daher get_post_meta( $post_id, 'last_modified', true ) immer den gleichen Wert zurück. Sie müssen den Cache ungültig machen, um das ausführen zu können, was Sie versuchen, oder eine Abfrage an die database zu senden, die die WP-API umgeht.

Darüber hinaus hat Ihr Code einen sehr schlechten Einfluss auf die performance des Servers, da Sie einen Apache-process beschäftigen, ohne etwas Nützliches zu tun. Wenn Sie den Apache 10 processe ausführen lassen, bedeutet das, dass Sie 10% weniger Anfragen zum Zeitpunkt Ihres Codes ausführen können funktioniert.

Ein weiterer Faktor ist das php-Ausführungszeitlimit, das normalerweise auf 30 Sekunden eingestellt ist. Ihr langer Polling-process stirbt also nach 30 Sekunden, ohne dass Sie darüber benachrichtigt werden.