您的位置:

首页 >

网页技巧 >

PHP Ajax JavaScript Json获取天气信息实现代码 >

PHP Ajax JavaScript Json获取天气信息实现代码

2016-03-04 14:35:19

分类:网页技巧

要在自己的网站上添加一个天气预报功能,是一个很普通的需求,实现起来也不是很难。今天来介绍几个简单的方法。使用第三方服务有这样的一种简单的方式,借助http://www.tianqi.com/plugin/网上的天气服务,可以定制我们的显示形状,实现添加天气预报的功能。下面给出一个简单的小例子:复制代码 代码如下:<iframe width="420" scrolling="no" height="60" frameborder="0" allowtransparency="true" src="http://i.tianqi.com/index.php?c=code&id=12&icon=1&num=5"></iframe>间接方式说是间接的获取天气信息,那是因为对于我们个人而言,是不可能自己发射卫星,或者维护天气预报那么大的计算量的服务的。我们是借助其他网站提供的数据接口来实现的。思路由于Ajax本身的特点决定了岂不能够跨域请求,所以我们需要借助PHP来试下代理的功能。具体思路如下:客户端打开我们的网页根据PHP获得客户端IP使用第三方服务获取该IP对应的城市编码调用天气接口,根据城市编码来获取天气信息客户端获得服务器返回的数据,并显示到页面上。使用到的服务下面列出我们用到的一句常用的接口 •ip转城市:”http://ip.taobao.com/service/getIpInfo.php?ip=XXX” •查看对应的城市的代码:http://blog.csdn.net/anbowing/article/details/21936293 •访问天气接口,获取数据:”http://www.weather.com.cn/adat/sk/“.$city_id.”html”下面的是几个很好的接口网站。 •天气API接口大全 实现代码代码的实现,分为三步。照应我们之前的逻辑来写即可。 •获取客户端ip对应的城市 <?phpheader("Content-Type:text/json;charset=utf-8");// ajax 自身特性决定其不能跨域请求,所以使用php的代理模式来实现垮与请求//$url = 'http://www.weather.com.cn/adat/sk/101010100.html';// 1.获取文本内容信息;2获取url对应的数据//$data = file_get_contents($url);//echo $data;/////////////////////////////////////思路一// ip-->>城市----->>>城市代码----->>>> 天气信息// 获取ip对应的城市信息,以及编码 http://ip.taobao.com/service.getIpInfo.php?ip=60.205.8.179// 通过编码获得天气信息 http://www.weather.com.cn/adat/sk/编码.html$client_ip = "60.205.8.179";//$_SERVER['REMOTE_ADDR'];$url = "http://ip.taobao.com/service/getIpInfo.php?ip="."$client_ip";$result = file_get_contents($url);echo $result;/////////////////////////////////////思路二?>在客户端我们就可以看到<script> function getcitycode(){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState==4){ //alert(xhr.responseText); eval('var citycode='+xhr.responseText); alert(citycode.data.city); } } xhr.open('get','./getcityid.php'); xhr.send(null); }</script> •再向服务器请求一下城市代码,传给天气接口即可。 <?php$city_id = $_GET['city'];//print_r($GET);调用数据库代码逻辑,查找到对应的城市的城市编码只需要从我们实现存储好的城市表中警醒查找即可。而且城市编码的表基本上不发生变化,我们可以稳定的使用。$weather_url = "http://www.weather.com.cn/adat/sk/".$city_id."html";$weather = file_get_contents($weather_url);echo $weather;?>前端完整代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>获取天气信息</title><script>function getinfo(){ var ajax = new XMLHttpRequest(); ajax.onreadystatechange = function(){ if(ajax.readyState==4){ alert(ajax.responseText); eval("var data=" + ajax.responseText); alert(data); document.getElementById("city").innerHTML =data.weatherinfo.city; document.getElementById("cityid").innerHTML =data.weatherinfo.cityid; document.getElementById("temp").innerHTML =data.weatherinfo.temp; document.getElementById("WD").innerHTML =data.weatherinfo.WD; document.getElementById("WS").innerHTML =data.weatherinfo.WS; document.getElementById("SD").innerHTML =data.weatherinfo.SD; document.getElementById("time").innerHTML =data.weatherinfo.time; } } ajax.open('get','./getinfo.php'); ajax.send(null);}</script></head><body><h3>获取城市代码</h3><button type="button" onclick="getcitycode()">获取城市代码</button><br /><script> function getcitycode(){ var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState==4){ //alert(xhr.responseText); eval('var citycode='+xhr.responseText); alert(citycode.data.city); } } xhr.open('get','./getcityid.php'); xhr.send(null); }</script><span id="cityid"></span><h3>点击按钮获取天气信息</h3><button name="getinfo" onclick="getinfo()">获取</button><div><span>城市名称</span><span id="city"></span><br /><span>城市代码</span><span id="cityid"></span><br /><span>当前温度</span><span id="temp"></span><br /><span>风向</span><span id="WD"></span><br /><span>风速</span><span id="WS"></span><br /><span>湿度</span><span id="SD"></span><br /><span>更新时间</span><span id="time"></span><br /></div></body></html>总结在自己的网站上添加一个天气预报功能,其实并不难。也许还有更为简单的方式,这里就算是一个抛砖引玉的过程吧。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

