标签 ECShop 下的文章

升级WampServer中Apache、PHP、MySQL版本

初到jjsj公司工作又近2个月。了解到公司从16年4月开始做EC的B2B商城。由于公司领导不懂技术。找到外包公司做了一个Java版本的系统短期快速上线后发现问题多多也找不到售后。功能修改的需求无法快速满足。又下线后重新采用PHP+ECShop重新开发了一套。前期Java版本在阿里云ECS CentOS上跑。后来ECShop上马又转到Windows Server 2008 R2 服务器环境用的是奇葩的IIS+PHP组合。确实是够折腾的。

三个月我把服务器上面的IIS卸载掉,转到WAMP环境(采用WampServer),我用的是WampServer2.0i.exe安装包,2009年发布的版本,包含:Apache2.2.11,PHP5.3.0,MySQL5.1.36。为什么要用这么老的版本?难道不怕security bug吗。非也非也。最新的ECShop源码2.7.3最高只能支持到PHP5.3。ECShop里面又很多引用新建对象代码:&new Object,这玩意儿在新版本PHP5.5及其以上的已经版本已经deprecated。

WampServer2.0i.exe里面的二进制都是采用VC6编译。而最新的一般都是VC9。这点需要注意。

虽然说AMP套件是跨平台开源软件,但实际上Windows平台一直都是被歧视的。所以找到对应版本的Win32 VC9 编译版确实是门学问。

这里:http://mirrors.cnnic.cn/apache//httpd/binaries/win32/ 有可以下载编译好的Win32版本。

Apache 2.2.11升级到2.2.31

到apachehaus下载 httpd-2.2.31-x86-r6.zip解压到D:\tunps.com\bin\apache\Apache2.2.31,将老版本(2.2.11)手动卸载。在cmd下运行:D:\tunps.com\bin\apache\Apache2.2.11\bin\httpd.exe -k uninstall,然后安装新版本:D:\tunps.com\bin\apache\Apache2.2.31\bin\httpd.exe -k install -n apache22,将老版本的conf目录覆盖到新版本的conf目录。修改PHP LoadModule的路径和ServerRoot:

ServerRoot "D:/tunps.com/bin/apache/apache2.2.31"

LoadModule php5_module "D:/tunps.com/bin/php/php5.3.29/php5apache2_2.dll"

然后重启Apahce让配置生效:D:\tunps.com\bin\apache\Apache2.2.31\bin\httpd.exe -k restart
注意:因为2.2.31用的是VC9编译,为了让httpd跑起来,必须确保服务器环境已经安装VC++ Redist 2008 SP1。

PHP 5.3.0升级到5.3.29

PHP也是同样的道理,官方php.net不提供win32而精致版,所以在apachelounge搜索到人家的编译版:

https://phpdev2.toolsforresearch.com/php-5.3.29-nts-Win32-VC9-x86.zip 
https://phpdev2.toolsforresearch.com/php-5.3.29-Win32-VC9-x86.zip 
https://phpdev2.toolsforresearch.com/php-5.3.29-nts-Win32-VC9-x64.zip 
https://phpdev2.toolsforresearch.com/php-5.3.29-Win32-VC9-x64.zip 

nts表示非线程安全,我们不需要这个。下载好之后解压到D:\tunps.com\bin\php\php5.3.29,将老版本PHP5.3.0的php.ini覆盖到5.3.29,并且覆盖一份到apache2.2.31\bin目录下。这样不用修改任何配置,可以直接使用。但是php.ini有一个地方还是要修改:

extension_dir = "D:/tunps.com/bin/php/php5.3.29/ext/"

MySQL 5.1.36升级到最新的5.7.16

因为PHP一般都是采用tcp socket和MySQL连接,所以兼容性要求并不高,哪怕PHP的MySQL扩展(php_mysqli.dll)还是5.0.8 2010年的版本,但还是可用。

到MySQL官网下载最新的MySQL win32压缩包(mysql-5.7.16-win32.zip),现在的MySQL安装包做得很大,有400MB左右,里面不仅仅包含二进制还是各种文档、各种语言的客户端连接library还有Visual Studio扩展等等。安装程序也不是十年那样的简陋,可以安装的过程中实现各种高级配置(端口、用户名、安全性设置 etc.)。

解压MySQL压缩包到D:\tunps.com\bin\mysql\mysql-5.7.16-win32,管理员cmd下安装MySQL:

mysqld --install mysql57

初始化数据:

mysqld --initialize

或者:

mysqld --initialize-insecure

没有加insecure的自动生成一个随机的root密码, root密码在:D:\tunps.com\bin\mysql\mysql-5.7.16-win32\data\<host name>.err 日志文件里面。加了insecure的,默认root没有密码。mysql -uroot -p登录后用

set password = password('tunps.com');

设置为新密码。

然后重新导入SQL文件即可。

如果不初始化mysql直接启动mysql服务会启动不起来,事件查看器eventvwr.msc报错:

failed to set datadir to D:\tunps.com\bin\mysql\mysql-5.7.16-win32\data\

phpMyAdmin 3.2.0.1升级到4.6.5.1

更炫的ajax操作,效率大为提升,下载后解压缩到D:\tunps.com\apps\phpMyAdmin-4.6.5.1-all-languages,修改D:\tunps.com\alias\phpmyadmin.conf里面Alias路径。

注意:以上所有的软件都是x86的。

ECShop判断是否是手机移动端函数

function checkmobile() {
    $mobile = array();
    static $touchbrowser_list =array('iphone', 'android', 'phone', 'mobile', 'wap', 'netfront', 'java', 'opera mobi', 'opera mini',
                'ucweb', 'windows ce', 'symbian', 'series', 'webos', 'sony', 'blackberry', 'dopod', 'nokia', 'samsung',
                'palmsource', 'xda', 'pieplus', 'meizu', 'midp', 'cldc', 'motorola', 'foma', 'docomo', 'up.browser',
                'up.link', 'blazer', 'helio', 'hosin', 'huawei', 'novarra', 'coolpad', 'techfaith', 'palmsource',
                'alcatel', 'amoi', 'ktouch', 'nexian', 'ericsson', 'philips', 'sagem', 'wellcom', 'bunjalloo', 'maui', 'smartphone',
                'iemobile', 'spice', 'bird', 'zte-', 'longcos', 'pantech', 'gionee', 'portalmmm', 'jig browser', 'hiptop',
                'benq', 'haier', '^lct', '320x320', '240x320', '176x220', 'windows phone');
    
    static $pad_list = array('ipad');

    $useragent = strtolower($_SERVER['HTTP_USER_AGENT']);

    if(dstrpos($useragent, $pad_list)) {
        return false;
    }
    if(($v = dstrpos($useragent, $touchbrowser_list, true))){
        return  true;
    }
    $brower = array('mozilla', 'chrome', 'safari', 'opera', 'm3gate', 'winwap', 'openwave', 'myop');
    if(dstrpos($useragent, $brower)) return false;

}

返回true表示移动端,false表示PC平台。

ECgroupon加入城市天气预报功能

先看图

ECgroupon加入城市天气预报功能

最后能够实现天气随着城市的切换而切换。

首先group_city表加入字段

ALTER TABLE `ecs_group_city` ADD `weather` VARCHAR( 30 ) NOT NULL AFTER `city_sort` ;
ADD `temp` VARCHAR( 30 ) NOT NULL AFTER `weather` ,
ADD `image` VARCHAR( 30 ) NOT NULL AFTER `temp` ,
ADD `weather_time` INT( 10 ) NOT NULL AFTER `image`

weather是天气,temp是温度,image是天气图片,weather_time是天气的日期。新建目录/template/模板名字/images/weather。/includes/lib_group.php中添加以下函数。

