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

viala
  • 58

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

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

回复
阅读 2.1k
4 个回答

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

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

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

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

宣传栏