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目录,提高速度。如果没有过期直接使用数据内的信息来加快网页载入速度。

关于PHP空数组

<?php
$arr1=array();
$arr2=array(
    array(),
    array()
    );
var_dump(empty($arr1));
var_dump(empty($arr2));
?>

输出:
bool(true)
bool(false)
看来二维的空数组并不算empty。

看看empty的解释:

bool empty ( mixed $var )
如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,””、0、”0″、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

早上来上班没多久,某客服的网站出了问题,返回500 Internal Server Error。地址:http://xxx.com/plus/xx.asp

Server.MapPath虚拟路径(virtual path)和相对路径(relative path)

很明显一看就知道是数据连接字符串出了问题,跳转到conn.asp ,
上面的定义:

If DataBaseType=0 then
    '如果是ACCESS数据库,请认真修改好下面的数据库的文件名
    DBPath       = "xx_Data/xxxx.mdb"      'ACCESS数据库的文件名,请使用相对于网站根目录的的绝对路径
    SqlNowString = "Now()"
Else
     '如果是SQL数据库,请认真修改好以下数据库选项
     DataServer   = "(local)"                                  '数据库服务器IP
     DataUser     = "sa"                                       '访问数据库用户名
     DataBaseName = "xx"                                '数据库名称
     DataBasePsw  = "xx"                                   '访问数据库密码
     SqlNowString = "getdate()"
End if

下面的打开数据库的子过程:

Sub OpenConn()
    'On Error Resume Next
    If DataBaseType = 1 Then
       ConnStr="Provider = Sqloledb; User ID = " & datauser & "; Password = " & databasepsw & "; Initial Catalog = " & databasename & "; Data Source = " & dataserver & ";"
    Else
       ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(DBPath)
    End If
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.open ConnStr
    If Err Then Err.Clear:Set conn = Nothing:Response.Write "数据库连接出错,请检查Conn.asp文件中的数据库参数设置。":Response.End
    CollcetConnStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(CollectDBPath)
End Sub

可以发现DBPath这个变量里面的路径前面是没有“/”或者“\”符号,说明是相对路径,关于Server.MapPath的路径,我们来看官方解释:

Syntax
Server.MapPath( Path )

Parameters
**Path **

Specifies the relative **or **virtual **path to map to a physical directory. If Path starts with either a **forward (/) or backward slash (), the MapPath method returns a path as if Path is a full virtual path. If Path doesn’t start with a slash, the MapPath method returns a path relative to the directory of the .asp file being processed.

上面的DBPath很明显被当作了relative path,路径都是相对于当前运行的asp文件路径,这样的定义在开发设计中是不可取的,最好统一为virtual path,虚拟路径就好象是由一个网站根目录开始的绝对路径。

当然这个整个问题的发生是客户小心去掉了forward (/) or backward slash ()。加上后网站正常打开。

Zend Studio保存后卡死、启动后卡死

保存卡死的问题

真正导致问题的是 “自动编译”(Build Automatically) ,这个功能会在任何一个文件发生变化以后,去自动 Build ,如果你的 CPU 跑得不够快, 每当你保存一个文件(Ctrl + s) ,Zend Studio 就又可以被被这个 Build 工作卡死。

取消 “自动编译”( <Top Menu> / Project / Build Automatically ) , 改用 “手动编译”
:当你需要编译的时候 Ctrl+B 。 只有在 Build 以后, ZS 才理解你写的代码的意义, 从而帮助你 代码补全(Code Assist) 和 代码定位(按Ctrl 点击函数、类、变量、常量,打开定义他们的地方)

启动后卡死的问题

删除C:\Documents and Settings\Administrator\Zend\workspaces\DefaultWorkspace7\.metadata目录下的.lock文件。

360 PK QQ

登录web.qq.com,web2.qq.com自动跳转到http://im.qq.com/qq.shtml,并提示“在360公司停止对QQ进行外挂侵犯和恶意诋毁之前,我们决定将在装有360软件的电脑上停止运行QQ软件。”.

apt-get卸载Apache MySQL PHP

1、卸载Apache2都几个命令

sudo apt-get --purge remove apache2
sudo apt-get --purge remove apache2.2-common

其中remove –purge is equivalent to the purge command. (见man apt-get)

或直接使用一条命令

sudo apt-get autoremove apache2

2、卸载Mysql

sudo apt-get purge mysql-server mysql-server-5.0

3、卸载Php5

sudo apt-get autoremove php5

4、批量删除组件及相关

sudo apt-get remove --purge apache2 apache2-mpm-prefork apache2-utils apache2.2-common libapache2-mod-php5
sudo apt-get remove --purge libapr1 libaprutil1 libdbd-mysql-perl libdbi-perl libmysqlclient15off
sudo apt-get remove --purge libnet-daemon-perl libplrpc-perl libpq5 mysql-client-5.0 mysql-common
sudo apt-get remove --purge mysql-server mysql-server-5.0 php5-common php5-mysql

命令就是这些,具体含义可上网查询。

apt-get限速

先安装wondershaper:

# apt-get install wondershaper

限制上、下行带宽(单位Kb):

# wondershaper eth0 8192 8192

取消限制:

# wondershaper clear eth0

注意这里控制流量的单位是Kb(Kilobit),而不是KB(Kilobyte)。如上面这个例子中的8192就表示限制速度为1024KB也就是1MB。

如果有兴趣,可以vi /usr/sbin/wondershaper 看看这个shell用的程序是tc。