bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 EC ECShop 當 ECShop 2.7.x 遇上 PHP 5.3 or 5.4 需要自行維護修改 ...
查看: 7132|回復: 7
go

當 ECShop 2.7.x 遇上 PHP 5.3 or 5.4 需要自行維護修改的程式地雷 [複製鏈接]

Rank: 9Rank: 9Rank: 9

1#
發表於 2013-6-24 22:02 |只看該作者 |倒序瀏覽 |打印
PHP 持續在進展 5.3 >> 5.4 >> 5.5
目前網路主機商可能都還維持在 PHP 5.2.x 的版本
再怎麼能撐也會有極限的時候
雖然看起來 ECShop 2.7.3 正在進行中,但是不確定是否會解決這方面的問題
所以若此時想用 ECShop 建立購物網站的人還真的要考慮一下

自己先將開發環境開始轉換到 WampServer 2.2E 所提供的 PHP 5.3 的版本
也開始展開踩地雷的磨練
遇到什麼狀況會在這裡記錄一下
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

2#
發表於 2013-6-24 22:06 |只看該作者
程式 admin/goods_batch.php
  1. /*------------------------------------------------------ */
  2. //-- 取得商品
  3. /*------------------------------------------------------ */

  4. elseif ($_REQUEST['act'] == 'get_goods')
  5. {
  6.     $filter = &new stdclass;

  7.     $filter->cat_id = intval($_GET['cat_id']);
  8.     $filter->brand_id = intval($_GET['brand_id']);
  9.     $filter->real_goods = -1;
  10.     $arr = get_goods_list($filter);

  11.     make_json_result($arr);
  12. }
複製代碼
請將其中的一行

$filter = &new stdclass;

修改成

$filter = new stdclass;
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

3#
發表於 2013-6-29 00:29 |只看該作者
運行環境是 WampServer 2.2E 來源網址是 http://www.wampserver.com/en/
也不確定這個問題是否是 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 的最後段落
  1. /* 判断是否支持gzip模式 */
  2. if (gzip_enabled())
  3. {
  4.     ob_start('ob_gzhandler');
  5. }
  6. else
  7. {
  8.     ob_start();
  9. }
複製代碼
確認是執行到 ob_start('ob_gzhandler'); 這一行出現問題,只要註解掉就可以出現畫面
該開的 extension 都確認過了

能夠排除問題的方式有兩個:
1. 修改 php.ini 設定 output_buffering = Off 來關掉緩衝能力,不過這會影響到整個伺服器牽扯範圍太大
2. 在執行 ob_start('ob_gzhandler'); 之前先執行 ob_flush(); 先出清緩衝區的殘餘資料

想必大家都會選擇第 2 個方式,所以程式就改成
  1. /* 判断是否支持gzip模式 */
  2. if (gzip_enabled())
  3. {
  4.     ob_flush();
  5.     ob_start('ob_gzhandler');
  6. }
  7. else
  8. {
  9.     ob_start();
  10. }
複製代碼
但是案情並不簡單
因為 ob_flush(); 確實出清了某些資料,卻造成 http header 也送出了
變成在其他功能上得到了另一個錯誤

Warning: Cannot modify header information - headers already sent by ....後略

這下可有趣了,明日再戰
Orz...
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

4#
發表於 2013-6-29 22:47 |只看該作者
持續在 WampServer 2.2E (PHP 5.3.13) 環境測試了很久
終於發現是先前改變錯誤報告的設定所造成
我將 admin/includes/init.php 開頭的設定

error_reporting(E_ALL);

修改成

error_reporting(E_ALL | E_STRICT);

想要得到更嚴謹的警告訊息來改善程式品質
看來也間接影響到處理輸出壓縮機制

參考 PHP 官方文件
關於 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);
然後重新思考該如何適當處理了
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw

Rank: 9Rank: 9Rank: 9

5#
發表於 2013-6-29 23:53 |只看該作者
剛去下載 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 部分的修改,其實觀念都是一樣就不再獻醜了
我是雪龍
http://blog.bestlong.idv.tw
http://www.bestlong.idv.tw
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-4-19 17:24 , Processed in 0.033820 second(s), 11 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.