2013-06-20 1 views
0

J'ai un site Web fonctionnant sous IIS7. Afin de mieux expliquer mon problème, je vais le présenter dans un scénario simple. Supposons que j'ai deux pages web, index.php et report.php avec chacun des contenus comme suit:Le serveur ne répond pas pendant un script de longue durée

index.php

<?php echo "Hello World"; ?> 

report.php

<?php sleep(60); //simulate a long running script like generating reports. ?> 

Dites index.php est la page d'accueil de notre ec système de commerce électronique où les visiteurs vont visiter et report.php est la page où les gars dans la gestion des rapports rapports quand ils le souhaitent (le plus probable au cours de la journée). Le problème est lors de l'affichage des rapports qui prennent plusieurs minutes à générer, le serveur entier ne répondra plus. Les visiteurs qui consultent index.php n'obtiendront aucune réponse tant que les rapports n'auront pas été générés. Ceci est également applicable à ASP.NET. Existe-t-il des solutions de contournement pour cela?

+0

Je ne m'attendrais pas à ce que cela arrive avec asp.net, car ce sont des threads différents qui répondent aux demandes. Je ne peux pas parler pour php si. Il pourrait s'agir d'un code partagé par toutes les requêtes qui bloquent, ce qui ferait bloquer toutes les requêtes. Si c'est le cas, alors ce code a vraiment besoin d'être refacturé. –

+0

Le même problème se produit dans ASP.NET avec le scénario simple ci-dessus en utilisant toutefois System.Threading.Thread.Sleep (60000). –

Répondre

0

Ce explains threading dans IIS6 & 7. En substance, une nouvelle offres de fil à chaque nouvelle requête entrante. Par conséquent, avoir une page individuelle pendant un certain temps n'aura aucun effet sur le traitement des autres pages. J'ai testé cela en utilisant 2 pages.

page.aspx:

<%@ Page Language="C#" %> 
<%=DateTime.Now.ToString() %> 

index.aspx:

<%@ Page Language="C#" %> 
<%=DateTime.Now.ToString() %> 
<% System.Threading.Thread.Sleep(10000); %> 

Après avoir appelé index.aspx, page.aspx peut être appelé à plusieurs reprises & retourne l'heure actuelle toutes les demandes , tandis que la première requête à index.aspx dort.

Si quelque chose provoque des demandes de blocage sur votre serveur, il peut s'agir d'une ressource partagée utilisée sur votre site. Dans l'exemple ci-dessus, si index.aspx demandait un accès exclusif à une ressource, disons un fichier ou un DB, plusieurs requêtes à page.aspx devraient attendre que index.aspx terminé & libère la ressource.

+0

Vous avez raison, les discussions ne sont pas bloquées sur des pages simples comme celles-ci. Cependant, lorsque j'ai utilisé 'System.Threading.Thread.Sleep (10000)' dans Page_Load sur l'une des pages d'un projet CMS DotNetNuke existant, il bloque les demandes entrantes. Je pense qu'aucune ressource partagée n'était impliquée avec juste la fonction 'Sleep()'. Je me demande pourquoi. –

+0

Il s'agit probablement d'une ressource partagée au sein de DotNetNuke. Même lorsque vous utilisez un CMS comme DNN, le modèle de thread décrit ci-dessus reste vrai. –

Questions connexes