最近写的几个PHP实用功能整理了一下,弄成一个文档,写上说明,方便以后使用!一共有4个PHP实用功能,现在跟大家分享,喜欢的朋友可以把它收藏起来,说不定以后用得上。1. PHP函数的任意数目的参数您可能知道PHP允许你定义一个默认参数的函数。但您可能并不知道PHP还允许你定义一个完全任意的参数的函数下面是一个示例向你展示了默认参数的函数:// 两个默认参数的函数function foo($arg1 = '', $arg2 = '') {echo "arg1: $arg1\n";echo "arg2: $arg2\n";}foo('hello','world');/* 输出:arg1: helloarg2: world*/foo();/* 输出:arg1:arg2:*/现在我们来看一看一个不定参数的函数,其使用到了func_get_args()方法:// 是的,形参列表为空function foo() {// 取得所有的传入参数的数组$args = func_get_args();foreach ($args as $k => $v) {echo "arg".($k+1).": $v\n";}}foo();/* 什么也不会输出 */foo('hello');/* 输出arg1: hello*/foo('hello', 'world', 'again');/* 输出arg1: helloarg2: worldarg3: again*/2. Glob() 查找文件 有很多PHP的函数都有一个比较长的自解释的函数名,但是,当您看到glob() 的时候,您可能并不知道这个函数是用来干什么的,除非您对它已经很熟悉了。 你可以认为这个函数就好?scandir() 一样,其可以用来查找文件。// 取得所有的后缀为PHP的文件$files = glob('*.php');print_r($files);/* 输出:Array([0] => phptest.php[1] => pi.php[2] => post_output.php[3] => test.php)*/您还可以查找多种后缀名// 取PHP文件和TXT文件$files = glob('*.{php,txt}', GLOB_BRACE);print_r($files);/* 输出:Array([0] => phptest.php[1] => pi.php[2] => post_output.php[3] => test.php[4] => log.txt[5] => test.txt)*/ 您还可以加上路径: $files = glob('../images/a*.jpg');print_r($files);/* 输出:Array([0] => ../images/apple.jpg[1] => ../images/art.jpg)*/如果你想得到绝对路径,你可以调用?realpath() 函数:$files = glob('../images/a*.jpg');// applies the function to each array element$files = array_map('realpath',$files);print_r($files);/* output looks like:Array([0] => C:\wamp\www\images\apple.jpg[1] => C:\wamp\www\images\art.jpg)*/3. 查看内存使用情况观察你程序的内存使用能够让你更好的优化你的代码。PHP 是有垃圾回收机制的,而且有一套很复杂的内存管理机制。你可以知道你的脚本所使用的内存情况。要知道当前内存使用情况,你可以使用?memory_get_usage() 函数,如果你想知道使用内存的峰值,你可以调用memory_get_peak_usage() 函数。echo "Initial: ".memory_get_usage()." bytes \n";/* 输出Initial: 361400 bytes*/// 使用内存for ($i = 0; $i < 100000; $i++) {$array []= md5($i);}// 删除一半的内存for ($i = 0; $i < 100000; $i++) {unset($array[$i]);}echo "Final: ".memory_get_usage()." bytes \n";/* printsFinal: 885912 bytes*/echo "Peak: ".memory_get_peak_usage()." bytes \n";/* 输出峰值Peak: 13687072 bytes*/4. 查看CPU使用情况 使用?getrusage() 函数可以让你知道CPU的使用情况。注意,这个功能在Windows下不可用。print_r(getrusage());/* 输出Array([ru_oublock] => 0[ru_inblock] => 0[ru_msgsnd] => 2[ru_msgrcv] => 3[ru_maxrss] => 12692[ru_ixrss] => 764[ru_idrss] => 3864[ru_minflt] => 94[ru_majflt] => 0[ru_nsignals] => 1[ru_nvcsw] => 67[ru_nivcsw] => 4[ru_nswap] => 0[ru_utime.tv_usec] => 0[ru_utime.tv_sec] => 0[ru_stime.tv_usec] => 6269[ru_stime.tv_sec] => 0)*/这个结构看上出很晦涩,除非你对CPU很了解。下面一些解释:ru_oublock: 块输出操作ru_inblock: 块输入操作ru_msgsnd: 发送的messageru_msgrcv: 收到的messageru_maxrss: 最大驻留集大小ru_ixrss: 全部共享内存大小ru_idrss:全部非共享内存大小ru_minflt: 页回收ru_majflt: 页失效ru_nsignals: 收到的信号ru_nvcsw: 主动上下文切换ru_nivcsw: 被动上下文切换ru_nswap: 交换区ru_utime.tv_usec: 用户态时间 (microseconds)ru_utime.tv_sec: 用户态时间(seconds)ru_stime.tv_usec: 系统内核时间 (microseconds)ru_stime.tv_sec: 系统内核时间?(seconds)以上就是分享给大家的PHP实用功能,希望对大家的学习有所帮助。

