bestlong 怕失憶論壇

 

 

搜索
bestlong 怕失憶論壇 論壇 EC ECShop 當 ECShop 2.7.x 遇上 PHP 5.3 or 5.4 需要自行維護修改 ...
樓主: bestlong
go

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

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

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

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
‹ 上一主題|下一主題

Archiver|怕失憶論壇

GMT+8, 2024-5-17 11:58 , Processed in 0.010378 second(s), 10 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc.