當 ECShop 2.7.x 遇上 PHP 5.3 or 5.4 需要自行維護修改的程式地雷
PHP 持續在進展 5.3 >> 5.4 >> 5.5目前網路主機商可能都還維持在 PHP 5.2.x 的版本
再怎麼能撐也會有極限的時候
雖然看起來 ECShop 2.7.3 正在進行中,但是不確定是否會解決這方面的問題
所以若此時想用 ECShop 建立購物網站的人還真的要考慮一下
自己先將開發環境開始轉換到 WampServer 2.2E 所提供的 PHP 5.3 的版本
也開始展開踩地雷的磨練
遇到什麼狀況會在這裡記錄一下 程式 admin/goods_batch.php[code]
/*------------------------------------------------------ */
//-- 取得商品
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'get_goods')
{
$filter = &new stdclass;
$filter->cat_id = intval($_GET['cat_id']);
$filter->brand_id = intval($_GET['brand_id']);
$filter->real_goods = -1;
$arr = get_goods_list($filter);
make_json_result($arr);
}
[/code]請將其中的一行
$filter = [color=Red]&[/color]new stdclass;
修改成
$filter = new stdclass;
運行環境是 WampServer 2.2E 來源網址是 [url]http://www.wampserver.com/en/[/url]
也不確定這個問題是否是 PHP 5.3.13 的問題
進入 ECShop 後台的商店設置功能
在 Firefox 得到:
內容編碼錯誤
您嘗試檢視的頁面無法顯示,因為其中使用了無效或不支援的壓縮類型
在 Chrome 得到:
這個網頁無法使用
錯誤 330 (net::ERR_CONTENT_DECODING_FAILED): 未知的錯誤
在 IE10 得到:
Internet Explorer 無法顯示網頁
You are not connected to the Internet. Check your Internet connection
追蹤程式到 admin/init.php 的最後段落[code]
/* 判断是否支持gzip模式 */
if (gzip_enabled())
{
ob_start('ob_gzhandler');
}
else
{
ob_start();
}
[/code]確認是執行到 ob_start('ob_gzhandler'); 這一行出現問題,只要註解掉就可以出現畫面
該開的 extension 都確認過了
能夠排除問題的方式有兩個:
1. 修改 php.ini 設定 output_buffering = Off 來關掉緩衝能力,不過這會影響到整個伺服器牽扯範圍太大
2. 在執行 ob_start('ob_gzhandler'); 之前先執行 ob_flush(); 先出清緩衝區的殘餘資料
想必大家都會選擇第 2 個方式,所以程式就改成[code]
/* 判断是否支持gzip模式 */
if (gzip_enabled())
{
ob_flush();
ob_start('ob_gzhandler');
}
else
{
ob_start();
}
[/code]但是案情並不簡單
因為 ob_flush(); 確實出清了某些資料,卻造成 http header 也送出了
變成在其他功能上得到了另一個錯誤
Warning: Cannot modify header information - headers already sent by ....後略
這下可有趣了,明日再戰
Orz... 持續在 WampServer 2.2E (PHP 5.3.13) 環境測試了很久
終於發現是先前改變錯誤報告的設定所造成
我將 admin/includes/init.php 開頭的設定
error_reporting(E_ALL);
修改成
error_reporting(E_ALL | E_STRICT);
想要得到更嚴謹的警告訊息來改善程式品質
看來也間接影響到處理輸出壓縮機制
參考 [url=http://www.php.net/manual/en/errorfunc.constants.php]PHP 官方文件[/url]
關於 E_STRICT 常數有備註 Since PHP 5 but not included in E_ALL until PHP 5.4.0
說明了 PHP 5 時代 E_ALL 並不包含 E_STRICT
直到了 PHP 5.4 版本開始就是 E_ALL 就包含 E_STRICT
所以就先還原成
error_reporting(E_ALL);
然後重新思考該如何適當處理了 剛去下載 xampp-win32-1.8.2-0-VC9 來測試
有一段時間沒用新版了
發現已經是進入 PHP Version 5.4.16
將 ECShop 程式與資料庫都搬遷好,然後啟動進入前台首頁:
Strict Standards: Only variables should be passed by reference in D:\xampp-1.8.2\htdocs\ecshop\includes\lib_main.php on line 1321
Strict Standards: Only variables should be passed by reference in D:\xampp-1.8.2\htdocs\ecshop\includes\cls_template.php on line 406
喔,遇上了 Strict Standards 訊息,屬於函數參數的傳入型態問題
lib_main.php 出現一次,而 cls_template.php 出現很多次
那就先來解決最多的 cls_template.php 錯誤,就是這一行
$tag_sel = array_shift(explode(' ', $tag));
我改成
$tag_exp = explode(' ', $tag);
$tag_sel = array_shift($tag_exp);
反正就是不要直接用函數回傳值當函數參數
所以要用變數接回傳值,再當參數傳入
要小心的選擇變數名稱,最好先搜尋確認一下,可別影響原本的程式運作
直覺上好像多了變數增加執行負擔,或許會影響效能
不過應該會在 compiler 上做些特別的最佳化處理
至於 lib_main.php 部分的修改,其實觀念都是一樣就不再獻醜了
頁:
[1]
2