方法一:先获得当前文件所在文件夹的长度,然后用substr来截取掉该长度:复制代码 代码如下: $dirName = str_replace("\\", "/", dirname(__FILE__)); $dirNameLength = strlen($dirName); $currentDirNameLength = $dirNameLength - strrpos($dirName,"/"); //获得当前文件所在文件夹的长度! $parentDirName = substr($dirName,0,-$currentDirNameLength); //第3个参数如果为负数,那么表示从后面截取掉【该参数的绝对值】个字符。方法二:将当前文件所在文件夹当作一个文件(文件夹其实是特殊的文件,一切皆为文件!!),直接用dirname嵌套一次dirname即可: $parentDirName = dirname(dirname(__FILE__));从上可以看出:对事物的深刻认识,能大幅度提高代码质量!附上:PHP获取路径或目录实现PHP获取目录和的方法通过魔术变量;通过超级全局变量;通过相关函数等等:<?php/** * PHP获取路径或目录实现 */ //魔术变量,获取当前文件的绝对路径echo "__FILE__: ========> ".__FILE__; echo '<br/>'; //魔术变量,获取当前脚本的目录echo "__DIR__: ========> ".__DIR__;echo '<br/>'; //dirname返回路径的目录部分,dirname(__FILE__)相当于__DIR__echo "dirname(__FILE__): ========> ".dirname(__FILE__);echo '<br/>'; //$_SERVER['PHP_SELF']和$_SERVER['SCRIPT_NAME']的结果一般相同,他们都是获取当前脚本的文件名//只有当php以cgi方式运行时有区别,但是现在几乎找不到以cgi方式运行php了echo '$_SERVER["PHP_SELF"]: ========> '.$_SERVER['PHP_SELF'];echo '<br/>'; echo '$_SERVER["SCRIPT_NAME"]: ========> '.$_SERVER['SCRIPT_NAME'];echo '<br/>'; //当前执行脚本的绝对路径。记住,在CLI方式运行php是获取不到的echo '$_SERVER["SCRIPT_FILENAME"]: ========> '.$_SERVER['SCRIPT_FILENAME'];echo '<br/>'; //当前运行脚本所在的文档根目录。在服务器配置文件中定义。echo '$_SERVER["DOCUMENT_ROOT"]: ========> '.$_SERVER['DOCUMENT_ROOT'];echo '<br>'; //getcwd()返回当前工作目录echo "getcwd():

