简单的HTML DOM解析器返回错误500

16

我正在使用来自此示例的 simple_html_dom.php 库。

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

但是在类内部我遇到了500错误,当我在浏览器中输入网址时,它可以正常工作?

我有一些像这样的数组值

$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 Internal Server Error 文件名:libraries/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');

结果已经存在,如果我在浏览器中输入该网址,则一切正常。唯一的问题是当我尝试循环一个数组时出现了问题?


你的意思是找不到吗?如果我手动输入它就可以工作? - Miomir Dancevic
4个回答

6
请查看http://php.net/manual/zh/function.file-get-contents.php的注释部分。
请检查您的服务器设置是否启用“fopen包装器”。
我尝试了以下方法:
<?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

4

代理可能会成为问题。使用适当的代理。

// 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的形式。 - Miomir Dancevic

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);

enter image description here


缺少参数:amt。 - Miomir Dancevic
你可以检查 href 中的 amt 参数,它在那里。 - Alpesh Panchal

3

这个信息是由远程服务器返回的。它显示服务器此时可能无法使用。

我认为这可能是由于在您的循环中执行不同请求所需的资源过多引起的。这也可能与某些拒绝服务保护有关。

达到授权连接的最大数量后,会返回“HTTP 500服务器太忙”。

参见: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](http://simplehtmldom.sourceforge.net/manual_faq.htm#memory_leak)时,或者只是一个配置不正确的服务器,或者可能是任何其他问题... - cwps
1
@cwps 由于错误来自远程服务器,因此您可以排除本地使用的库中存在内存泄漏的可能性。本地抛出的错误通过错误消息“无法打开流:HTTP请求失败!”得到了完美的解释。这个问题的主题更多的是解释这个错误以及为什么当我们在循环中调用这段代码时,远程服务器会抛出这个错误,而远程配置并没有改变。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接