首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 串接 Yahoo 與新浪天氣 API 實作:打造自有天氣預報服務

     編輯:PHP 相關知識

背景

Google Weather API 已永久關閉,許多網站需尋找替代方案。本文提供兩套完整的 PHP 實作,分別串接 Yahoo Weather API 與 新浪天氣 API,並包含快取機制、WOEID 城市代碼解析、錯誤處理等生產級功能。

方案一:Yahoo Weather API(已停止服務,僅供參考架構)

注意:Yahoo Weather API 於 2019 年正式關閉,以下代碼僅作為「API 串接、XML 解析、快取設計」的架構參考。

核心類結構

class Weather {
    static $url = 'https://xml.weather.yahoo.com/forecastrss?u=c&w=';
    static $city = 'Beijing';        // 預設城市(需用拼音)
    static $weatherXML = '';
    static $woeid_file = 'woeid';    // WOEID 本地快取文件
    static $file_path = 'data/';     // 快取目錄

    // 獲取並快取 XML
    static public function getXML($city = null) { ... }

    // 解析 XML 獲取本週天氣
    static public function analysisXML($simple) { ... }

    // 獲取城市 WOEID(含 YQL 查詢與本地快取)
    static private function getWOEID() { ... }

    // XML 快取寫入
    static private function cacheXML($contents) { ... }

    // cURL 模擬請求
    static private function vget($url) { ... }
}

// 使用範例
Weather::getXML('Changsha');

關鍵技術點

  • WOEID 機制:Yahoo 使用 Where On Earth ID 識別地點,需透過 YQL 查詢 geo.places 表獲取。
  • 雙層快取:WOEID 快取到 JSON 文件;天氣 XML 快取 2 小時(60*60*2 秒)。
  • 編碼轉換:回應為 GBK,入庫前轉 UTF-8(mb_convert_encoding)。
  • cURL 完整配置:User-Agent、SSL 驗證、超時、自動跳轉等。

方案二:新浪天氣 API(較簡單,適合國內項目)

新浪接口無需 WOEID,直接用城市中文名(URL 編碼後)即可查詢。

核心代碼

class Weather {
    static $url = 'https://php.weather.sina.com.cn/xml.php?password=DJOYnieT8234jlsK&day=0&city=';
    static $city = '%B1%B1%BE%A9';  // 北京的 GBK URL 編碼
    static $weatherXML = '';
    static $file_path = 'data/';

    static public function getXML($city = null) {
        if ($city !== null) {
            $city = mb_convert_encoding($city, 'gbk', 'utf-8');
            self::$city = urlencode($city);
        }
        // 快取邏輯同 Yahoo 版(2 小時)
        // ...
        $contents = self::vget(self::$url . self::$city);
        self::cacheXML($contents);
        self::analysisXML();
    }

    static public function analysisXML() {
        $XML = simplexml_load_file(self::$weatherXML);
        print_r($XML);  // 實際專案請解析所需字段
    }
    // vget、cacheXML 同 Yahoo 版
}

Weather::getXML('長沙');  // 直接傳中文城市名

生產環境建議

  1. 改用現代 API:推薦 OpenWeatherMap、和風天氣、AccuWeather 等維護中的服務。
  2. 快取升級:使用 Redis/Memcached 替代文件快取,支援分佈式部署。
  3. 異步處理:將 API 請求放入隊列(如 Laravel Queue),避免阻塞用戶請求。
  4. 錯誤監控:接入 Sentry 等工具,及時發現 API 失效或格式變更。

結語

雖然 Yahoo 與新浪的舊版 API 已不再推薦用於新專案,但本文展示的「請求→快取→解析→降級」完整鏈路,是所有第三方 API 串接的通用最佳實踐。掌握這套模式,更換任何天氣服務商都能游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved