2012-03-18 4 views
7

J'ai un script PHP, il faut un temps d'exécution d'au moins 1000 secondes pour terminer.PHP Script se termine avant timeout sans erreur

Il se termine après environ 265 secondes chaque fois sans erreur. Comme j'utilise des boucles j'ai testé le nombre d'itérations et cela est indépendant de cela, excluant en outre une possibilité d'occurrence d'une erreur dans la boucle.

J'ai défini max_execution_time à 10800 dans php.ini, et changer memory_limit n'affecte pas les résultats.

Aidez s'il vous plaît! Je me suis gratté la tête à fond!

+1

Que fait votre code? Êtes-vous sûr qu'aucune erreur n'est levée? Avez-vous réglé l'affichage des erreurs sur E_ALL? N'avez-vous supprimé aucune erreur avec l'opérateur '@'? –

+0

Bien sûr, il ne génère aucune erreur. Avez-vous regardé dans les fichiers journaux? – Neysor

+1

exécutez-vous cela à partir d'une ligne de commande, d'un travail cron, d'un serveur web, d'un autre? avez-vous essayé une autre méthode d'invocation? – dldnh

Répondre

0

Avez-vous vérifié votre fichier journal? Si vous obtenez une erreur 6 ou une erreur de segmentation. Ensuite, votre script est en train de planter PHP sans afficher d'erreurs sur le navigateur (si c'est un navigateur et non cli). Si vous utilisez apache sous Unix, vous devriez trouver ce journal /var/log/apache2/error.log.

Sinon, vous pouvez définir le chemin du fichier journal dans .htaccess par ajouter cette ligne:

php_value error_log "/path/to/somewhere/convenient/php_errors.log" 

Modifiez le chemin d'un endroit où votre httpd a la permission d'écriture et où vous avez lu l'autorisation.

+1

Est-ce que ce nouveau journal d'erreurs est vide ... – 7HUND3RX

+0

Hmm ouais je suppose que les erreurs de segmentation resteront dans le fichier journal des serveurs HTTP. Comme PHP a déjà planté. Avez-vous essayé d'examiner le journal des erreurs apache? ou quel serveur HTTP utilisez-vous? –

+1

Les fichiers journaux du serveur n'étaient pas autorisés sur Plesk. Le fournisseur d'hébergement a confirmé que c'était en raison de la limitation de la ressource maximale autorisée à être utilisée par un seul script. Merci beaucoup pour votre temps et votre aide! – 7HUND3RX

0

donner:

set_time_limit(0); 

au début du script. de sorte que l'exécution du code ne soit pas expirée à moins qu'elle ne soit terminée.

+0

Je pense qu'il a dit qu'il avait déjà exclu le délai d'attente. –

+0

Ne aide pas .. Il n'est pas question de parcourir tout le temps des 10800 non plus .. – 7HUND3RX

+0

@AshishAgrawal montre votre code en question. – mithunsatheesh

0

Cette même erreur m'est arrivée. Une de mes fonctions PHP est morte sans aucune erreur envoyée à stderr, stdout, ni à aucun autre fichier journal. Ce qui est arrivé était que j'utilisais un script PHP auxiliaire écrit par un autre développeur qui définissait la limite de la mémoire à 512 Mo à mi-chemin de l'opération de mon programme. Le sous-module a empoisonné le puits en réglant également les paramètres du journal des erreurs sur silencieux à un moment donné à mi-chemin du traitement de mon script.

Vous pouvez prouver si cela vous arrive en imprimant les paramètres du système PHP disponibles pour votre script PHP à chaque itération de la boucle. Quand l'indice a fait l'action sale, le moteur PHP lance un ajustement après que le garbage collector ait fonctionné à un point aléatoire dans le futur, puis meurt immédiatement sans erreur. C'est un bug dans le garbage collector PHP quand les sous-modules manipulent les paramètres du système alors que le garbage collector fait son travail.

Solution: Modifiez les sous-modules d'assistance php et assurez-vous qu'ils ne modifient pas les paramètres système lorsque le garbage collector fait son travail. L'interpréteur PHP va paniquer et mourir sans erreurs ou sortie à un intervalle aléatoire après l'empoisonnement des variables du système PHP.

0

En PHP, la seule façon de masquer les erreurs de journaux, même lorsque le display_errors et error_reporting sont correctement indiquées est d'utiliser l'exemple Error Control Operators,

: le code suivant soulèvera une erreur fatale mais un « caché » un, il n'apparaîtra pas sur les journaux ou sur le navigateur.

@echo "forgetting the last quote; 

réglé Ainsi, la valeur display_errors sur Activé et error_reporting en fonction de la version de PHP que vous utilisez (voir les différences here), et vérifiez si vous utilisez un symbole « @ » sur votre code.

Questions connexes