9
votes

Réinitialisation de la connexion inattendue: un problème PHP ou Apache?

J'ai un script PHP qui continue d'arrêter au même endroit à chaque fois et que mon navigateur rapporte:

La connexion au serveur a été réinitialisée tandis que la page était chargée.

J'ai testé cela sur Firefox et c'est-à-dire la même chose. Donc, je suppose que ceci est un problème de configuration Apache / PHP. Voici quelques choses que j'ai définies.

php.ini xxx

apache (httpd.conf) xxx

sont ce qui est correct ci-dessus? Que peut-on causer cela et que puis-je définir?

Je suis en cours d'exécution PHP (5.2.12.12) en tant que Module sur Apache (2.2) sur une fenêtre Server 2003.

Il est très probable qu'il s'agit d'un problème Apache ou PHP, car tous les navigateurs font la même chose. Je pense que le script fonctionne pour exactement 10 minutes (600 secondes).


9 commentaires

Quel est le script de faire quand il s'arrête?


Je pense qu'au point qu'il s'arrête, son exécution d'un script SQL utilisant SQLCMD utilitaire. Ce script est d'environ 500 lignes et c'est tout ce qu'il fait. Chaque ligne est un appel pour exécuter SQL Script à l'aide de SQLCMD et je vous demande pourquoi cela échoue car il l'a fait environ 300 fois. Rien dans les journaux btw aussi !! :(


"Rien dans les journaux btw aussi!" - Cela inclut les journaux du serveur Web, php et SQLServer?


Oui tous. La chose drôle est, dans "Access.log" pour Apache. Tout est enregistré à l'exception du script qui continue de chronométrer. Quand Apache en fait-il un enregistrement, après la fin du script ou auparavant?


Et comment exécutez-vous l'utilitaire SQLCMD? Utilisez-vous un paramètre comme -q pour assurer que sqlcmd quitte quand c'est fait? Est-il nécessaire d'utiliser SQLCMD? Il existe des modules php pouvant communiquer avec un serveur SQL "de l'intérieur" PHP.


Ne vous inquiétez pas, je sais que ce n'est pas une bonne idée d'utiliser SQLCMD - sera bientôt basculer sur le pilote PHP par MS. J'exécute SQLCMD avec EXEC, c'est un exemple: SQLCMD -E -S TYHSY-01 -D NEWTEST201 -I "E: \ php_n \ m_create_log_sp.sql"


Et utilisez-vous PassThru () ou le -o xyz.log option pour attraper des messages de SQLCMD?


J'utilise uniquement EXEC () pour exécuter ces commandes et je connecte la sortie à un fichier texte. Le fichier journal affiche que toutes les exécutions ont réussi et j'ai doublé vérifié sur SQL Server et ont confirmé les modifications.


Avez-vous vérifié votre journal d'erreur PHP (le error_log dans php.ini )? Apache enregistre après la fin de la demande car elle doit enregistrer le code d'état HTTP et la longueur du contenu.


8 Réponses :


0
votes

J'essaierais de définir toutes les options de déclaration d'erreur

-B sur erreur Batch Abort
-V SeverityLevel
-M error_level

et envoyer toute la sortie au client xxx


12 commentaires

Merci pour ce qui précède, mais je pense que je quitterai ce qui précède pour la dernière station car ces changements m'emporteront un peu de temps pour faire! Je viens de confirmer que ce n'est pas un problème PHP car la dernière ligne du script PHP n'est qu'un avis. La seule pensée que gauche est Apache ??


Et SQL Server (mais je ne pense pas que cela puisse réinitialiser une connexion, non?).


Est-ce vraiment difficile à exécuter ce script de test? Ou au moins pour copier le script existant, remplacez-la par PassThru () et ajoutez deux lignes d'écho? C'est seulement un test.


Mon utilisation d'EXED est jonchée partout, ce n'est pas un changement facile. De plus, j'ai SQL Server Management Studio et cela devrait conserver un enregistrement de toutes les erreurs qui se produisent, donc s'il y a des erreurs, je devrais le voir là-bas. Deuxièmement, SQL Server est peu probable que le navigateur signalait une réinitialisation de connexion. Si quelque chose est arrivé à SQL Server, PHP saurait et PHP signalerait cela plutôt que le navigateur !! Droit?


BTW, je ne refuse pas votre aide! :) J'essaye maintenant!


Je viens d'essayer cela, mais ce qui précède n'a même pas travaillé pour moi. Je reçois un droit et je me suis connecté refusé pour NT-Authority / System ??


C'est parce que vous laissez le processus Apache exécuter comme «localysystem» (+ php en tant que module / aucune impersonnation). Le nouveau processus engendré par PassThru () hérite du compte de compte / de sécurité. Mais cela s'appliquerait également à EXEC (). Utilisez-vous la même chaîne de commande exacte que l'option -b /m / -v? Essayez-le sans le -L 3 Option du délai de connexion (bien que je doute que la cause)


Oui, j'utilise la même commande exacte. Je vais essayer sans "-l". Oui, PHP fonctionnera en tant que processus Apache et cela n'a suscité aucun problème lors de l'utilisation de la fonction EXEC.


