顯示具有 php 標籤的文章。 顯示所有文章
顯示具有 php 標籤的文章。 顯示所有文章

2015年8月7日 星期五

PHP + JavaScript 提供 L10N 的文字

我希望的用法如下:

  • PHP 和 JavaScript 共用同一套文字格式。
  • PHP 和 JavaScript 用同一套 API。
  • 各國語系用字串 key 取出翻譯的內容。優點是可以隨意更改預設語系的內容; 缺點是網頁原始檔有一點難閱讀,無法像 L10N 前那樣直接看到內文。
  • 選用的目標語言缺內容時,改用預設語言。
  • L10N 的文字存成 JSON, 方便用各種工具編輯。
  • 函式庫相依性愈小愈好。

多數人使用的 gettext 不合我的需求, 查了一下沒找到順手的工具, 最後自己寫了一個。只有一個檔案 l10n.php, 程式不到 100 行。我不太熟 PHP 和 JavaScript, 可能寫得不怎麼道地。

用法是在網頁內 <?php require('l10n.php') ?>, 之後 PHP 和 JavaScript 都可以用 _m(KEY) 取得對到目前語言的字。可用 ?lang=LANG 切換語言,不然會以 Accept-Language 內 weight 最大的為目標語言。預設語言為 en。

API 還有一些可以改進的地方,像是支援替換文字內的變數,不用自己取出來後再替換;或是在 JSON 格式內加些輔助翻譯的描述。不過比較細微就是了,有這打算時再來參考 Chrome extension API 的作法, 還滿直覺的。

2010年11月27日 星期六

PHP framework 緩慢的可能原因

先聲明我不熟 PHP, 也很久沒寫 PHP 了, 這篇的解讀可能有誤。

看了 PHP 作者寫的 Simple is Hard 以及聽 DK 說明, 才終於明白為啥大家說 PHP framework 很慢, 畢竟 scripting language 寫的 framework 滿天飛, 為啥 PHP 的情況比較不同。

剛從 PHP 換到 Rails / Django 時, 不習慣設好 production server 後就無法一存檔就重讀程式。現在才知道為了這個方便的功能, 付出過高的代價。為了能夠一存檔就執行到新的程式, 有幾種簡單的作法:
  • 每次都重讀程式碼並重編譯。代價是非常慢, 又要讀檔又要編譯程式。使用 opcode cache 可減輕這問題, 確保只編譯一次程式。
  • 每次都要檢查檔案修改時間, 才知道是否需要重編譯程式。
第二點乍看並不嚴重, benchmark 單頁 PHP 看起來也沒問題, 但使用 framework 時卻不是這麼一回事。即使是寫個 Hello, world 的頁面, framework 仍會載入不少 script, 被載入的 script 會再載入其它 script, 一大串相依性造成的結果, 就是載入一堆檔案。若檔案只會載入一次, 似乎也不是大問題, 但別忘了需要檢查檔案最後修改時間, 結果就是讀個簡單頁面也會有大量的 system call, 而 system call 是很昂貴的。
相關佐證可以參見 Simple is Hard, 難怪投影片裡不斷強調相依性的結構圖還有執行 stat 相關函式的次數。讓我想到 Joel 寫的 《抽象滲漏法則》, 在框架之上, 很難查覺底層的問題。前陣子也才因 NFS server 負擔過重, 讓我以為是我的 vim 出錯, 開關檔變得超慢的。

其它可能的原因還有 PHP 的 OO 設計不良, 或是一些早期設計留下的包袱, 常用 PHP 的人應該比較清楚, 我沒仔細研究。

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...