如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)

Posted

技术标签:

【中文标题】如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)【英文标题】:How to append to a large XML (file) without loading entire content with PHP 【发布时间】:2014-03-26 16:35:39 【问题描述】:

我做了一个自动excel到mysql的转换器模块来建立一个基于php的自目录网站。但我在自动更新它的站点地图时遇到了一个严重的问题。

转换工作会持续一整天,Google 的爬虫可能会随时获取站点地图文件。因此,每次转换成功的条目时,我都会设法更新站点地图的 XML 文件,但是每次转换都使用 DOM 或 simpleXML 更新大型 XML 文件的成本很高,因为所有数据首先加载到 RAM 并再次写入文件!

我决定像这样使用“file_put_contents”来加速:

file_put_contents($xmlFile, $currentData, FILE_APPEND | LOCK_EX);

但问题是每个文件都以</urlset> 结尾并删除最后一行需要使用具有相同问题的fopen()fseek,加载整个文件!

是否有任何可能的方式来修改文件的最后一行而不将整个内容加载到 RAM 或其他方式将新标签附加到 XML 文件而不加载整个标签?

【问题讨论】:

【参考方案1】:

fseek() 不需要 需要读取整个文件。只求到最后,倒序搜索下一个换行符,删除最后一行。

但是,为什么不使用扁平化格式呢?喜欢:

/sub1/page1
/sub1/page2
/sub1/sub2/page1

如果你想附加到文件中,IMO 这看起来不那么骇人听闻。

【讨论】:

感谢您的信息,我在 /language/page/action/params 之类的 url 中使用了扁平格式,但链接数量太多(大约 500k 或更高),谷歌可能无法识别所有这些. 顺便删除大文件最后一行的最佳方法是什么? (技术)

以上是关于如何在不使用 PHP 加载整个内容的情况下附加到大型 XML(文件)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载整个页面的情况下刷新 div?

如何在不重新加载整个页面的情况下重新加载 div?

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

如何在不刷新整个页面的情况下重新加载组件?

如何在不重新启动的情况下在 Express 上重新加载一个文件?

如何在不更改页面的情况下更改内容(非散列 URL)?