Le Maximum de la fonction de niveau d'imbrication de '100' atteint, l'abandon de l'
Je veux créer un robot qui prennent les informations de toutes les pages une par une à partir du numéro de 0 à 10 000 000. Je ne suis pas d'importance combien de temps cela prend. Je veux juste que ça fonctionne. Voici l'erreur que j'ai obtenir
Fatal error: Maximum de la fonction de niveau d'imbrication de '100' atteint, l'abandon de l'! dans D:\wamp\www\crawler\index.php sur la ligne 25
La ligne 25 est
$htmlstr = (string)$this->curlGet($url);
Et voici mon script complet.
Merci pour votre aide !
header('Content-Type: text/html; charset=utf-8');
ini_set('max_input_nesting_level','100000');
ini_set('max_execution_time','100000');
class crawler{
private $url;
private $page;
private $bothurl;
private $innerDom = null;
public $prop;
public $entry;
function __construct($entry){
$this->entry = $entry;
$this->bothurl = array('http://www.remax-quebec.com/fr/inscription/Q/'.$entry.'.rmx','http://www.remax-quebec.com/en/inscription/Q/'.$entry.'.rmx');
$this->scan();
}
private function scan(){
$i =0;
foreach($this->bothurl as $url){
$this->url = $url;
$this->lang = ($i==0)?'fr':'en';
$htmlstr = (string)$this->curlGet($url);
$dom = new DOMDocument;
@$dom->loadHTML($htmlstr);
$this->page = $dom;
$this->htmlInfos();
$this->getInfos();
$i++;
}
}
private function htmlInfos(){
$divs = $this->page->getElementsByTagName('div');
foreach($divs as $div){
if($div->hasAttribute('class') && $div->getAttribute('class') == 'bloc specs'){
$innerDom = new DOMDocument();
@$innerDom->loadHTML($this->innerHTML($div));
$this->innerDom = $innerDom;
}
}
if($this->innerDom === null) $this->changeEntry();
}
private function getInfos(){
$sect = 0;
foreach($this->innerDom->getElementsByTagName('div') as $div){
# obtenir la description
$this->getDesc($div->getAttribute('class'),$div);
# obtenir les caractéristiques
$this->getCaract($div->getAttribute('class'),$div);
# obtenir les informations interieur, exterieur et evaluation
if($div->getAttribute('class') == 'section deux-colonnes'){
switch($sect){
case 0: $this->getSpecInfos($div,'interieur'); break;
case 1: $this->getSpecInfos($div,'exterieur'); break;
case 2: $this->getSpecInfos($div,'evaluation'); break;
case 3: $this->getSpecInfos($div,'equipement'); break;
case 4: $this->getSpecInfos($div,'services'); break;
}
$sect++;
}else if($div->getAttribute('class') == 'section'){
# obtenir les détails des pièces
foreach($div->getElementsByTagName('table') as $table){
if($table->getAttribute('class') == 'details-pieces'){
$this->detailPieces($table);
}
}
}
}
}
private function getDesc($class,$obj){
if($class == 'section description'){
$p = $obj->getElementsByTagName('p')->item(0);
$text = (string)$p->nodeValue;
$this->prop[$this->lang]['description'] = $text;
}
}
private function getCaract($class,$obj){
if($class == 'section characteristiques'){
foreach($obj->getElementsByTagName('div') as $div){
if(substr($div->getAttribute('class'),0,4) == "item"){
$text = (string)$div->nodeValue;
$this->prop[$this->lang]['caracteritiques'][substr($div->getAttribute('class'),5)] = $text;
}
}
}
}
private function getSpecInfos($obj,$nomInfo){
foreach($obj->getElementsByTagName('table') as $table){
foreach($table->getElementsByTagName('tr') as $tr){
$name = $tr->getElementsByTagName('td')->item(0);
$value = $tr->getElementsByTagName('td')->item(1);
$name = substr((string)$name->nodeValue,0,-2);
$value = (string)$value->nodeValue;
$this->prop[$this->lang][$nomInfo][$this->noAccents($name)] = $value;
}
}
}
private function detailPieces($obj){
$tbody = $obj->getElementsByTagName('tbody')->item(0);
foreach($tbody->getElementsByTagName('tr') as $tr){
$name = $tr->getElementsByTagName('td')->item(0);
$name = (string)$name->nodeValue;
$level = $tr->getElementsByTagName('td')->item(1);
$level = (string)$level->nodeValue;
$dimensions = $tr->getElementsByTagName('td')->item(2);
$dimensions = (string)$dimensions->nodeValue;
$floor = $tr->getElementsByTagName('td')->item(3);
$floor = (string)$floor->nodeValue;
$desc = $tr->getElementsByTagName('td')->item(4);
$desc = (string)$desc->nodeValue;
$this->prop[$this->lang]['pieces'][$this->noAccents($name)]['etage'] = $level;
$this->prop[$this->lang]['pieces'][$this->noAccents($name)]['dimensions'] = $dimensions;
$this->prop[$this->lang]['pieces'][$this->noAccents($name)]['revetement'] = $floor;
$this->prop[$this->lang]['pieces'][$this->noAccents($name)]['description'] = $desc;
}
}
private function innerHTML($element){
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child)
{
$tmp_dom = new DOMDocument();
$tmp_dom->appendChild($tmp_dom->importNode($child, true));
$innerHTML.=trim($tmp_dom->saveHTML());
}
return $innerHTML;
}
private function noAccents($value){
$string= strtr($chaine,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ","aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
}
private function changeEntry(){
$this->entry++;
echo $this->entry;
$this->scan();
}
private function curlGet($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_ENCODING, "gzip");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}
}
$entry = 8678057;
$crawler = new crawler($entry);
echo '<pre>';
print_r($crawler->prop);
echo '</pre>';
Êtes-vous reproduire Google?
Je ne vois vraiment pas l'effort ici pour essayer de comprendre le problème.
Vous avez une erreur. C'est gentil. Vous avez posté code. C'est tout aussi agréable, mais où est votre question? Voulez-vous nous comme par magie corriger votre code et validez une solution de travail ici?
Ne pas faire cela de façon récursive. Réécrire de manière itérative.
Si vous écrivez du code, vous êtes un programmeur. Ne soyez pas si dur sur vous-même. Oui, le moyen le plus facile est Martin.'s réponse, mais ce n'est pas ce que j'appellerais) la bonne Réponse.
Je ne vois vraiment pas l'effort ici pour essayer de comprendre le problème.
Vous avez une erreur. C'est gentil. Vous avez posté code. C'est tout aussi agréable, mais où est votre question? Voulez-vous nous comme par magie corriger votre code et validez une solution de travail ici?
Ne pas faire cela de façon récursive. Réécrire de manière itérative.
Si vous écrivez du code, vous êtes un programmeur. Ne soyez pas si dur sur vous-même. Oui, le moyen le plus facile est Martin.'s réponse, mais ce n'est pas ce que j'appellerais) la bonne Réponse.
OriginalL'auteur Mike Boutin | 2012-04-14
Vous devez vous connecter pour publier un commentaire.
En supposant que vous êtes à l'aide de xdebug, vous pouvez définir votre propre limite avec
OriginalL'auteur Martin.
modifie le fichier /etc/mysql/my.cnf paramètre à quelque chose comme ça
max_allowed_packet = 512M
Être sûr que vous avez xdebug installé (utiliser la fonction phpinfo()) et ensuite modifier le fichier /etc/php5/fpm/php.ini de l'ajout ou de la modification de la ligne :
xdebug.max_nesting_level=1000
Redémarrer les services
sudo service mysql restart
sudo service php5-fpm redémarrer
Si elle ne fonctionne pas, vous pouvez toujours régler ces deux paramètres pour faux dans /etc/php5/fpm/php.ini
xdebug.remote_autostart=0
xdebug.remote_enable=0
OriginalL'auteur medina
Dans mon cas, c'était compositeur. Certains fournisseurs ont été mis à jour dans le compositeur.json fichier, mais j'ai oublié d'exécuter les commandes compositeur de mise à jour ni compositeur installer. Le système a généré une cascade de errros, qui a été à l'origine de ce "maximum imbriquée niveau".
Après l'exécution de ces commandes, le problème a été résolu
OriginalL'auteur Nicolas
En supposant que vous n'avez pas fait un drop-dead arrêter erreur, il suffit de modifier la limite de xdebug.
Je sloved ce problème par l'évolution de la xdebug.ini fichier. (Dans mon mac, le chemin est /usr/local/php5-5.6.17-20160108-103504/php.d/50-extension xdebug.ini, peut-être la vôtre serait être un peu différent. )
Ajouter une nouvelle ligne à la fin de xdebug.fichier ini:
Rappelez-vous: Vous devez changer de xdebug.ini correspondant au php que vous utilisez. Par exemple, si vous avez installé php5 et xampp dans votre ordinateur, vous avez besoin de savoir qui de php que vous utilisez.
OriginalL'auteur Frank Miller