2011-07-27 2 views
1

J'ai un bug qui bloque mon site web en PHP. Il se produit sur une page d'entrée, où l'utilisateur remplit un formulaire, puis les données sont mises à jour sur la base de données, puis l'utilisateur reçoit header redirigé vers une autre page.PHP/Site Web geler sur Chrome sur Mac?

Ce qui se passe est que l'ensemble du site Web "branche" (sous-dossier, par exemple www.example.com/my_site, mais pas www.example.com/another_site) se bloque, mais aucun autre site Web accessible par Chrome. Après un certain temps, je peux à nouveau naviguer sur ce site, je suppose que l'opération Chrome a expiré.

Cependant, cela semble se produire uniquement sur Chrome et sur mon Mac. J'ai testé un autre Safari sur ce Mac, Chrome sur un Windows, et les deux ont bien fonctionné. Je dois avouer que ce test n'était pas exhaustif, mais je n'ai qu'un seul Mac à tester. Ce petit test ressemblant à celui de Venn a traversé le navigateur et la machine, ce qui me semble être les facteurs clés.

Voici le code de la page d'écoute. Si je commente la redirection d'en-tête, je ne me dérègle pas. Si je commente le code de mise à jour de la page, je n'obtiens aucun gel. Je ne vois pas ce qui cause le gel ici, vraiment. Machine? OS? Redirection d'en-tête? Opération $ _POST? essayer/attraper la manipulation? Combinaison? Je n'ai aucune idée.

EDIT: Je vois maintenant une corrélation entre la quantité de données passées par $ _POST du formulaire à la page. Si les données sont relativement petites, tout fonctionne correctement. Cependant, lorsque j'obtiens des données plus volumineuses (c'est-à-dire un balisage HTML via un champ éditeur WYSIWYG), le gel se produit. Comment Chrome est-il affecté par cela? Peut-être que la redirection se produit avant de pouvoir tout traiter? Même avec des quantités gigantesques de données, il fonctionne toujours bien sur Mac/Safari et Windows/Chrome.

<?php 

require_once("script/initialize.php"); 

try 
{ 
    if (isset($_POST["submit"])) 
    { 
     $page = page::from_post(); 

     try 
     { 
      $page->validate(); 

      $page->require_edit(); 

      $page->update_by_id(); 
      $page->set_tags_from_post(); 
      $page->set_categories_from_post(); 
      $page->set_workgroups_from_post(); 

      //header("Location: page_view.php?id=".$page->id); 
     } 
     catch (InputException $inex) 
     { 
      $smarty->assign("error", $inex->getMessage()); 
     } 
    } 
    else 
    { 
     $page = page::from_id(intval($_GET["id"])); 

     $page->require_edit(); 
    } 

    $smarty->assign("ressource", $page); 
    $smarty->display_self(); 
} 
catch (Exception $ex) 
{ 
    $smarty->display_exception($ex); 
} 

?> 
+0

Pour moi, il semble que quelque chose est encore en cours d'exécution, en gardant la session verrouillée. Soit 'session_write_close()' (ou le 'exit' wpearse suggère) devrait être capable de rendre la session disponible à nouveau. Vous devriez cependant vérifier pourquoi votre script prend tellement de temps, avec par exemple le cachegrind de 'xdebug'. – Wrikken

Répondre

1

J'ai eu exactement le même problème sur un Mac dans Firefox. Lors du téléchargement de petits fichiers < 100kB il a bien fonctionné 90% du temps, mais avec des fichiers plus volumineux (par exemple des photos d'un appareil photo numérique) Firefox semblait attendre une réponse du serveur. Lorsque cela se produisait, je ne pouvais pas me connecter au même domaine à partir d'une autre fenêtre de Firefox, mais ouvrir une autre page fonctionnait bien. Le serveur fonctionnait bien - j'ai vérifié cela sur un autre ordinateur alors que le Mac n'avait pas de connexion. 3-5 minutes plus tard, il "s'est réveillé" et fonctionnait bien.

Ensuite, j'ai découvert qu'il n'y avait pas un exit(); après l'en-tête de redirection dans le script de téléchargement. Je l'ai inséré, et maintenant je n'ai vu aucun de ces problèmes.

Je veux juste confirmer qu'un exit(); manquant après un header("location: [URL]"); peut provoquer le blocage des navigateurs sur un Mac.

0

Essayez de mettre un exit(); immédiatement après votre header('Location: page_view.php?id='.$page->id);

Questions connexes