【问题标题】:Simple html dom parser return error 500简单的 html dom 解析器返回错误 500
【发布时间】:2016-03-11 00:20:05
【问题描述】:

我正在使用此示例中的 simple_html_dom.php

http://nimishprabhu.com/top-10-best-usage-examples-php-simple-html-dom-parser.html

但是我在课堂上收到错误 500,当我在浏览器中输入 url 时它可以正常工作吗?

我在这样的数组中有一些值

$result= Array ( 
[Avenya Group AG] => 
Array ( 
[link] => CHE-218.938.800 
[href] => http://zh.powernet.ch/webservices/inet/HRG/HRG.asmx/getHRGHTML?chnr=0203038402&amt=020&toBeModified=0&validOnly=0&lang=1&sort=0 ) ) 

当我尝试这样的事情时

    foreach($result as $key => $value) { 
        $xmlFind = file_get_html($value['href']);
        foreach($xmlFind->find('a') as $a) {
        echo '<p>'.$a->href.'</p>';
        }
}

我有错误

遇到 PHP 错误 严重性:警告 消息:file_get_contents(http://zh.powernet.ch/webservices/inet/HRG/HRG.asmx/getHRGHTML?chnr=0203038402&amt=020&toBeModified=0&validOnly=0&lang=1&sort=0):打开流失败:HTTP 请求失败! HTTP/1.1 500 内部服务器错误 文件名:库/Simple_html_dom.php 行号:76

但是当我像这样手动尝试时

$xmlFind = file_get_html('http://zh.powernet.ch/webservices/inet/HRG/HRG.asmx/getHRGHTML?chnr=0203038402&amt=020&toBeModified=0&validOnly=0&lang=1&sort=0');

结果就在那里,如果我输入那个网址我浏览器一切正常,我唯一的问题是当我尝试循环数组时??

【问题讨论】:

  • 你的意思是找不到,如果我手动输入它可以工作?

标签: php foreach simple-html-dom


【解决方案1】:

检查http://php.net/manual/en/function.file-get-contents.php 备注部分。

请检查“fopen wrappers”的服务器设置

我尝试了以下

<?php
include('simple_html_dom.php');

$result= Array ( 
'Avenya Group AG' => 
Array ( 
'link' => 'CHE-218.938.800', 
'href' => 'http://zh.powernet.ch/webservices/inet/HRG/HRG.asmx/getHRGHTML?chnr=0203038402&amt=020&toBeModified=0&validOnly=0&lang=1&sort=0' ) ); 
foreach($result as $key => $value) { 
    $xmlFind = file_get_html($value['href']);
    foreach($xmlFind->find('a') as $a) {
    echo '<p>'.$a->href.'</p>';
    }
}

得到了这个

#

http://www.shab.ch/shabforms/servlet/Search?EID=7&DOCID=6890948

http://www.shab.ch/shabforms/servlet/Search?EID=7&DOCID=981331

http://zh.powernet.ch/webservices/inet/hrg/hrg.asmx/getExcerpt?Chnr=CH-020.3.038.402-5&Amt=20&Lang=1

mailto:info@powernet.ch

【讨论】:

    【解决方案2】:

    代理可能有问题。使用适当的代理。

    // Create a stream
    $opts = array(
        'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n",
            'proxy' => 'tcp://221.176.14.72:80',
        )
    );
    
    $context = stream_context_create($opts);
    
    // Open the file using the HTTP headers set above
    $file = file_get_contents('http://ifconfig.me/ip', false, $context);
    var_dump($file);
    

    【讨论】:

    • stream_context_create(): 选项的形式应该是 ["wrappername"]["optionname"] = $value
    【解决方案3】:

    试试这个,

    <?php
    
    $result= Array ( 
        'Avenya Group AG' => 
                Array ( 
                    'link' => 'CHE-218.938.800',
                    'href' => 'http://zh.powernet.ch/webservices/inet/HRG/HRG.asmx/getHRGHTML?chnr=0203038402&amt=020&toBeModified=0&validOnly=0&lang=1&sort=0' 
                ) 
    );
    
    
    foreach($result as $arr_item){
    
        if(is_array($arr_item)) {
    
            if(isset($arr_item['href'])) {
    
                echo file_get_contents($arr_item['href']);
    
            }
    
        }
    
    }
    
    
    ?>
    

    执行上述代码后,我得到了如附图所示的响应。

    如果您仍然收到警告错误,您可以使用 curl 发送 get 请求。 所以而不是上面的echo file_get_contents($arr_item['href']);

    用下面的代码替换它。

    $ch = curl_init($arr_item['href']);
    
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    
    $result = curl_exec($ch);
    
    echo $result;
    
    curl_close($ch);
    

    【讨论】:

    • 缺少参数:amt.
    • 你可以在href里面查看amt参数,它就在那里。
    【解决方案4】:

    此消息由远程服务器返回。说明此时服务器可能不可用。

    我认为这可能是由于执行您在循环中发出的不同请求所需的资源太重要所致。它还可以与某些拒绝服务保护相关联。

    达到最大授权连接数后,返回“HTTP 500 Server Too Busy”。

    见:https://www.iis.net/configreference/system.webserver/asp/limits

    requestQueueMax 属性指定允许进入队列的最大并发 ASP 请求数。任何在队列已满时尝试请求 ASP 文件的客户端浏览器都会收到 HTTP 500 Server Too Busy 错误。

    如果您没有时间限制,可以尝试使用sleep() 延迟对网址的每次调用。

    最好的办法是联系远程 Web 服务的所有者/系统管理员,让他知道问题,以便他进行调查。

    根据您在脚本中执行的操作,您还可以忽略错误消息并继续下一次调用:

    foreach($result as $key => $value) { 
        // added @ to ignore the error
        $xmlFind = @file_get_html($value['href']);
    
        // continue to the next result
        if (!$xmlFind) continue;
        foreach($xmlFind->find('a') as $a) {
           echo '<p>'.$a->href.'</p>';
        }
    }
    

    【讨论】:

    • 500 错误也可能是内部错误,尤其是 Simple html Dom memory leak,或者只是一个未配置的服务器,或者可能是任何东西......
    • @cwps 由于错误来自远程服务器,您可以很好地排除这个本地使用的库中的内存泄漏。错误消息“未能打开流:HTTP 请求失败!”完美地解释了本地抛出的错误。这个问题的主题更多的是解释这个错误以及为什么当我们在一个循环中调用这个代码而远程配置没有改变时远程服务器会抛出这个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多