PHP 获取 xml (sitemap)文件写入数据库时间过长

1.需求是这样的:

有若干-sitemap-链接地址,如:http://xxx.xxx/xx.xml
其中的内容,如:http://xxx/xxx/xx (多条)
我需要读取-xml-中的内容,然后访问其中的链接,获取其 title,然后和链接一起写入数据库。

2.我的代码是这样的:

set_time_limit(0);

function get_title($url) {

    $output = file_get_contents($url);
    $page = [];
    $page['title'] = '';
    preg_match('/<TITLE>([\w\W]*?)<\/TITLE>/si', $output, $m);

    $page['title'] = $m[1];

    return $page['title'];
}

$xml_str = file_get_contents($xml_url);

// $data = simplexml_load_file($xml_str);
$xml_obj = simplexml_load_string($xml_str);

$data = [];
$current = time();

foreach ($xml_obj as $k => $v) {
        
    $data[$k]['title'] = get_title($v->loc);
    $data[$k]['url'] = $v->loc;
    $data[$k]['created_at'] = $current;
}

$ret = Sitemap::insert($data);

可是这样很容易崩,提交数据的时候本地服务直接运转不过来。
?有没有更好的解决办法

阅读 3.4k
4 个回答

php cli模式运行,不要在浏览器

用curl 替代 file_get_contents 效率能提高很多,还稳定

你的崩是什么意思?内存溢出了吗?还是只是慢

我看了下,你的这样写也没啥大问题,顶多就是curl替代file_get_contents这样会快点,但也不是什么大的问题。
一开始我以为是file_get_contents爆内存了,但是想了想,你获取的是html,再大也就几m,应该不是这个问题,所以最后我把问题定位在这里:Sitemap::insert($data);
你的insert里面是怎么实现的?foreach insert的话是有问题的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题