2012-06-17 55 views
1

好吧,我想现在是时候在这里问了我的脚本,停止循环和输出,然后继续PHP

我有一个大阵,我想循环,然后停止它,当它达到一定的量,然后继续循环,这里是脚本的一个样本,

$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和我循环再次请求它再次进入不同的阵列,然后我想输出循环外的最后一个数组,

但是我在这里遇到了麻烦,因为它的阵列非常大,而且如果阵列不那么大,它会变得很好,但是当我想让它变大时,我没有结果,因为浏览器停止了它,

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

请帮我出这

谢谢

+2

这听起来像是应该在CLI端完成的事情。这对你有可能吗?我猜这个脚本正在停止,因为正在达到最大执行时间(这个值通常在PHP.ini文件中找到(max_execution_time)。 – Haroon

+0

不,我必须在脚本中做一些事情,它应该在这里完成,因为通常我知道我的经验,如果我改变了文件中的某些东西,我发现我可以在自己的脚本中完成这项工作 – thegrede

+0

CLI意味着在命令行上运行脚本,所以你仍然可以拥有相同的脚本,但在CLI端,它允许你长时间运行一个脚本,我认为这是你需要的。 – Haroon

回答

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每个循环。

+0

'echo str_repeat('',4096);'不同的方式,或者它必须与整个脚本? – thegrede

+0

为什么你把两个foreach循环,我必须把flush函数放在我的例子的循环中,或者我必须做另一个循环,这就是为什么我不明白你做foreach循环,谢谢你的时间, – thegrede

+0

我再次修复了我的帖子。我放的两个foreach循环是你的foreach循环(没有条件等):) – HBv6

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; 

听起来就像你从Web服务中提取数据。这听起来像你可能(对于$locations中的大量项目)在该web服务上执行了很多请求。

访问web服务可能会很慢。如果你有任何办法在你的过程之外做这件事(“工作队列”,有cron工作的东西......)。同时检查Web服务提供的数据是否可以缓存和重用。

+0

我尝试了几次'set_time_limit()'函数没有解决我的问题,因为当我把'print_r()'函数放在循环中,那么它就ok了,当我把它放在循环外部时,问题就出现了,关于web服务我可以提出多少请求我也试过了,谢谢你帮帮我, :) – thegrede