导读:今天恰卡编程网来给各位分享关于php如何显示天气的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、Docker PHP 入门实践(三)
- 2、百度首页的天气预报显示用php怎么实现
- 3、php获取天气预报的代码
- 4、php怎么抓取天气预报?
- 5、php的socket调用可以实现查天气吗
- 6、如何使用PHP调用API接口实现天气查询功能
Docker PHP 入门实践(三)
在本教程的其余部分,我们将基于 ThinkPHP 框架完成一个天气查询的应用。使用 天气查询-API文档-开发指南-Web服务 API | 高德地图API 的接口来实现我们的功能。把查询数据缓存到 MySql 中,这样就不用每次频繁的请求第三方的接口了(有请求次数限制)
选择高德开放平台-天气查询 API 主要是因为它是免费的。当然你也可以使用其他的第三方天气查询接口,看个人喜好。
该应用是一个非常简单的 REST API 应用,主要实现两个接口。
在我们进行应用编码之前,首先使用 Docker 安装并运行 ThinkPHP
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简代码的同时,更注重易用性。遵循 Apache2 开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售 。
这就是为什么我选择它作为本教程的教学框架。我不想让你因为一个框架而放弃,但我也不想从头开始建立所有的东西,因为该教程的重点是Docker,而不是我们的PHP应用。
用Docker 创建 ThinkPHP 应用 实际上比用本地配置PHP环境所需的操作少。并且为我们还需要使用 Composer,多亏了Docker,我们甚至不需要在主机上安装它。
首先打开你的终端,创建一个项目目录。
并进入到该目录中
现在使用[官方Composer Docker镜像]()安装 ThinkPHP 。
如果你查看weather-app/目录,你会看到 ThinkPHP 6 的项目目录,如下所示:
我们的 docker 运行命令与第二章中的命令相似,但我们使用了不同的镜像。我们没有使用运行hello.php 脚本的 PHP 镜像,而是使用了一个 Composer 镜像。让我们来看看有什么变化。
项目创建完成后,我们需要添加几个路由 URL 和 Controller 文件 。让我们打开 weather-app 目录下的 app/controller , 然后新建 Weather.php 文件,内容如下:
然后打开 weather-app 目录下的 app/route , 在 app.php 文件中追加如下内容:
现在我们可以在 Docker 容器中运行我们的应用程序,只是为了验证我们的程序是否运行正常,因为我们只添加了两个路由 URL。打开命令行,运行。
现在,在浏览器中打开 ,你应该看到一个空页面,上面有以下文字:
那么恭喜你,你刚刚已经成功地在 Docker 中运行了你的第一个 ThinkPHP 应用程序。
这次我们使用的docker run命令与我们用来运行 hello.php 脚本 和composer create-project ...的两个命令不同。原因是这次我们想获得包含 Apache 的最新版本的PHP,这样我们就可以为我们的 Web 应用提供服务。让我们更详细地了解新增的命令部分。
你可以通过向终端发送一个 "中断 "信号来停止和退出终端。在 windows 上,这可以通过按 Ctrl 和按c来实现。
运行你的新网络应用程序的另一个选择是在 "Detached"模式中运行容器。这意味着你在终端将不会看到来自你的容器的输出。这可以通过在我们之前的命令中添加-d标志来实现。
在分离模式下启动容器后,你的终端将显示新容器的完整ID--类似于a70d25c2a7cedae673f8ab...如果你想停止这个容器,你可以使用docker stop命令,用容器的ID告诉Docker。比如说
因为输入整个ID是很麻烦的,如果你愿意,Docker允许你只输入前三个或更多的字符。
最后,我建议为你的容器命名。我们在本书后面的许多例子中都会这样做,因为用名字来记住一个容器比用随机分配的ID要容易得多,再加上ID是随机的,所以每次你运行一个新版本的容器时,它都会得到一个新的ID。只要不是已经有一个同名的容器,名字就可以多次发出来。为了给我们的新应用容器命名,我们可以用传入的--name标志重新创建它。
在使用docker run命令时,还有许多可用的选项,所以你可能想更详细地阅读文档。在我们开发其余的应用程序时,我们会涉及其中的一些选项。
现在我们要引入高德的天气 SDK ,在使用该 SDK 之前你需要阅读高德开放平台-天气查询的技术文档,再添加 SDK 之前我们首先要确保所有现有的容器都停止了。
这个命令将列出所有正在运行的容器。你也可以通过添加-a标志来查看停止的容器。
如果有任何容器正在运行,那么在我们继续前进之前,使用docker stop 来停止它们。
该命令将在你的项目中装新的软件包。在这个过程中,你应该在终端看到一些类似这样的输出。
现在 SDK 已经安装完毕,可以使用了。
我们将使用刚刚添加的高德天气 SDK 来完善我们的业务逻辑,打开 controller 目录下的 Weather.php 添加以下内容:
我们做了一些更新--主要是对引入天气 API 初始化天气类
我们的应用程序已经初步完成了向API传递一个真实的位置ID并返回一些数据。首先,使用这个高德位置查询找到一个位置ID。我使用的是上海的ID进行测试。310000,当然你直接传 上海 也是可以的。ok,让我们再次运行Docker容器。
并在你的浏览器中访问正在运行的应用程序,地址是。你应该可以看到一个JSON数据,看起来像这样。
你的 Docker 化的 PHP 应用程序现在正从外部数据源返回真实数据,并在Apache中提供服务,但你可能会注意到,它的速度并不快(我的页面加载时间为1.92秒!)。
高德天气 API 是一个免费的服务,其他国家可能无法访问。为了解决这个问题,我们将把查询的数据保存在我们自己的 MySQL 数据库中,可以再下次访问的时候可以快速地响应。这将极大地提高性能,下个章节我们将学习如何用 Docker 将 MySql 与 PHP 应用程序相结合。
百度首页的天气预报显示用php怎么实现
方式一、你可以去气象局的网站使用php(python)爬虫抓取网页HTML内容提取其中的信息即可。
方式二、气象局的网站一般提供了免费的API接口,可以得到一个封装好的JSON数据包,拆开就能得到很多信息
php获取天气预报的代码
?php
$URLStyle = "";
$chinaURL = sprintf($URLStyle, "china");
$chinaStr = file_get_contents($chinaURL);
$chinaObj = simplexml_load_string($chinaStr);
$chinaObjLen = count($chinaObj-city);
echo "chinaObjLen = ".$chinaObjLen."\n";
for ($i=0;$i$chinaObjLen;$i++){
//遍历省一级节点,共37个
$level1 = $chinaObj-city[$i]["pyName"];
$shengjiURL = sprintf($URLStyle, $level1);
$shengjiStr = file_get_contents($shengjiURL);
//echo $shengjiStr;
$shengjiObj = simplexml_load_string($shengjiStr);
$shengjiObjLen = count($shengjiObj-city);
// echo $chinaObj-city[$i]["quName"];
// echo " ".$shengjiObjLen."\n";
for ($j=0;$j$shengjiObjLen;$j++){
//遍历市一级节点
$level2 = $shengjiObj-city[$j]["pyName"];
$shijiURL = sprintf($URLStyle, $level2);
$shijiStr = file_get_contents($shijiURL);
//echo $shijiStr;
$shijiObj = simplexml_load_string($shijiStr);
//直辖市和海南、台湾、钓鱼岛等没有县级节点
if(!$shijiObj){
echo "WARNNING: not exsit next level node. - ".$level1."-".$shijiURL."\n";
echo ' "'.$shengjiObj-city[$j]["cityname"].'" = ';
echo $shengjiObj-city[$j]["url"].",\n";
continue;
}
$shijiObjLen = count($shijiObj-city);
//echo $shengjiObj-city[$j]["cityname"]." ";
//echo $shijiObjLen."\n";
for ($k=0;$k$shijiObjLen;$k++){
//遍历县一级节点
$xianji_code = $shijiObj-city[$k]["url"];
echo ' "'.$shijiObj-city[$k]["cityname"].'" = ';
echo $shijiObj-city[$k]["url"].",\n";
//echo $xianji_code."\n";
}
}
}
//print_r($chinaObj);
?
通过XML接口根节点递归获得全国几千个县以上城市cide code的代码
php怎么抓取天气预报?
可以借由php的api或者preg_match_all偷偷撷取去达成目的
这里给你一段我给台湾朋友有一段源码
?php
header(\"Content-Type: text/html; charset=utf-8\");
function getWeather($city){
$toURL = \"
$city.htm\";
$post = array();
$ch = curl_init();
$options = array(
CURLOPT_REFERER='',
CURLOPT_URL=$toURL,
CURLOPT_VERBOSE=0,
CURLOPT_RETURNTRANSFER=true,
CURLOPT_USERAGENT=\"Mozilla/4.0 (compatible;)\",
CURLOPT_POST=true,
CURLOPT_POSTFIELDS=http_build_query($post),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
//连接中央气象局
echo 'pre';
preg_match_all('/table class=\"FcstBoxTable01\" [^]*[^]*(.*)\/div/si',$result, $matches, PREG_SET_ORDER);
preg_match_all('/td nowrap=\"nowrap\" [^]*[^]*(.*)\/td/si',$matches[0][1], $m1, PREG_SET_ORDER);
$m2 = explode('/td',$m1[0][1]);
// print_r($m2);//取得每日资料m2[0~6]
$weather = array();
for($i=0;$i=6;$i++){
preg_match_all('/src=[^]*[^](.*)/si',$m2[$i], $m5, PREG_SET_ORDER);//取得天气图档
$m6 = explode('\"',$m5[0][0]);
$wi='
($m6[1],'\.\./\.\./');
$wtitle = $m6[3];
print_r($wtitle);
$weather[$i]['date'] = date(\"m-d\", mktime(0, 0, 0, date(\"m\"), date(\"d\")+$i,date(\"Y\")));
$weather[$i]['temperature'] = trim(strip_tags($m2[$i]));
$weather[$i]['title'] = $wtitle;
$weather[$i]['img'] = $wi;
}
return($weather);
}
$weather=getWeather(\"Taipei_City\") ;
print_r($weather);
// header(\"Location:loc.php\");
?
首先
$toURL = \"\";
这里是读取资料的网址
上面的是台湾中央气象局
preg_match_all('/table class=\"FcstBoxTable01\" [^]*[^]*(.*)\/div/si',$result, $matches, PREG_SET_ORDER);
preg_match_all('/td nowrap=\"nowrap\" [^]*[^]*(.*)\/td/si',$matches[0][1], $m1, PREG_SET_ORDER);
这里是截取台湾中央气象局网页信息table class=\"FcstBoxTable01\" [^]*[^]*(.*)\/div的资料以及td nowrap=\"nowrap\" [^]*[^]*(.*)\/td的资料分别是1天跟1周
$m2 = explode('/td',$m1[0][1]);
// print_r($m2);//取得每日资料m2[0~6]
这里是取得每日的资料
preg_match_all('/src=[^]*[^](.*)/si',$m2[$i], $m5, PREG_SET_ORDER);//取得天气图档
这里是取得天气的图档
$m6 = explode('\"',$m5[0][0]);
$wi='
($m6[1],'\.\./\.\./');
$wtitle = $m6[3];
print_r($wtitle);
$weather[$i]['date'] = date(\"m-d\", mktime(0, 0, 0, date(\"m\"), date(\"d\")+$i,date(\"Y\")));
$weather[$i]['temperature'] = trim(strip_tags($m2[$i]));
$weather[$i]['title'] = $wtitle;
$weather[$i]['img'] = $wi;
这里是返回的网址,日期,标题,图档等等的资料
$weather=getWeather(\"Taipei_City\") ;
print_r($weather);
然后这里是显示出地区的一周天气预报
结论:就是如果你想从网站上面截取天气预报
在php可以是用preg_match_all(网页的表格table,表格的列数tr,表格的栏位td,或者更加广泛的标签div等等获取)
php的socket调用可以实现查天气吗
本文分享下,php调用yahoo与sina的天气api,实现实时显示天气预报的代码,有兴趣的朋友研究下吧。
yahoo 天气预报
地址
代码:
复制代码代码示例:
?php
header ( 'Content-Type: text/html; charset = utf-8' );
class weather {
static $url = ';w=';
static $city = 'Beijing'; //默认城市北京 这里要注意的是 city 要填拼音 我试过用中文有好几个地区都调用不到
static $weatherXML = '';
static $woeid_file = "woeid";
static $file_path = "data/";
/**
* 获得远程xml并缓存到本地
*/
static public function getXML($city = null) {
if ($city != null){
self::$city = $city;
}
self::$weatherXML = self::$file_path . md5(self::$city) . '-weather.xml';
if (file_exists( self::$weatherXML )) {
$fileTime = filemtime ( self::$weatherXML );
$stater = time () - $fileTime - 60 * 60 * 2;
if ($stater 0) {
return true;
}
}
//获取woeid
$woeid = self::getWOEID();
self::$url = self::$url . $woeid[0];
//获取当天 天气
$XML = self::vget(self::$url);
//保存当天 天气到文件
self::cacheXML($XML);
self::analysisXML($XML);
}
static public function analysisXML($simple) {
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
//本周天气
$weekindex = $index['YWEATHER:FORECAST'];
$week = array();
foreach($weekindex as $k=$v){
$week[$k] = $vals[$v]['attributes'];
}
unset($index);
unset($vals);
print_r($week);
/*
yweather:forecast day="Wed" date="18 Sep 2013" low="20" high="32" text="Sunny" code="32"/
* day 星期
* date 日期
* low 最低温度
* high 最高温度
* test 天气状态
* code 天气图标
*/
}
/*
* 取得地区WOEID码
*/
static private function getWOEID(){
static $woeid = array();
if(isset($woeid[self::$city])){
return $woeid[self::$city];
}
if (file_exists( self::$file_path . self::$woeid_file )) {
$woeidSTR = file_get_contents(self::$file_path . self::$woeid_file);
$woeid = json_decode($woeidSTR , true);
if(isset($woeid[self::$city])){
return $woeid[self::$city];
}
}
$geoPlaces = "'".self::$city."%20CH'";
$XML = simplexml_load_file( $geoPlaces );
if(isset($XML-results-place[0])){
$rs = $woeid[self::$city] = $XML-results-place[0]-woeid;
//保存到文件
$woeidSTR = json_encode($woeid);
file_put_contents(self::$file_path . self::$woeid_file, $woeidSTR);
return $rs;
}else{
//如果找不到城市 woeid 默认城市就改为 北京
self::$city = "Beijing";
return self::getWOEID();
}
}
/**
* 创建xml缓存
* @param $contents 要缓存的内容
*/
static private function cacheXML($contents) {
$contents = str_ireplace ( '?xml version="1.0"?', "?xml version=\"1.0\"? \n", $contents );
$contents = mb_convert_encoding ( $contents, 'utf-8', 'gbk' );
file_put_contents ( self::$weatherXML, $contents ) or die ( '没有写权限' );
}
/**
* 模拟获取内容函数
* @param type $url
* @return type
*/
static private function vget($url) {
$user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)";
$curl = curl_init (); // 启动一个CURL会话
curl_setopt ( $curl, CURLOPT_URL, $url ); // 要访问的地址
curl_setopt ( $curl, CURLOPT_SSL_VERIFYPEER, 0 ); // 对认证证书来源的检查
curl_setopt ( $curl, CURLOPT_SSL_VERIFYHOST, 1 ); // 从证书中检查SSL加密算法是否存在
curl_setopt ( $curl, CURLOPT_USERAGENT, $user_agent ); // 模拟用户使用的浏览器
@curl_setopt ( $curl, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
curl_setopt ( $curl, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
curl_setopt ( $curl, CURLOPT_HTTPGET, 1 ); // 发送一个常规的Post请求
curl_setopt ( $curl, CURLOPT_TIMEOUT, 120 ); // 设置超时限制防止死循环
curl_setopt ( $curl, CURLOPT_HEADER, 0 ); // 显示返回的Header区域内容
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec ( $curl ); // 执行操作
if (curl_errno ( $curl )) {
curl_close ( $curl ); // 关闭CURL会话
die('Errno' . curl_error ( $curl )) ;
}
curl_close ( $curl ); // 关闭CURL会话
return $tmpInfo; // 返回数据
}
}
weather::getXML("Changsha");
如何使用PHP调用API接口实现天气查询功能
最近在做微信公众平台测试时,想在里面子菜单上添加查询未来几天(包括今天)天气的功能,就查找了下好用的天气预报查询接口API,使用比较多的有:国家气象局天气接口、新浪天气预报接口、百度天气预报接口、google天气接口、Yahoo天气接口等等,我使用的是百度提供的免费天气查询接口API,下面与大家分享下...
1、查询方式:
百度提供的是根据纬度和城市名查询天气情况
2、接口事例:
3、接口参数说明:
4、返回结果说明:
5、
//城市名
$city = '上海';
//对json格式的字符串进行编码
$arr =json_decode($str,TRUE);
print_r($atr);
//城市名
$city = '上海';
//获取json格式的数据
$str =file_get_contents("".$city."output=jsonak=5slgyqGDENN7Sy7pw29IUvrZ");
//对json格式的字符串进行编码
$arr =json_decode($str,TRUE);
print_r($atr);
6、返回页面的是json编码后的数据:
[plain] view plain copy print?
meta charset="UTF-8"
Array
(
[error] = 0
[status] = success
[date] = 2014-03-17
[results] = Array
(
[0] = Array
(
[currentCity]= 上海
[weather_data]= Array
(
[0]= Array
(
[date] = 周一(今天, 实时:19℃)
[dayPictureUrl] =
[nightPictureUrl] =
[weather] = 晴
[wind] = 西南风3-4级
[temperature] = 13℃
)
[1] = Array
(
[date]= 周二
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 多云转阴
[wind]= 东北风3-4级
[temperature] = 24 ~ 9℃
)
[2] = Array
(
[date]= 周三
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 中雨转小雨
[wind]= 东北风3-4级
[temperature] = 15 ~ 8℃
)
[3] = Array
(
[date]= 周四
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 多云转晴
[wind]= 北风3-4级
[temperature] = 14 ~ 6℃
)
)
)
)
)
meta charset="UTF-8"
Array
(
[error] = 0
[status] = success
[date] = 2014-03-17
[results] = Array
(
[0] = Array
(
[currentCity]= 上海
[weather_data]= Array
(
[0]= Array
(
[date] = 周一(今天, 实时:19℃)
[dayPictureUrl] =
[nightPictureUrl] =
[weather] = 晴
[wind] = 西南风3-4级
[temperature] = 13℃
)
[1] = Array
(
[date]= 周二
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 多云转阴
[wind]= 东北风3-4级
[temperature] = 24 ~ 9℃
)
[2] = Array
(
[date]= 周三
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 中雨转小雨
[wind]= 东北风3-4级
[temperature] = 15 ~ 8℃
)
[3] = Array
(
[date]= 周四
[dayPictureUrl] =
[nightPictureUrl] =
[weather]= 多云转晴
[wind]= 北风3-4级
[temperature] = 14 ~ 6℃
)
)
)
)
)
7、PHP中自带了处理json格式字符串的内置函数,下面做一个事例,并给出完整代码:
[php] view plain copy print?
metacharset="UTF-8"
?php
//城市名
$city = '上海';
//获取json格式的数据
$str = file_get_contents("".$city."output=jsonak=5slgyqGDENN7Sy7pw29IUvrZ");
//对json格式的字符串进行编码
$arr = json_decode($str,TRUE);
echo "城市:".$arr['results'][0]['currentCity']." 日期:".$arr['date']."br /br /";
foreach($arr['results'][0]['weather_data']as $val)
{
echo $val['date']."br/";
echo "天气:{$val['weather']}br/";
echo "风向:{$val['wind']}br/";
echo "温度:{$val['temperature']}br/br /";
}
?
metacharset="UTF-8"
?php
//城市名
$city = '上海';
//获取json格式的数据
$str = file_get_contents("".$city."output=jsonak=5slgyqGDENN7Sy7pw29IUvrZ");
//对json格式的字符串进行编码
$arr = json_decode($str,TRUE);
echo "城市:".$arr['results'][0]['currentCity']." 日期:".$arr['date']."br /br /";
foreach($arr['results'][0]['weather_data']as $val)
{
echo $val['date']."br/";
echo "天气:{$val['weather']}br/";
echo "风向:{$val['wind']}br/";
echo "温度:{$val['temperature']}br/br /";
}
?
8、返回的内容如下:
结语:以上就是恰卡编程网为大家整理的关于php如何显示天气的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~