/*
* 天气预报/tun/2010/11/11 棍节快乐 - -#
*/
function get_weather($city_id,$city_name)
{
$time=gmtime();
//先查询该城市天气是否过期
$sql="select * from ".$GLOBALS['ecs']->table('group_city')." where city_id='$city_id' and $time-weather_time< =86400";
$row=$GLOBALS['db']->getRow($sql);
if(!$row)//没有数据就到sina上去抓取
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://php.weather.sina.com.cn/search.php?c=1&city='.$city_name.'&dpc=1');
curl_setopt($curl, CURLOPT_REFERER, 'http://php.weather.sina.com.cn');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,0);
$data = curl_exec($curl);
$data=mb_convert_encoding($data,'utf-8','gb2312');
//print_r($data);
preg_match('/javascript:sent_to_vb\(\'(.*)\',\'(.*):(.*),(.*),(.*),(.*)\'\)/',$data,$weather_arr);
preg_match('/class=\"icon_weather\" style=\"background: url\((.*)\) 0 0/',$data,$weather_img);
$w=array();
$w['weather']=$weather_arr[3];
$w['temp']=str_replace('~',' / ',$weather_arr[4]);
$w['image']=substr($weather_img[1],strrpos($weather_img[1],'/')+1,str_len($weather_img[1])-strrpos($weather_img[1],'/'));
$w['weather_time']=gmstr2time(date('Y-m-d'));
$_CFG = load_config();
$template_dir=ROOT_PATH . 'template/' . $_CFG['formwork'];
if(!file_exists($filename=$template_dir.'/'.images.'/'.weather.'/'.$w['image']))
{ //本地不存在图片就去下载
$weather_img[1]=str_replace('180_180', '78_78',$weather_img[1]);
curl_setopt($curl,CURLOPT_URL,$weather_img[1]);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$img=curl_exec($curl);
$fp=fopen($filename,'w+');
fwrite($fp,$img);
fclose($fp);
}
curl_close($curl);
//更新天气信息
$GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('group_city'), $w, 'UPDADTE','city_id='.$city_id);
$w['city_name']=$weather_arr[1];
return $w;
}
else
{
return $row;
}

}

然后在/includes/lib_group.php里面的assign_public()里面加入一句:

$GLOBALS['smarty']->assign('weather', get_weather($city_info['city_id'],$city_info['city_name']));

模板标签的调用:在/template/模板名字/library/group_header.lbi你喜欢的位置插入以下内容

<div class="weather">
<div style=" background: url(images/weather/{$weather.image}) 0 0 no-repeat;_background:none;_FILTER: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='images/weather/{$weather.image}', sizingMethod='crop')">div>
<span class="temp">{$weather.temp}span> <span class="desc">{$weather.weather}span>
div>

Over。

总结

因为原理是从新浪天气频道上面抓取天气信息和下载天气图片,系统判定天气的时间,如果已经过期一天,就重新到新浪天气上去下载。同时系统判断本地网站是否有需要显示的天气图片,如果没有,就下载到images/weather目录,提高速度。如果没有过期直接使用数据内的信息来加快网页载入速度。

ECShop 订单价格去掉小数点取整

方法1

进入mySQL数据库 修改表ecs_cart中goods_price字段结构
原来长度值是 : 10,2 ,修改为10,0
不过这个方法实践中有个缺点,和商品展示页面里面的个会员等级的价格不一致,因为数据库中的decimal(10,0)直接将小数点后面全部去掉,而非四舍五入。也就是当在后台设置“显示设置”中“商品价格显示规则”设定为“不四舍五入,不保留小数”时两个价格才一致。

方法2

后台设置“显示设置”中“商品价格显示规则”设定为“不四舍五入,不保留小数”

修改/includes/lib_order.php里面的cart_amount(),
将return floatval($GLOBALS['db']->getOne($sql)); 修改为 return intval($GLOBALS['db']->getOne($sql));

修改/includes/lib_common.php里面的price_format()
将$price = number_format($price, 2, '.', ''); 修改为 $price = number_format($price, 0, '.', '');