La même chose arrive :( - Mais pourquoi pensez-vous que c'est un problème de serveur SQL? Qu'est-ce qui vous fait penser que cela, j'aimerais vraiment maintenant.


Je ne pense pas que ce soit un problème SQLServer (je pensais que SQLCMD ne quitte pas dans certaines conditions et que PassThru () vous montrera quelque chose comme "Appuyez sur Entrée pour continuer"). À l'heure actuelle, il semble être un problème d'authentification. Lorsqu'un processus est exécuté en tant que localystem, l'authentification intégrée utilise les informations d'identification de la machine et non un compte d'utilisateur spécifique (identique à celui que si vous essayez d'établir une connexion réseau SMB). La différence entre EXED () et PassTHRU () à ce stade me échaudent ;-) Lorsque vous remplacez SassTHRU () par EXEC () dans le script de test, votre lot SQL est exécuté?


Non, je viens d'obtenir une erreur refusée refusée même après avoir retiré "-l". Et si elle renvoya "Appuyez sur Entrée pour continuer"? Qu'est-ce que ça veut dire? Cela signifie-t-il que SQLCMD n'existe pas et PHP n'attend que rien et donc tout de suite ??


Oui, c'était l'idée générale. SQLCMD En attente de certaines entrées, PHP en attente de SQLCMD de sortir, du délai d'attente, de la fin. L'authentification défaillante est une histoire différente.



1
votes

Les différences entre 2 configs PHP étaient en effet la cause première du problème à ma fin. Mon application est basée sur la bibliothèque NUSOAP.

sur Config 1 avec PHP 5.2, il fonctionnait bien lorsque la prolongation du savon de PHP était éteinte.

sur CONFIG 2 avec PHP 5.3, il donnait des erreurs "Réinitialisation de connexion" lorsque la prolongation du savon de PHP était allumée.

commutation de l'extension offerte d'obtenir mon app exécutant sur PHP 5.3 sans avoir à réécrire tout.


0 commentaires

3
votes

J'ai eu un problème similaire - s'avère Apache2 était Segfaulting. La cause du Segfault était PHP5-XDEBUG pour 5.3.2-1Buntu4.14 sur Ubuntu 10.04 LTS. Supprimer Xdebug corrigé le problème.


2 commentaires

Je n'ai pas installé PHP5-XDEBUG, mais j'avais le même problème de défaut de segmentation Apache2 (11). Peut-être la cause est différente et pas seulement PHP5-Débogu.


17.01.2019 problème similiaire ici - exécutant Apache2 avec PHP 7.3.0 x64 Ts sur Bitnami, Xdebug 2.7.Obetal. La désactivation de l'extension résout le problème.



0
votes

Mon PHP segfaulting sans aucune information supplémentaire quant à la cause de cela. Il s'est avéré être deux classes appelant la méthode magique __Call () de l'autre car les deux n'ont pas eu la méthode appelée. PHP vient de boucler jusqu'à ce qu'il soit hors de mémoire. Mais il n'a pas signalé que le message habituel "Taille de la mémoire autorisée de * octets épuisée", probablement parce que les méthodes sont "magiques".


0 commentaires

2
votes

J'ai aussi eu ce problème aujourd'hui, il s'est avéré être une pause erronée instruction PHP (en dehors de tout commutateur ou n'importe quelle boucle), dans une fonction avec un essayez ... Catch ... Enfin Bloc.

ressemble à des accidents PHP dans cette situation: xxx

Ceci était avec PHP version 5.5.5. < / p>


1 commentaires

Avait exactement le même problème, mais causé par un autre type de code "étrange" comme "si ($ a []) $ b = $ c;". Une fois supprimé, tout a fonctionné comme normal. On dirait que l'analyseur PHP ne récupère parfois pas du code erroné.



1
votes

J'ai eu un problème dans lequel dans certains cas PHP 5.4 + EACCECelerator = Réinitialisation de la connexion. Il n'y avait aucune sortie d'erreur dans aucun fichier journal et cela ne s'est passé que sur certaines URL, ce qui a rendu difficile le diagnostic. Il est arrivé que cela ne soit arrivé que pour certains fichiers PHP code / certains fichiers PHP, et était dû à certaines incompatibilités avec code PHP spécifique et EACCECelerator. La solution la plus facile consistait à désactiver EaceCelerator pour ce site spécifique en ajoutant le fichier suivant à .htaccess

php_flag EaceCelerator.Enable 0

php_flag eacecelerator.optimizer 0

(lignes équivalentes dans php.ini):

ececelerator.enable = "0"

ececelerator.optimizer = "0"


0 commentaires

1
votes

C'est un ancien poste, je sais, mais depuis que je ne pouvais pas trouver la solution à mon problème et je l'ai réparé, je partagerai mon expérience. La principale cause de mon problème était une file_exists () appel de fonction.
Le fichier existait réellement, mais pour une raison quelconque, une barre oblige supplémentaire sur l'emplacement du fichier ("//") qui fonctionne normalement sur un navigateur régulier semble ne pas fonctionner dans PHP. Peut-être que votre problème est lié à quelque chose de similaire. J'espère que cela aide quelqu'un!


0 commentaires

0
votes

Je pensais aussi ajouter ma propre expérience.

Je reçois le même message d'erreur, qui a été causé dans mon cas par une erreur PHP dans une exception .

Le coupable était une classe d'exception personnalisée qui a fait de la journalisation en interne et une erreur fatale s'est produite dans ce mécanisme de journalisation. Cela a provoqué l'exception de ne pas être déclenché comme prévu et aucun message significatif ne doit être affiché non plus.


0 commentaires