2017-07-21 1 views
0

Cela pourrait être fait avec un cronjob, mais comme je n'ai pas encore changé pour un fournisseur avec un plan comprenant le même, j'ai trouvé ce que je pense pourrait être une solution de contournement possible à mon objectif, sinon même une meilleure solution. Portée: Il s'agit d'un système de messagerie dans lequel vous souhaitez que les autres utilisateurs soient informés lorsqu'un utilisateur se déconnecte. Ceci est fait facilement pour les situations où l'utilisateur décide de se déconnecter dans l'application, mais si le wifi des utilisateurs tombe en panne, par exemple, l'application ne pourra évidemment pas dire aux autres utilisateurs qu'il n'est plus en ligne. Chaque 5 secondes, il y a une vérification par l'application pour les nouveaux messages, qui met également à jour un mysql avec un horodatage actuel pour chaque utilisateur. Donc, je pensais que si le script PHP appelé par l'application toutes les 5 secondes vérifie si l'horodatage dans la table sql au moment où le script php est appelé est le même 10 secondes plus tard, alors les autres utilisateurs seront informés que il est déconnecté. Donc ce que je l'ai fait, à la fin du script:Comment faire une exécution de sommeil asynchrone en PHP

$sql =$conn->prepare ("SELECT time FROM Users WHERE username = ? limit 1"); 
$sql->execute(array($usernametmp)); 
$oldtime = $sql->fetch(PDO::FETCH_COLUMN); 
sleep(10); 
$sql =$conn->prepare ("SELECT time FROM Users WHERE username = ? limit 1"); 
$sql->execute(array($usernametmp)); 
$newtime = $sql->fetch(PDO::FETCH_COLUMN); 
if ($oldtime == $newtime) 
{ 
(here´s where the other users are being informed 
.... 

Mais malheureusement tout le code dans le script entier php n'est pas exécuté qu'après le sommeil de 10 secondes. Ce que je veux, c'est que tout le code avant que la commande sleep ne soit exécutée, et 10 secondes plus tard, ce qui précède est déclenché. Est-ce que quelqu'un sait comment je peux y parvenir?

+1

si vous avez un frontal. id ai js ping le backend sur un intervalle défini comme keep-awake. Si vous voulez vraiment async php, les threads ou un système de files d'attente sont ce que vous devriez regarder. – castis

+0

Merci, je suppose que je préfère le faire une fois que j'ai migré vers un VPS et voir les options que j'ai là. Je suis venu avec le ci-dessous - essayer à la fois système et exec, mais ils sont totalement ignorés sans erreur ou quoi que ce soit, je pense que mon hôte bloque pour exécuter des opérations asynchrones: $ sql = $ conn-> prepare (" SELECT heure FROM Utilisateurs WHERE nom d'utilisateur =? Limite 1 "); $ sql-> execute (array ($ usernametmp)); $ oldtime = $ sql-> récupérer (PDO :: FETCH_COLUMN); système ("php offlinechk.php? oldtime = $ OLDTIME &"); exec (" php offlinechk.php? oldtime = $ OLDTIME &"); offlinechk = code post 1 –

Répondre

0

Ok, je suis venu avec une solution décente:

Chaque client vérifie de temps pour les nouveaux messages, la nouvelle horodatage ajouté pour cet utilisateur dans la table MySQL est également envoyé au client. L'horodatage est immédiatement envoyé à un autre script php du client, qui dort pendant 10 secondes puis vérifie si l'horodatage est identique à celui de la base de données mysql. Si c'est le cas, le statut du client est passé en mode hors connexion, car pendant ces 10 secondes, il aurait dû y avoir une mise à jour de l'horodatage dans la table, à moins que le client ne soit déconnecté.