為php4加上檔案上傳進度功能

 Fri, 12 Oct 2007 09:04:15 +0800

檔案上傳進度資訊是PHP5.2才新增的功能。但是最近在逛phpclass.org時,發現有人做了PHP4的patch。patch及說明的出處:http://www.phpclasses.org/blog/post/61-File-upload-progress-meter-for-PHP-4-at-last.html

作者是早期PHP的核心開發人員,跟據他的說明,其實在php4就已經有人做了patch,但是不知為何到了PHP5.2,PHP團隊才把這個功能正式加進來。PHP5已經問世好幾年了,但是市面上大部分的網站,其實都還在用PHP4,主要是因為移植的複雜度以及潛在問題,所以許多人裹足不前。所以為了廣大的PHP4用戶,他做了Patch,使用這個patch就可以支援PHP5.2的檔案上傳進度資訊功能。

看到這個資訊很興奮,不過他patch的rfc1867.c是屬於PHP的核心,所以非得重新編譯不可。另外,PHP4已經不再更新了,末代版本是4.4.7,作者patch的版本是4.3.11以及4.4.4,在PHP官方網站上已經找不到原始碼的套件,所以只好用4.4.7來試試看。

以下是大致的過程中以及我碰到的一些問題:

  1. 一開始我是手動一行一行改rfc1867.c以及rfc1867.h,發現編譯可以過,但是結果上傳功能出問題.....。所以用patch指令來做,但是會有三處無法patch的地方,這些就再手動patch吧。結果.....恩,上傳功能沒問題,但是不知道上傳進度資訊可不可以用。
  2. 上網找了一下,結果還是到PECL下載了uploadprogress套件,網址:http://pecl.php.net/package/uploadprogress。套件中幾乎沒有說明,不過看起來是需要有PHP5.2才能裝。沒關係,先phpize,然後configure/make/make install。(我在我的系統裡面另外編譯了一套apache-2.0.61來測試,同時另外編譯一套php-4.4.7,但是使用phpize的時候,他會把include directory指到系統中預設的php目錄,所以我另外手動改了Makefile,才能順利編譯安裝)
  3. 安裝完畢以後,跑phpinfo(),ok,出現uploadprogress套件訊息,看起來這個延伸套件有作用。另外用get_defined_functions()函數,可以發現有一個叫做uploadprogress_get_info()的函數。
  4. 還是不知道怎麼用比較好,所以到網上找一找。後來在這個網站上找到說明跟展示:http://blog.liip.ch/archive/2006/09/10/upload-progress-meter-extension-for-php-5-2.html。更新過可demo的東西要參考另一個blog:http://blog.joshuaeichorn.com/archives/2005/05/01/ajax-file-upload-progress/。他的demo檔案放在一個web svn系統上:http://websvn.bluga.net/wsvn/HTML_AJAX/trunk/?rev=0&sc=0,把檔案下載下來,測試了一下......成功!!!

如果大家想要測試的話,以下是我patch過的rfc1867.c以及rfc1867.h:下載(注意:只能給php-4.4.7用,我是用它的source來patch的喔)

另外是幾個測試的圖片:

  1. 這是phpinfo()的畫面:
    upload progress
  2. 這是get_defined_functions()的畫面:
    upload progress
  3. 這是上傳進度的畫面:
    upload progress
  4. 這是上傳結束的畫面:
    upload progress

(我把畫面中的網址拿掉,因為我測試完就把測試用的apache關掉了。其實效果應該跟demo網站是一樣的。)