2011-09-06 112 views
1

這是我在一個網站地圖文件的末尾添加新條目代碼:PHP追加文本文件

$add_info=" 
<url> 
$token 
<lastmod>$date</lastmod> 
</url> 
</urlset>"; 
$end_string = "</urlset>"; 
$length_end_string = strlen($end_string); 
fseek($handle, -$length_end_string, SEEK_END); 
fwrite($handle, $add_info); 

其中一期工程正常的,但有時食堂了例如像在文件的結尾:

<url> 
<loc>http://example.com/url1.html</loc> 
<lastmod>2011-08-31</lastmod> 
</url> 
</url<url> 
<loc>http://example.com/url2.html</loc> 
<lastmod>2011-08-28</lastmod> 
</url> 
</urls<url> 

難道一個原因是PHP解析器無法正常到達文件的結尾?

+2

可能重複( http://stackoverflow.com/questions/4906073/a-simple-program-to-crud-node-and-node-values-of-xml-file) – Gordon

回答

1

調用打開文件後添加到flock(與LOCK_EX)。這將防止由於併發而混合寫入。

+0

好了,我不認爲這是一個併發問題。 – Nevyan

1

我認爲這個問題的原因很簡單,就是你在$ ADD_INFO變量有

</urlset> 

它不應該包含關閉的網址設定。

此外,試圖手動計數的字符,把硬編碼的負數的參數,看看會發生什麼。 (一些有趣的事情可能來自於此)

+0

試過相同的結果... – Nevyan

1

使用正確設置的文件,這應該工作,但是,你是盲目倒帶9個字符,所以如果文件末尾有額外的空白空間,這將會中斷。事實上,您的urlset關閉標籤被截斷兩種不同的方式可能暗示您的文件不符合您的期望。

你可能會考慮的方式來驗證您的文件指針位置或使用XML庫作爲在評論中提及您Q.

[一個簡單的程序,以XML文件的CRUD節點和節點值]的
+0

你可以更具體的驗證指針位置嗎? – Nevyan

+0

作爲一個快速的想法,不優雅,就在我的頭頂:尋找文件的末尾,然後讀取(向後)1個字節每次向尺寸$ length_end_string',直到緩衝區的'緩衝匹配'$ end_string '。 – horatio