1

好的,我想现在是时候在这里询问我的剧本了,

我有一个大数组,我想循环它,然后在达到一定数量时停止它,然后继续循环,这是一个脚本示例,

$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.
    }
}

print_r($result_array);

因此,第一个数组来自 XML 响应,我再次使用位置循环它并再次从 XML 请求它,我再次将它循环到另一个数组中,然后我想在循环外输出最后一个数组,

但是我在这里遇到了麻烦,因为它是一个非常大的数组,如果数组不是那么大,它会很好,但是当我想让它更大时,我没有得到任何结果,因为浏览器停止了它,

我试图玩弄内存,但它没有解决我的问题,所以我想最好的方法是我应该停止数组然后输出它然后继续循环,但我不知道该怎么做,

请帮我解决

谢谢

4

2 回答 2

1

但是我在这里遇到了麻烦,因为它是一个非常大的数组,如果数组不是那么大,它会很好,但是当我想让它更大时,我没有得到任何结果,因为浏览器停止了它,

听起来你正在达到执行超时(就像@Haroon提到的那样)。您可能想查看错误日志或检查请求是否失败,状态为 500(内部服务器错误)。

set_time_limit()允许您随意(重新)设置执行超时。但是,如果您的脚本运行时间超过 30 秒(这应该是执行超时的默认设置),您可能需要研究构建该数组的替代路线。


foreach($locations as $loctn){
//Request of the XML,
$result = //A large array coming from a XML SOAP respond;

听起来您正在从网络服务中提取数据。听起来您可能(对于 中的大量项目$locations)正在对该 Web 服务执行大量请求。

访问网络服务可能很慢。如果您有任何方法可以在您的流程之外执行此操作(“作业队列”,与 cron 作业有关的东西,...),请执行此操作。还要检查webservice提供的数据是否可以缓存和重用。

于 2012-06-17T16:27:18.307 回答
1
echo str_repeat(' ', 4096); // you need this or something similar, because most of browsers don't print anything if they don't have enough to parse

foreach (...) {
...
    foreach (...) {
        ...
        print_r($result_array);
        flush(); // echo the buffer
    }
}

有时浏览器在接收到足够的数据之前不会显示任何内容,这就是 str_repeat() 的原因。

来自 PHP 手册:

flush() 可能无法覆盖 Web 服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲都没有影响。[...]

Apache 的服务器模块(如 mod_gzip)可能会自己进行缓冲,这将导致 flush() 不会导致数据立即发送到客户端。

甚至浏览器也可以在显示之前缓冲它的输入。例如,Netscape 会缓冲文本,直到它接收到行尾或标记的开头,并且在看到最外层表格的标记之前不会呈现表格。

某些版本的 Microsoft Internet Explorer 仅在收到 256 字节的输出后才开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示页面。

尝试修复您的代码:

echo str_repeat(' ', 4096);
$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.

        print_r($result_array);
        flush();
    }
}

此代码应在每个循环中打印 $result_array。

于 2012-06-17T16:16:23.647 回答