PHP de Mémoire - Plante Apache?
Je suis sous la version 5.3.0 de PHP et d'Apache: 2.2.11
Quand je lance les scripts PHP qui consomment beaucoup de mémoire (je crois) - de grandes boucles etc. Mon serveur web Apache rapports d'un crash?!
[Sat Jan 02 00:51:30 2010] [notice] Parent: child process exited with status 255 -- Restarting.
Dois-je augmenter la mémoire quelque part? J'ai actuellement memory
memory_limit = 512M
PHP n'a pas plaints de ce que je pense c'est quelque chose d'autre?
Merci à tous
Mise à jour
Cette erreur a été enregistré par ma machine windows dans l'observateur d'événements:
Application défaillante httpd.exe,
version 2.2.11.0, horodatage
0x493f5d44, module défaillant
php5ts.dll, version 5.3.0.0, le temps
timbre 0x4a4922e7, code d'exception
0xc0000005, décalage d'erreur 0x00083655,
id de processus 0x1588, démarrage de l'application
temps 0x01ca8b46e4925f90.
Mise à jour 2
Script en question. J'ai supprimé l'URL.
<?php error_reporting(E_ALL);
set_time_limit(300000);
echo 'start<br>';
include_once('simple_html_dom.php');
$FileHandle = fopen('tech-statistics3.csv', 'a+') or die("can't open file");
for($i =1; $i < 101; $i ++){
//Create DOM from URL
$html = file_get_html("http://www.x.com/$i");
foreach($html->find('div[class=excerpt]') as $article) {
$item0 = $article->children(1)->children(1)->children[0]->plaintext;
$item1 = $article->children(1)->children(1)->children[0]->plaintext;
$item2 = $article->children(1)->children(0)->children(0)->children(0)->plaintext;
//$item3 = $article->children(1)->children(0)->children(0)->children[1]->children(0)->next_sibling();
$stringa = trim($item0).",".trim($item1).",".trim($item2)."\r\n";
fwrite($FileHandle, $stringa);
echo $stringa.'<br>';
echo '------------>'.$i;
}
}
fclose($FileHandle);
echo '<b>End<br>';
?>
Mise à jour 3
Je suis en utilisant le PHP Simple HTML DOM Parser et je viens de trouver ceci:
http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak
Je pense que je devrais être à l'effacement de la mémoire, autrement, il va se planter. Test maintenant.
Update4
Yep, c'était une fuite de mémoire! 🙂
Je suis sur Windows Vista pour le moment et je suis actuellement en train de regarder le script et sa plus de 220 000 K pour l'httpd.exe processus et il a été tué.
Quelle est la source de votre php.exe? C'est à partir de windows.php.net/download ou peut-être xampp ou ...? Est-ce votre développement/test/personnels/fun machine où vous pouvez l'installer (presque) tout ce que vous voulez?
C'est wampserver (WAMP5) - mon plaisir de la boîte! 🙂 J'ai pensé, j'ai résolu ce problème avant et je fixe un autre script avant en s'assurant qu'il était compatible avec PHP 5.3 mais son retour à nouveau et son inquiétant!
OriginalL'auteur Abs | 2010-01-02
Vous devez vous connecter pour publier un commentaire.
Apache a été s'écraser en raison d'une fuite de mémoire qui a été causé par la non fermeture d'une ressource qui a été utilisé à nouveau et à nouveau dans une boucle for, ainsi que le script en faisant usage de la récursivité.
Merci à tous pour l'aide.
espérons que ma réponse pourrait aider - stackoverflow.com/a/15946851/1426354
OriginalL'auteur Abs
J'ai couru dans le présent aujourd'hui lors du traitement d'une tonne de HTML dans une boucle. Voici la solution simple:
Simplement appeler l' clear() méthode sur l'objet dom lorsque j'ai été fait dans chaque itération effacé pour moi.
clear()
dans leDOMDocument
's méthodes sur php.net/manual/en/class.domdocument.php . Ou je suppose que ce n'est pas surDOMDocument
?Meilleure chance avec cette documentation. Il est insondable, afin de ne pas lire trop profondément en elle.
Je pense que c'est le Simple HTML DOM clear() fonction que vous voulez être à la recherche d', bien que ce n'est toujours pas parfait - voir stackoverflow.com/a/15946851/1426354
OriginalL'auteur Joseph Lust
Un peu en retard à la fête, mais j'ai été en cours d'exécution dans le même problème avec une erreur de Segmentation lors de l'utilisation du Simple HTML DOM. Je suis en train de faire bien sûr, je suis en utilisant $html->clear(); unset($html); pour effacer le code HTML que j'ai chargé, mais j'étais encore recevoir l'erreur de Segmentation d'erreur au cours d'un grand gratter de données.
J'ai trouvé que j'avais besoin de commenter certaines clair dans le code simple_html_dom.php fichier. Regarder pour la fonction clear() à l'intérieur de la simple_html_dom_node classe, et le commentaire de tout à l'intérieur;
OriginalL'auteur olimortimer
J'ai couru dans des problèmes comme ceux-ci à l'aide de PHP avec Apache sur Windows. Plutôt que de signaler toute information utile à l'écran, le processus est tout simplement meurt. Si possible, je voudrais suggérer l'exécution de votre code sur une machine linux avec Apache & PHP. Dans mon expérience, cette combinaison sera généralement ce rapport comme une erreur de mémoire, alors que sur Windows, rien ne semble se produire. Je n'ai vu cela se produire avec la récursivité par la voie.
exception code 0xc0000005
signifie "violation d'Accès" qui vous dit que peu ou autant que "Segmentation fault" sur une machine linux 😉Bien, mon point était que sur une machine linux, PHP serait de capture de l'erreur, plutôt que de simplement en train de mourir d'une mort certaine. De toute façon, on dirait qu'ils ont résolu le problème.
OriginalL'auteur davidtbernal
Vous n'êtes pas en utilisant la récursivité? J'ai vu le bogue de PHP et tuer l'enfant Apache sans aucune utilité sortie d'enregistrement lors de la récursivité infinie se produit.
Je suis en utilisant la récursivité et beaucoup de choses se tiendra dans la mémoire. Ce script sera sur certains du bon matériel, je me demande ce que je devrais augmenter temporairement pour obtenir le script à la fin?
OriginalL'auteur Rob