【问题标题】:PHP cUrl loop with echo带有回声的PHP cUrl循环
【发布时间】:2016-06-17 17:11:51
【问题描述】:

我正在尝试制作一个从 sitemap.xml 加载 url 并将其放入数组的脚本。它们应该一页一页地加载所有页面,并且在每个页面之后都应该打印一些东西。

<?php 

set_time_limit(6000);

$urls = array();  

$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->load('sitemap.xml');
$DomNodeList = $DomDocument->getElementsByTagName('loc');


//parsovani xml, vkladani linku do pole
foreach($DomNodeList as $url) {
    $urls[] = $url->nodeValue;
}                   

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch);    
    echo $url."<br />";
    flush();
    ob_flush();
}     

?>

还是不行。加载很长时间,不打印任何东西。我认为刷新不起作用。

有人看到问题了吗??

非常感谢 菲利普

【问题讨论】:

  • 你不需要 curl_init 在循环中。您可以创建一个 curl 对象并多次重复使用它。
  • 你能举个例子来确定一下吗? :)
  • 您只需回显$data。使用$data = file_get_contents($url);,你或许可以为自己节省几行代码
  • 我需要在每个周期中回显。但也许 Gzip 可以参与其中???

标签: php curl echo flush


【解决方案1】:

我会运行这样的东西

<?php 

set_time_limit(6000);

$urls = array();  

$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->load('sitemap.xml');
$DomNodeList = $DomDocument->getElementsByTagName('loc');


foreach($DomNodeList as $url) {
    $urls[] = $url->nodeValue;
}                   

foreach ($urls as $url) {
    $data = file_get_contents($url);
    echo $url."<br />". $data;
}     

?>

甚至更好,而不是 2 个循环。

<?php 

set_time_limit(6000);

$urls = array();  

$DomDocument = new DOMDocument();
$DomDocument->preserveWhiteSpace = false;
$DomDocument->load('sitemap.xml');
$DomNodeList = $DomDocument->getElementsByTagName('loc');


foreach($DomNodeList as $url) {
    $curURL = $url->nodeValue;
    $urls[] = $curURL;
    $data = file_get_contents($curURL);
    echo $curURL."<br />". $data;
}     

?>

【讨论】:

  • 谢谢加里。我很感激!几分钟后它以 500 ERROR :/. 结束
  • 您可能遇到内存不足错误。我会尝试从命令行运行它,如果这对你来说是一个选项......更高效.. 并将这一行 set_time_limit(6000) 更改为此 set_time_limit(0) -- 这将告诉你的脚本不要超时。
  • 谢谢。有什么办法可以在文件中打印错误?我没有选择如何从控制台运行它。
  • 我会说确保 error_reporting 已打开。您可以在 set_time_limit() 调用之前直接从脚本中执行此操作。
  • 我刚刚发现了。问题在于缓冲区大小和最大执行时间。他们不能增加它。我可能会制作 C# 应用程序而不是 php 脚本。谢谢你的一切
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 2016-07-24
  • 2011-11-02
  • 2023-03-12
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多