Puis-je détecter quand un client a été déconnecté d'un CGI?

J'ai un CGI assez intensif en ressources qui prend beaucoup de time pour commencer à envoyer des données. Nous avons vu un certain nombre de cas où les personnes impatientes rechargent un certain nombre de fois, ce qui triggers des courses supplémentaires du CGI à charger ou des cas où le client expire et supprime la connection, mais le CGI continue de fonctionner.

Existe-t-il un bon moyen de détecter quand cela s'est produit? Il n'a même pas besoin d'être dans le CGI lui-même (et probablement mieux si ce n'est pas le cas – il supporte un autre programme dont je n'ai pas le contrôle), mais pourrait être un travail de cron qui fonctionne de time en time searchr les connections mortes pour récolter.

Je suis actuellement en train d'utiliser Apache, mais c'est un tel problème que je serais prêt à exécuter un autre server web s'il a des dispositions pour y faire face (ou pour me laisser surveiller le problème).

Habituellement, vous ne pouvez pas détecter une connection brisée jusqu'à ce que vous commenciez à écrire à l'user. Sinon, votre process continuera à fonctionner sans remarquer que l'interruption de connection s'arrête du côté de l'user. Cette publication est liée même si elle parle de PHP. Le concept devrait être le même.

Il est possible d'essayer:

  1. Faites le travail long en arrière-plan. Lorsqu'un user request le CGI, n'effectuez pas la tâche comme un appel de blocage normal. Remettez tout simplement à l'user pour indiquer que cette request est en cours de traitement. Bien sûr, vous devez find un moyen de mettre à jour la vue ou de fournir une autre page pour vérifier l'état du travail en utilisant un ID de request ou une adresse IP.
  2. Envoyer datatables au client dès que possible et quitter si elles n'ont pas été envoyées (indication de connection brisée). Vous pouvez par exemple envoyer une progression de l'emploi toutes les quelques secondes ou quelques minutes.

Si vous enregistrez les travaux en cours d'exécution dans une database, vous pouvez save l'ID de la request et / ou l'adresse IP du client. Ainsi, vous pouvez détecter et ignorer les requests en double pour la même ressource en indiquant à l'user "que vous requestz en cours de traitement".

Avertissement: cette information peut être obsolète. Voir le dernier paragraphe.

Je me souviens d'avoir eu le même problème et de le résoudre avec un script CGI nph (sans tête d'parsing).

Normalement, apache recueille tous les en-têtes à partir de votre script et, lorsqu'il a terminé la lecture des en-têtes, les modifie avec des en-têtes standard que vous n'avez pas fournis. Cela signifie aussi, tant que vous ne finissez pas les en-têtes, apache n'envoie rien au client.

Avec un script nph, vous devrez fournir tous les en-têtes, mais apache les envoie immédiatement au client et envoie votre script CGI SIGPIPE une fois que le client se déconnecte. Vous pouvez donc envoyer un en X-Slowly-Counting-Part-nnn: yes tête X-Slowly-Counting-Part-nnn: yes toutes les quelques secondes, pour éviter les timeouts d'attente sur le client, et vous serez averti si les clients rompt la connection.

Cela laisse toujours le problème que vous devrez envoyer le statut HTTP, mais si vous envoyez un 'Content-Length: 0', ou peut-être 'Content-Length: 1' et fermez la connection sans envoyer de contenu, votre file le programme de téléchargement devrait prendre une erreur de réseau et agir en conséquence.

Vous devrez probablement transmettre la sortie de l'autre programme à travers votre process, mais ce ne devrait pas être un coup de performance majeur au less si vous êtes sur linux et utilisez l'appel système sendfile(2) .

Le problème avec tout cela est que je l'ai utilisé il y a au less 10 ans, probablement sur Apache 1.3, et le googling pour apache cgi nph n'a rien apache cgi nph utile. Donc, peut-être que la fonction nph a été supprimée dans l'intervalle – mais alors, peut-être pas, j'avoue que je n'ai pas trop regardé.

Ancienne question, mais j'ai eu le même problème et résolvez la vérification si la connection est établie:

Dans mon cas, j'utilise un script bash sur le server. Les variables env sont exscopes par mod_cgi. Je crois que cette solution fonctionnera pour tout programme / script exécuté sur CGI

 ss -nt state established "( sport = :$SERVER_PORT and dport = $REMOTE_ADDR:$REMOTE_PORT )" 2>/dev/null | grep -q "$REMOTE_ADDR:$REMOTE_PORT" if [ "$?" -ne '0' ]; then # Client closed browser/connection fi