在朋友圈里有童鞋向我讨论GridView的问题,有朋友说你用gridview给我去掉表头的链接?我想的很久,用gridview确实不容易实现。有不同见解的朋友欢迎留言。但是呢,这根gridview有个毛线关联啊,明明是要设置ActiveDataProvider,你要我怎么用gridview实现嘛。这个问题也是很简单的,我们来看看具体实现$dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $dataProvider->setSort(false);分分钟搞定不是事。好了,我们来谈谈主题:如何利用yii2 gridview实现批量删除?我先说一下几个步骤啊,免得直接贴代码有的小伙伴删了一句去了一句最后失败了!1、gridview设置options时增加一个id 这里我们命名grid'options' => [// ...其他设置项'id' => 'grid'],2、columns增加选项复选框,批量删除必然不可少了复选框操作,这里我们的name值设定为id,方便对数据操作['class' => 'yii\grid\CheckboxColumn','name' => 'id',],3、页面上我们增加一个批量删除按钮,注意这里我们增加了一个class gridview,方便后面js实现点击效果<?= Html::a('批量删除', "javascript:void(0);", ['class' => 'btn btn-success gridview']) ?>4、最后一步,写js实现按钮操作,打开你的console看看,我们很轻松的就拿到了选中的行的id,然后这里就可以异步操作数据了。<?php$this->registerJs('$(".gridview").on("click", function () {//注意这里的$("#grid"),要跟我们第一步设定的options id一致var keys = $("#grid").yiiGridView("getSelectedRows");console.log(keys);});');?>下面贴上完整代码GridView::widget([// ......'options' => ['class' => 'grid-view','style'=>'overflow:auto', 'id' => 'grid'],// ......'columns' => [// ......['class' => 'yii\grid\CheckboxColumn','name' => 'id',],// ......],]);$this->registerJs('$(".gridview").on("click", function () {var keys = $("#grid").yiiGridView("getSelectedRows");console.log(keys);});');脚本之家推荐阅读:浅析Yii2中GridView常见操作yii2 页面底部加载css和js的技巧浅析Yii2 GridView 日期格式化并实现日期可搜索教程浅析Yii2 GridView实现下拉搜索教程以上内容是小编给大家介绍的Yii2 gridview实现批量删除教程,希望对大家有所帮助!

在最近的项目中有这样的场景 1.生成文件的时候,由于多用户都有权限进行生成,防止并发下,导致生成的结果出现错误,需要对生成的过程进行加锁,只容许一个用户在一个时间内进行操作,这个时候就需要用到锁了,将这个操作过程锁起来. 2.在用了cache的时候,cache失效可能导致瞬间的多数并发请求穿透到数据库此时也可以得需要用锁在同一并发的过程中将这个操作锁定. 针对以上的2种情况,现在的解决方法是对处理过程进行锁机制,通过PHP实现如下 用到了Eaccelerator的内存锁 和 文件锁,原理如下 判断系统中是否安了EAccelerator 如果有则使用内存锁,如果不存在,则进行文件锁 根据带入的key的不同可以实现多个锁直接的并行处理,类似Innodb的行级锁 使用如下: $lock = new CacheLock('key_name'); $lock->lock(); //logic here $lock->unlock(); //使用过程中需要注意下文件锁所在路径需要有写权限. 具体类如下: 复制代码 代码如下: <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定 * 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁 * 使用了eaccelerator则在内存中处理,性能相对较高 * 不同的锁之间并行执行,类似mysql innodb的行级锁 * 本类在sunli的phplock的基础上做了少许修改 http://code.google.com/p/phplock * @author yangxinqi * */ class CacheLock { //文件锁存放路径 private $path = null; //文件句柄 private $fp = null; //锁粒度,设置越大粒度越小 private $hashNum = 100; //cache key private $name; //是否存在eaccelerator标志 private $eAccelerator = false; /** * 构造函数 * 传入锁的存放路径,及cache key的名称,这样可以进行并发 * @param string $path 锁的存放目录,以"/"结尾 * @param string $name cache key */ public function __construct($name,$path='lock\\') { //判断是否存在eAccelerator,这里启用了eAccelerator之后可以进行内存锁提高效率 $this->eAccelerator = function_exists("eaccelerator_lock"); if(!$this->eAccelerator) { $this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt'; } $this->name = $name; } /** * crc32 * crc32封装 * @param int $string * @return int */ private function _mycrc32($string) { $crc = abs (crc32($string)); if ($crc & 0x80000000) { $crc ^= 0xffffffff; $crc += 1; } return $crc; } /** * 加锁 * Enter description here ... */ public function lock() { //如果无法开启ea内存锁,则开启文件锁 if(!$this->eAccelerator) { //配置目录权限可写 $this->fp = fopen($this->path, 'w+'); if($this->fp === false) { return false; } return flock($this->fp, LOCK_EX); }else{ return eaccelerator_lock($this->name); } } /** * 解锁 * Enter description here ... */ public function unlock() { if(!$this->eAccelerator) { if($this->fp !== false) { flock($this->fp, LOCK_UN); clearstatcache(); } //进行关闭 fclose($this->fp); }else{ return eaccelerator_unlock($this->name); } } } 本类在孙立同学的类的基础上做了小点改进的了.具体可以看 http:

焦点访谈

最新最热的文章

更多 >

COPYRIGHT (©) 2017 Copyright ©2017 5060网址大全 网站地图

联系我们

827570882

扫描二维码分享到微信