FAQ 常見問答集

收錄問與答的條目。

瀏覽及執行問題

瀏覽頁面出現 XML 分析錯誤? (IE 除外)

預設情況下 XHTML 1.1 輸出 MIME 為 application/xhtml+xml,這是規範的標準類型。除了 IE 以外其他瀏覽器都可以正確支援。但如果使用此標準模式頁面的成像引擎將會十分嚴格,一旦頁面有嚴重不合乎 XHTML 標準的語法便會停止解析 (Opera 可以重新以 HTML 解析) 造成瀏覽中斷。這情況發生於 1. 管理者自行插入原始碼時插入了不合規範的原始碼 2. 空間商插入不合規範的區段廣告

解決方案:

PIO 4th.Release.2 以後版本:

config.php 設定檔 USE_XHTML 選項設成 0 即可。

其他版本:

打開 lib_common.php (PIO 版在 /lib 目錄下),搜尋以下程式碼並改為註解:

<?php
header('Content-Type: '.((strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')!==FALSE) ? 'application/xhtml+xml' : 'text/html').'; charset=utf-8');
//↓↓↓
//header('Content-Type: '.((strpos($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')!==FALSE) ? 'application/xhtml+xml' : 'text/html').'; charset=utf-8');
?>

存檔後上傳應可暫時解決問題。但要完全根除還是需要從被插入的原始碼作語法上的修正才行。(廣告就沒辦法,可以的話盡量找沒廣告的空間或虛擬主機、自架主機)

附: XHTML 1.1 與 HTML 不同處及應注意要點

請參考中文維基百科 XHTML 條目 (點按此處瀏覽)。

  • 元素標籤需全部小寫
  • 部分元素標籤在 XHTML 已經取消 (如 <font>),請改用 CSS 樣式表指定
  • 元素標籤要對稱 (<xx></xx>),如果只有單獨一個元素標籤 (稱作空元素) 請使用 <xx /> 方式
  • 元素標籤屬性值請用引號 ", ' 框起,即使是沒有值的屬性 (如 checked) 也需要賦值 (checked="checked")
  • 元素標籤的部分屬性值在 XHTML 已經取消
  • 在 XHTML 裡,特殊符號不能直接出現而需要以參照碼形式表示 (最常見的如 & => &amp;, < => &lt;, > => &gt;)

如果不確定網頁是否符合 XHTML 標準,可以使用 The W3C Markup Validation Service 來驗證,
或使用 HTML Purifier 小程式來幫助您把標籤自動轉換為正確的 XHTML 1.1 格式。

圖檔上傳後並沒有存在於圖檔資料夾,另外發現根目錄有 *.tmp 檔案

可能是上傳過程中因為程式執行出錯中斷了,造成暫存檔出現。發生的原因可能為網路問題 (上傳中斷)、程式運作問題 (找看看伺服器的 Error log 指出程式哪邊出問題)。
另一種可能為寫入權限問題,請參見「回應頁面快取無法寫入於快取資料夾」相關說明。

回應頁面快取無法寫入於快取資料夾

這可能是伺服器的權限設定比較嚴格的原因,不同使用者沒有權限進行操作。執行 PHP 程式的使用者帳戶未必有權限可以操作自動產生的資料夾。
解決方法為手動刪除這些資料夾後,再手動新增同名資料夾,並將權限改為 777。這樣資料夾的擁有者便會改變,有權限進行操作。
如果出現 PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 41 bytes) in /lib/pio/pio.sqlite.php on line XX 或類似的字樣,請增大 config.php 的 memory_limit 一項所設定的大小。

回應頁面快取功能也是一樣的問題,解決方法也相同:手動刪除資料夾後,再手動新增同名資料夾,並將權限改為 777。

瀏覽 Pixmicat! 靜態頁面時瀏覽器白色一片?

本問題通常為瀏覽器誤判頁面編碼導致解析錯誤,經常發生於 IE 系的瀏覽器。

  • 使用者請查看網頁編碼是否為 Unicode (UTF-8),如果不是將其修正即可。
  • 管理者若使用 Apache 伺服器而想避免上述情況發生,可檢查主機是否有開啟 mod_mime 功能;若有則可使用 AddDefaultCharset 指令於所有輸出網頁強制指定使用 UTF-8 編碼,或者亦可使用 AddCharset 指令搭配自訂副檔名(例如 index.html.utf8)而達到動態指定編碼的效果。

另一種可能是伺服器端的問題,而非瀏覽器的問題。伺服器端可能因為所謂的安全因素而封鎖一些會使用到的函數(或其他不確定因素),因而執行發生問題。

  • 試著把 config.php 的 GZIP_COMPRESS_LEVEL 改成 0,不少免費空間不支援 Gzip 即時壓縮。
  • 有的伺服器會把 <?xml version="1.0" encoding="UTF-8"?> 一行也當成 PHP 執行 (PHP.ini short_tags),請從 inc_pixmicat.tpl 搜尋這段並將其刪除後以 UTF-8 (without BOM) 儲存後重新上傳 (比較舊的版本可能在 lib_common.php),再手動連到 pixmicat.php?mode=remake 重新生成頁面。

瀏覽頁面出現 Parse error: syntax error, unexpected T_STRING in /XXXX/index.htm on line 1?

基本上這個情況跟上面的白色一片差不多,差別在於白色一片是伺服器關閉了錯誤提示,而這個情況是開啟了錯誤提示。知道錯誤訊息後就比較好辦了,這個現象可以分析如下:

  • 明明是 HTML 檔案,卻出現 PHP 錯誤訊息,可見檔案被當作 PHP 解析
  • unexpected T_STRING 代表未預期的字串,可見是語法錯誤了
  • on line 1 告訴我們問題在檔案的第一行

第一行是什麼呢?哈,正是 <?xml version="1.0" encoding="UTF-8"?>,他真的把這個當成 PHP 執行了,難怪會錯誤。請參照上一條的相關解決方式處理。

執行程式出現 Warning: Cannot modify header information - headers already sent by (xxx:1) in xxx on line xxx

這個是因為修改檔案時儲存為 UTF-8 順便存入了 UTF-8 BOM 字元,造成要修改 HTTP 檔頭時因已輸出字元造成錯誤。請不要使用微軟的記事本存檔,另外其他程式存檔時記得設定不要存入 BOM 字元。

emeditor6_utf8bom
使用 EmEditor Free 6.00.2 另存新檔時的 UTF-8 BOM 儲存選項

(Log版/PIO Log後端) 當使用更新文章重新生成靜態頁面快取時,發生討論串亂掉情形 (即有的文章出現位置不對,有的卻沒顯示)?

Log 版採用了兩個檔案加一個快取來幫助儲存所有討論串資料,而容易因為競賽狀況 (Race Condition) 或其他問題造成任一檔案毀損。因為文字檔並沒有容錯或修復功能,所以索引亂掉的情況下極有可能變成這個樣子。

解決方案:

  • 刪除 lutcache.dat : 這檔案為索引查找表快取,大部分的索引錯誤可能因為此檔不同步發生,刪掉之後程式運作會自動再造。
  • 使用 rebuildtree.php 公用程式 : PIO Log 後端可以嘗試使用此工具試圖以 img.log 生成新的 tree.log,但大前提是 img.log 並未損毀。建議在第一方案無用時立刻採取此方案,救回機率大。
  • 修改 tree.log : 將有問題的編號自討論串中移除,有時候發生一篇文章接在兩個討論串,就有可能是此檔出問題。
  • 修改 img.log : 這是比較嚴重的情況,若是連投稿文字記錄檔都毀損,幾乎救不回來,只能將尚完整的記錄取出來並刪除其他已毀損的檔案行。

如果情節嚴重,請考慮砍掉重練 (RESET)。

如何砍掉重練 (RESET)?

還記得當初如何初始化 Pixmicat! 的嗎?現在我們只需要再回復到最開始的環境即可以再度初始化。

步驟:

  1. 刪除 /src, /thumb 資料夾 : 因為我們要「砍掉重練」,舊有的圖檔無法對應到新文章。請直接刪除這兩個目錄及底下所有檔案。
  2. 刪除 /cache 資料夾 (有的話) : 此目錄為 PIO 版之回應頁面快取暫存資料夾,如果 USE_RE_CACHE 設為 1 則此目錄就會存在。將此目錄及其下所有檔案刪除。
  3. 刪除 *.htm 靜態頁面 : 預設值會存在 index.htm 跟 1.htm 等 (數字作檔名的許多檔案),這些檔案是每一頁的快取,同樣的請直接刪除。
  4. 刪除 PIO 後端 : 依照使用後端的不同,可能為 Log、MySQL 或是 SQLite 等等……請刪除這些儲存資料,比方說 Log 版即為 img.log, tree.log、MySQL 為伺服器上的 imglog 資料表等。
  5. 刪除其他暫存 : *.dat : 如果目錄有副檔名為 dat 的暫存檔案,一樣請直接刪除。

最後打開 pixmicat.php,找到 switch($mode){ 上面一行的 //init(); (可能是註解起來或是已被刪除),將其恢復為 init(); 表示我們要初始化。

<?php
init(); // ←■■!程式環境初始化,跑過一次後請刪除此行!■■
switch($mode){
    case 'regist':
?>

以 UTF-8 (不含 BOM 字元) 編碼儲存後,重新上傳到伺服器,以瀏覽器瀏覽 pixmicat.php,如果初始化完成,再將 init(); 一行註解起來或刪除,砍掉重練完成。

上傳的圖片點開來看卻是破圖 (圖片顯示不完整,底下呈現色塊似的內容)

經網友反應這應該是 Apache 伺服器的設定問題,使得 Apache 傳輸圖片到一定量便中斷傳輸,造成圖片顯示不完整 (但在伺服器硬碟內的圖片是完整的)。請嘗試修改 httpd.conf 的設定。

EnableSendfile On

改成 Off 後應該能解決這個問題。

修改及管理問題

我想加入 Google AdSense (或其他類似內容) 在頁面內,該如何修改?

PIO 4th.Release 以後:

請開啟 inc_pixmicat.tpl 檔案,此樣板檔為 Pixmicat! 用以輸出頁面所讀取的檔案。@!--&FOOTER--> <!--/&FOOTER--@ 區塊為頁尾,@!--&BODYHEAD--> <!--/&BODYHEAD--@ 區塊為頁首。只支援 HTML 碼不支援 PHP,特別注意。而插入的原始碼也請遵守 XHTML 1.1 的規定 (單雙引號、屬性值等等)

PIO 3rd.Release 以前 (含舊有 Log/MySQL 版):

請開啟 lib_common.php,這裡頭儲存了生成的頁面之頁首和頁尾和一些 Pixmicat! 本身會使用到的函數。注意看就可以很容易的發現關鍵的部分。假如我想在頁尾加上廣告,只要注意:

/* 輸出頁尾文字 */
function foot(&$dat){

這種的函式裡面的內容便可以大略知道如何插入程式碼。請特別注意到雙引號、單引號影響 PHP 語法正確與否的問題。

如果要放在頁首那也不是問題,同樣有對應的函式:

/* 輸出表頭 */
function head(&$dat){

仔細注意註解及內容應該不難找到,接著只要找到適當的地方插入程式碼即可,注意要保持 PHP 語法的正確,單雙引號很重要。

討論

新增一則回應
登入為 Wikidot 使用者
(將不會發佈)
- +
除非特別註明,本頁內容採用以下授權方式: Creative Commons Attribution-Noncommercial-Share Alike 2.5 License.