• <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
      <nav id="xcyjv"></nav>
    1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>

        PHP 多進程與信號中斷實現多任務常駐內存管理實例方法

         更新時間:2019年10月04日 10:24:15   作者:藏色散人   我要評論
        在本篇文章里小編給大家整理的是關于PHP 多進程與信號中斷實現多任務常駐內存管理的相關知識點,有需要的朋友們學習下。

        本文章基于 pcntl 擴展做的多進程測試。

        進程調度策略

        父子進程的調度由操作系統來負責,具體先調度子進程還是父進程由系統的調度算法決定,當然可以在父進程加上延時或是調用進程回收函數 pcntl_wait 可以先讓子進程先運行,進程回收的目的是釋放進程創建時占用的內存空間,防止變成僵尸進程。

        信號:

        信號稱為軟中斷系統或是叫軟中斷,功能是向進程發送異步事件通知。

        信號編號: 【源碼基于 SIGINT,SIGTERM,SIGUSR1 信號,含義請自行查看 kill 命令手冊,不在描述】

        linux 支持 64 個,有一半為實時信號,一半為非時實信號,這些信號都有自己的編號和對應的整數值。每個信號的編號含義讀者可以參閱 linux 相關手冊【man 手冊看看就知道了】

        信號處理函數:

        信號一般會綁定相應的功能,有的是默認動作如 SIGKILL,SIGTERM,SIGINT 操作默認操作就是干掉進程,當然我們可以重寫覆蓋掉,就是通過 pcntl_signal 來覆蓋掉。

        信號的概念:與硬件中斷一個道理,請讀者自行參考本人前面擼過的文章或是查看芯片硬件中斷原理。

        信號的發送:

        kill 信號編號 進程 或是按鍵產品的中斷信號或是在源碼里可以使用 posix_kill 等函數。

        進程是相互隔離的,擁有自己的堆?臻g,除了一些公用的正文【代碼區】,同時也有自己的可執行代碼,進程運行時,將占用 cpu 的資源,其它進程將無權運行,此時其它進程將為阻塞狀態【比如前面擼過的 tcp 服務】,當進程運行結束后【運行到代碼的最后一句或是遇到 return 或是遇到 exit 退出進程函數或是遇到信號事件時將會退出】讓出權限并釋放掉內存,其它進程就有機會運行了。

        進程擁有的自己進程描述符,其中比較常用的是進程號 PID,進程運行時會在系統 /proc/PID 下生成相應的進程文件,用戶可以自行查看。

        每個進程都擁有所屬的進程組【進程的集合】,多個進程組集合則是一個會話,創建一個會話是通過一個進程進行創建的,并且此進程不可以為組長進程,此進程將成為會話期的會話首進程,也會成為進程組的進程組長,同時將會脫離控制終端,即使之前的進程綁定了控制終端也會脫離【守護進程的創建】。

        文件描述權限掩碼【權限屏蔽字】:

        umask () 你可以在 linux 運行這個命令,然后創建文件,并查看它的權限【如果你跑完啥也沒有發現,說明你還是訓練不夠 ^_^】

        <?php
        
        /**
        
         * Created by PhpStorm.
        
         * User: 1655664358@qq.com
        
         * Date: 2018/3/26
        
         * Time: 14:19
        
         */
        
        namespace Chen\Worker;
        
        class Server
        
        {
        
         public $workerPids = [];
        
         public $workerJob = [];
        
         public $master_pid_file = "master_pid";
        
         public $state_file = "state_file.txt";
        
         function run()
        
         {
        
          $this->daemon();
        
          $this->worker();
        
          $this->setMasterPid();
        
          $this->installSignal();
        
          $this->showState();
        
          $this->wait();
        
         }
        
         function wait()
        
         {
        
          while (1){
        
           pcntl_signal_dispatch();
        
           $pid = pcntl_wait($status);
        
           if ($pid>0){
        
            unset($this->workerPids[$pid]);
        
           }else{
        
            if (count($this->workerPids)==0){
        
             exit();
        
            }
        
           }
        
           usleep(100000);
        
          }
        
         }
        
         function showState()
        
         {
        
          $state = "\nMaster 信息\n";
        
          $state.=str_pad("master pid",25);
        
          $state.=str_pad("worker num",25);
        
          $state.=str_pad("job pid list",10)."\n";
        
          $state.=str_pad($this->getMasterPid(),25);
        
          $state.=str_pad(count($this->workerPids),25);
        
          $state.=str_pad(implode(",",array_keys($this->workerPids)),10);
        
          echo $state.PHP_EOL;
        
         }
        
         function getMasterPid()
        
         {
        
          if (file_exists($this->master_pid_file)){
        
           return file_get_contents($this->master_pid_file);
        
          }else{
        
           exit("服務未運行\n");
        
          }
        
         }
        
         function setMasterPid()
        
         {
        
          $fp = fopen($this->master_pid_file,"w");
        
          @fwrite($fp,posix_getpid());
        
          @fclose($fp);
        
         }
        
         function daemon()
        
         {
        
          $pid = pcntl_fork();
        
          if ($pid<0){
        
           exit("fork進程失敗\n");
        
          }else if ($pid >0){
        
           exit(0);
        
          }else{
        
           umask(0);
        
           $sid = posix_setsid();
        
           if ($sid<0){
        
            exit("創建會話失敗\n");
        
           }
        
           $pid = pcntl_fork();
        
           if ($pid<0){
        
            exit("進程創建失敗\n");
        
           }else if ($pid >0){
        
            exit(0);
        
           }
        
           //可以關閉標準輸入輸出錯誤文件描述符【守護進程不需要】
        
          }
        
         }
        
         function worker()
        
         {
        
          if (count($this->workerJob)==0)exit("沒有工作任務\n");
        
          foreach($this->workerJob as $job){
        
           $pid = pcntl_fork();
        
           if ($pid<0){
        
            exit("工作進程創建失敗\n");
        
           }else if ($pid==0){
        
            /***************子進程工作范圍**********************/
        
            //給子進程安裝信號處理程序
        
            $this->workerInstallSignal();
        
            $start_time = time();
        
            while (1){
        
             pcntl_signal_dispatch();
        
             if ((time()-$start_time)>=$job->job_run_time){
        
              break;
        
             }
        
             $job->run(posix_getpid());
        
            }
        
            exit(0);//子進程運行完成后退出
        
            /***************子進程工作范圍**********************/
        
           }else{
        
            $this->workerPids[$pid] = $job;
        
           }
        
          }
        
         }
        
         function workerInstallSignal()
        
         {
        
          pcntl_signal(SIGUSR1,[__CLASS__,'workerHandleSignal'],false);
        
         }
        
         function workerHandleSignal($signal)
        
         {
        
          switch ($signal){
        
           case SIGUSR1:
        
            $state = "worker pid=".posix_getpid()."接受了父進程發來的自定義信號\n";
        
            file_put_contents($this->state_file,$state,FILE_APPEND);
        
            break;
        
          }
        
         }
        
         function installSignal()
        
         {
        
          pcntl_signal(SIGINT,[__CLASS__,'handleMasterSignal'],false);
        
          pcntl_signal(SIGTERM,[__CLASS__,'handleMasterSignal'],false);
        
          pcntl_signal(SIGUSR1,[__CLASS__,'handleMasterSignal'],false);
        
         }
        
         function handleMasterSignal($signal)
        
         {
        
          switch ($signal){
        
           case SIGINT:
        
            //主進程接受到中斷信號ctrl+c
        
            foreach ($this->workerPids as $pid=>$worker){
        
             posix_kill($pid,SIGINT);//向所有的子進程發出
        
            }
        
            exit("服務平滑停止\n");
        
            break;
        
           case SIGTERM://ctrl+z
        
            foreach ($this->workerPids as $pid=>$worker){
        
             posix_kill($pid,SIGKILL);//向所有的子進程發出
        
            }
        
            exit("服務停止\n");
        
            break;
        
           case SIGUSR1://用戶自定義信號
        
            if (file_exists($this->state_file)){
        
             unlink($this->state_file);
        
            }
        
            foreach ($this->workerPids as $pid=>$worker){
        
             posix_kill($pid,SIGUSR1);
        
            }
        
            $state = "master pid\n".$this->getMasterPid()."\n";
        
            while(!file_exists($this->state_file)){
        
             sleep(1);
        
            }
        
            $state.= file_get_contents($this->state_file);
        
            echo $state.PHP_EOL;
        
            break;
        
          }
        
         }
        
        } 
        
        <?php
        
        /**\
        
         * Created by PhpStorm.\ * User: 1655664358@qq.com
        
         * Date: 2018/3/26\ * Time: 14:37\ */\namespace Chen\Worker;
        
        class Job
        
        {
        
         public $job_run_time = 3600;
        
         function run($pid)
        
         {\sleep(3);
        
         echo "worker pid = $pid job 沒事干,就在這里job\n";
        
         }
        
        } 
        
        <?php
        
        /**
        
         * Created by PhpStorm.\ * User: 1655664358@qq.com
        
         * Date: 2018/3/26\ * Time: 14:37\ */\namespace Chen\Worker;
        
        class Talk
        
        {
        
         public $job_run_time = 3600;
        
         function run($pid)
        
         {\sleep(3);
        
         echo "worker pid = $pid job 沒事干,就在這里talk\n";
        
         }
        
        }
        
        <?php
        
        /**
        
         * Created by PhpStorm.\ * User: 1655664358@qq.com
        
         * Date: 2018/3/26\ * Time: 15:45\ */
        
        require_once 'vendor/autoload.php';
        
        $process = new \Chen\Worker\Server();
        
        $process->workerJob = [new \Chen\Worker\Talk(),new \Chen\Worker\Job()];
        
        $process->run();

        以上就是PHP 多進程與信號中斷實現多任務常駐內存管理【Master/Worker 模型】的詳細內容,感謝大家的學習和對腳本之家的支持。

        相關文章

        最新評論

        01彩票网app
      1. <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
          <nav id="xcyjv"></nav>
        1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>
            定州 | 定安 | 仁怀 | 绥化 | 儋州 | 贺州 | 滁州 | 宜春 | 酒泉 | 宝鸡 | 恩施 | 海宁 | 伊春 | 济宁 | 揭阳 | 永新 | 韶关 | 威海 | 池州 | 伊春 | 来宾 | 曹县 | 辽阳 | 菏泽 | 南平 | 慈溪 | 大理 | 泰安 | 东台 | 汕尾 | 桐城 | 百色 | 明港 | 泸州 | 湘潭 | 云浮 | 内蒙古呼和浩特 | 简阳 | 梧州 | 台湾台湾 | 阳春 | 永新 | 苍南 | 金华 | 潮州 | 定西 | 滁州 | 阿克苏 | 东莞 | 白城 | 阿拉尔 | 盐城 | 任丘 | 新沂 | 丽水 | 燕郊 | 和田 | 聊城 | 金昌 | 乐清 | 四川成都 | 慈溪 | 亳州 | 唐山 | 牡丹江 | 张家界 | 牡丹江 | 大连 | 晋中 | 长治 | 本溪 | 迁安市 | 深圳 | 石狮 | 朝阳 | 阳泉 | 张家界 | 甘南 | 偃师 | 德宏 | 芜湖 | 株洲 | 建湖 | 台州 | 牡丹江 | 贵州贵阳 | 韶关 | 德州 | 防城港 | 雅安 | 德清 | 湖州 | 仙桃 | 湖北武汉 | 徐州 | 日照 | 日土 | 遵义 | 泸州 | 顺德 | 漯河 | 克拉玛依 | 日喀则 | 绥化 | 海西 | 甘肃兰州 | 景德镇 | 宜春 | 顺德 | 福建福州 | 百色 | 张家口 | 张家界 | 桐城 | 灌云 | 榆林 | 甘肃兰州 | 如皋 | 鄂尔多斯 | 平凉 | 玉溪 | 黔南 | 惠东 | 三门峡 | 雅安 | 白山 | 清远 | 博罗 | 任丘 | 绍兴 | 迪庆 | 宜昌 | 南安 | 泰州 | 阳泉 | 龙口 | 常德 | 安徽合肥 | 武安 | 灌南 | 巴彦淖尔市 | 秦皇岛 | 德清 | 芜湖 | 东海 | 马鞍山 | 厦门 | 克孜勒苏 | 河池 | 高密 | 宝鸡 | 盘锦 | 四川成都 | 清徐 | 昭通 | 招远 | 香港香港 | 芜湖 | 巢湖 | 嘉善 | 包头 | 临猗 | 巴彦淖尔市 | 丽江 | 安庆 | 双鸭山 | 江西南昌 | 吉林长春 | 梅州 | 汕头 | 昌吉 | 湘潭 | 黑龙江哈尔滨 | 简阳 | 济宁 | 清徐 | 三亚 | 日喀则 | 日土 | 赵县 | 贵州贵阳 | 博尔塔拉 | 阿拉善盟 | 象山 | 镇江 | 玉林 | 葫芦岛 | 遂宁 | 桂林 | 柳州 | 玉溪 | 库尔勒 | 吕梁 | 广元 | 开封 | 七台河 | 库尔勒 | 基隆 | 黄南 | 吴忠 | 天门 | 文昌 | 辽源 | 灵宝 | 塔城 | 吐鲁番 | 乐山 | 安吉 | 中卫 | 如东 | 武安 | 东方 | 蚌埠 | 张北 | 抚州 | 泗洪 | 广元 | 余姚 | 锦州 | 日照 | 高雄 | 新泰 | 许昌 | 龙岩 | 铜仁 | 铁岭 | 泗阳 | 滁州 | 林芝 | 安顺 | 十堰 | 陵水 | 伊犁 | 肇庆 | 汕头 | 四平 | 鹰潭 | 库尔勒 | 黔南 | 铜陵 | 博尔塔拉 | 宁波 | 库尔勒 | 平潭 | 日喀则 | 攀枝花 | 包头 | 聊城 | 苍南 | 咸阳 | 海拉尔 | 东方 | 运城 | 阿拉尔 | 昭通 | 简阳 | 正定 | 安康 | 泰兴 | 咸阳 | 三门峡 | 株洲 | 哈密 | 大兴安岭 | 本溪 | 阿坝 | 琼中 | 台中 | 平潭 | 酒泉 | 抚州 | 茂名 | 陇南 | 枣阳 | 珠海 | 黑龙江哈尔滨 | 杞县 | 铜陵 | 石嘴山 | 阿拉善盟 | 唐山 | 枣阳 | 鄂尔多斯 | 湖南长沙 | 红河 | 永新 | 威海 | 怒江 | 朔州 | 黔东南 | 大同 | 宝应县 | 钦州 | 大庆 | 景德镇 | 海东 | 张家口 | 漯河 | 临猗 | 如皋 | 濮阳 | 湘西 | 常德 | 公主岭 | 厦门 | 醴陵 | 庆阳 | 玉树 | 辽源 | 定西 | 迪庆 | 榆林 | 宝鸡 | 揭阳 | 开封 | 乳山 | 盘锦 | 兴化 | 运城 | 黔东南 | 顺德 | 沧州 | 寿光 | 肥城 | 长治 | 东莞 | 昭通 | 许昌 | 五家渠 | 神木 | 十堰 | 溧阳 | 博尔塔拉 | 漯河 | 陕西西安 | 楚雄 | 白山 | 乌海 | 玉环 | 资阳 | 阿拉尔 | 肥城 | 广州 | 高雄 | 平潭 | 神木 | 大庆 | 梅州 | 辽宁沈阳 | 瑞安 | 漳州 | 连云港 | 兴化 | 天门 | 潜江 | 山东青岛 | 临沂 | 桐城 | 保定 | 温州 | 阿勒泰 | 永康 | 灌南 | 三门峡 | 莒县 | 赣州 | 东海 | 来宾 | 淮北 | 乐平 | 莱芜 | 金华 | 湛江 | 天长 | 海拉尔 | 许昌 | 张掖 | 阿里 | 丽水 | 馆陶 | 晋城 | 巴彦淖尔市 | 江门 | 丽水 | 昭通 | 偃师 | 德州 | 榆林 | 乐山 | 枣庄 | 铁岭 | 江西南昌 | 五家渠 | 上饶 | 韶关 | 通化 | 鄂州 | 玉环 | 阳江 | 广州 | 扬中 | 克孜勒苏 | 肇庆 | 徐州 | 沧州 | 普洱 | 湖州 | 本溪 | 三门峡 | 廊坊 | 桂林 | 长兴 | 阳春 | 屯昌 | 东莞 | 巴音郭楞 | 赤峰 | 台州 | 新乡 | 香港香港 | 金坛 | 宜昌 | 大丰 | 鹤壁 | 泰州 | 眉山 | 日土 | 长葛 | 运城 | 三河 | 梅州 | 宁波 | 海南 | 明港 | 娄底 | 浙江杭州 | 汉中 | 湘潭 | 中山 | 天水 | 蓬莱 | 厦门 | 台山 | 包头 | 五家渠 | 仙桃 | 潜江 | 江西南昌 | 朔州 | 临海 | 昭通 | 东海 | 长葛 | 吉林长春 | 永新 | 凉山 | 盐城 | 余姚 | 内蒙古呼和浩特 | 铜陵 | 日喀则 | 靖江 | 济南 | 巴中 | 莱芜 | 绵阳 | 天水 | 菏泽 | 临沧 | 湖北武汉 | 云浮 | 任丘 | 本溪 | 克孜勒苏 | 永州 | 长葛 | 赣州 | 海拉尔 | 新余 | 牡丹江 | 海门 | 云浮 | 石河子 | 普洱 | 邹平 | 安顺 | 中卫 | 南阳 | 南阳 | 十堰 | 钦州 | 汕头 | 商洛 | 新沂 | 阜新 | 单县 | 揭阳 | 平潭 | 宝应县 | 长治 | 神木 | 运城 | 嘉善 | 偃师 | 烟台 | 灌云 | 临沧 | 诸暨 | 哈密 | 潍坊 | 肥城 | 黄山 | 庆阳 | 辽宁沈阳 | 齐齐哈尔 | 临夏 | 嘉峪关 | 海宁 | 乳山 | 昌吉 | 邹平 | 泰兴 | 抚顺 | 辽阳 | 大理 | 咸宁 | 宁国 | 伊犁 | 河池 | 泗阳 | 昭通 | 普洱 | 甘南 | 朝阳 | 朔州 | 柳州 | 海西 | 甘肃兰州 | 湖北武汉 | 武夷山 | 桂林 | 新余 | 喀什 | 阜新 | 枣庄 | 山南 | 寿光 | 宁波 | 蚌埠 | 济源 | 天长 | 攀枝花 | 菏泽 | 沧州 | 湘西 | 锡林郭勒 | 伊犁 | 河南郑州 | 张北 | 阜新 | 周口 | 泰安 | 塔城 | 天水 | 阜新 | 大庆 | 双鸭山 | 潍坊 | 嘉峪关 | 金昌 | 五家渠 | 双鸭山 | 昭通 | 承德 | 儋州 | 十堰 | 临汾 | 文山 | 南阳 | 阜新 | 聊城 | 牡丹江 | 昭通 | 遵义 | 曹县 | 安阳 | 黄冈 | 澳门澳门 | 六盘水 | 潮州 | 普洱 | 洛阳 | 怒江 | 惠州 | 龙口 | 衢州 | 屯昌 | 廊坊 | 惠东 | 贵州贵阳 | 江门 | 盘锦 | 昌吉 | 象山 | 邯郸 | 德阳 | 东海 | 宜宾 | 汕尾 | 徐州 | 台南 | 高雄 | 泸州 | 简阳 | 三沙 | 长垣 | 阳春 | 东海 | 连云港 | 清徐 | 阳泉 | 宿州 | 澄迈 | 伊春 | 开封 | 江门 | 昆山 | 余姚 | 宣城 | 甘南 | 西双版纳 | 万宁 | 霍邱 | 那曲 | 漯河 | 济宁 | 柳州 | 泰兴 | 赣州 | 晋江 | 图木舒克 | 吉林 | 迁安市 | 周口 | 许昌 | 漳州 | 晋城 | 玉溪 | 庄河 | 五指山 | 苍南 | 牡丹江 | 绍兴 | 山西太原 | 黑龙江哈尔滨 | 台湾台湾 | 大庆 | 许昌 | 临汾 | 本溪 | 嘉善 | 大兴安岭 | 温岭 | 济源 | 烟台 | 潜江 | 眉山 | 山西太原 | 黔南 | 天水 | 广汉 | 怒江 | 神农架 | 厦门 | 慈溪 | 伊春 | 沧州 | 孝感 | 梧州 | 忻州 | 资阳 | 柳州 | 涿州 | 聊城 | 烟台 | 乐山 | 普洱 | 曲靖 | 扬中 | 万宁 | 黑龙江哈尔滨 | 五家渠 | 博尔塔拉 | 乳山 | 韶关 | 云南昆明 | 忻州 | 邵阳 | 日照 | 兴安盟 | 泰安 | 仙桃 | 阿勒泰 | 遂宁 | 黑龙江哈尔滨 | 中卫 | 舟山 | 延安 | 大兴安岭 | 宜昌 | 新疆乌鲁木齐 | 永康 | 喀什 | 珠海 | 通辽 | 保亭 | 三沙 | 邯郸 | 莆田 | 六安 | 濮阳 | 柳州 | 长兴 | 珠海 | 大兴安岭 | 白城 | 天水 | 丽江 | 巢湖 | 巴彦淖尔市 | 阿勒泰 | 绍兴 | 海丰 | 临沂 | 日土 | 靖江 | 海安 | 基隆 | 慈溪 | 文昌 | 驻马店 | 宝鸡 | 安康 | 红河 | 安康 | 毕节 | 济源 | 定州 | 汝州 | 深圳 | 宁波 | 白城 | 瓦房店 | 昆山 | 佳木斯 | 仁怀 | 朔州 | 牡丹江 | 博尔塔拉 | 山南 | 黔西南 | 义乌 | 淄博 | 汉川 | 乌兰察布 | 晋江 | 寿光 | 深圳 | 克孜勒苏 | 亳州 | 怒江 | 丹东 | 益阳 | 乐平 | 图木舒克 | 偃师 | 珠海 | 甘孜 | 朝阳 | 梧州 | 瓦房店 | 阿拉善盟 | 永州 | 珠海 | 达州 | 佳木斯 | 鹤壁 | 通辽 | 锡林郭勒 | 海西 | 象山 | 葫芦岛 | 大庆 | 梅州 | 德阳 | 武夷山 | 运城 | 寿光 | 温州 | 广安 | 甘南 | 泰安 | 南通 | 晋中 | 呼伦贝尔 | 日喀则 | 嘉兴 | 醴陵 | 吕梁 | 绵阳 | 怒江 | 镇江 | 烟台 | 平潭 | 嘉善 | 湖南长沙 | 岳阳 | 柳州 | 吉林长春 | 辽阳 | 海拉尔 | 恩施 | 清徐 | 新疆乌鲁木齐 | 黔南 | 晋城 | 肥城 | 商洛 | 扬中 | 果洛 | 东方 | 朝阳 | 山南 | 顺德 | 镇江 | 馆陶 | 金坛 | 惠州 | 临沂 | 驻马店 | 吴忠 | 山南 | 黄石 | 顺德 | 泰兴 | 慈溪 | 江门 | 泰兴 | 济源 | 诸暨 | 渭南 | 海南 | 霍邱 | 汉中 | 大丰 | 通辽 | 泗阳 | 桐乡 | 惠东 | 十堰 | 南京 | 临沂 | 澳门澳门 | 日土 | 保定 | 邳州 | 盐城 | 白银 | 孝感 | 铁岭 | 湛江 | 常德 | 陕西西安 | 湛江 | 德州 | 开封 | 灌南 | 本溪 | 林芝 | 阿里 | 垦利 | 永新 | 鹤壁 | 仙桃 | 大理 | 运城 | 宁波 | 伊犁 | 嘉兴 | 宁波 | 赤峰 | 溧阳 | 盘锦 | 阳春 | 铜陵 | 运城 | 嘉峪关 | 青海西宁 | 台北 | 贵港 | 乐山 | 克拉玛依 | 包头 | 鹤壁 | 运城 | 金坛 | 台北 | 潍坊 | 青海西宁 | 阿拉尔 | 台湾台湾 | 金昌 | 株洲 | 东莞 | 澳门澳门 | 龙岩 | 江门 | 晋城 | 黑河 | 池州 | 建湖 | 苍南 | 东海 | 燕郊 | 清徐 | 淮安 | 瑞安 | 庄河 | 连云港 | 白城 | 和县 | 泰州 | 神木 | 启东 | 茂名 | 万宁 | 保亭 | 桂林 | 中卫 | 三亚 | 益阳 | 苍南 | 开封 | 汉中 | 大丰 | 阿克苏 | 迁安市 | 台湾台湾 | 仙桃 | 泉州 | 昭通 | 攀枝花 | 株洲 | 忻州 | 衡阳 | 库尔勒 | 泰兴 | 株洲 | 克孜勒苏 | 湘西 | 南平 | 涿州 | 长治 | 公主岭 | 澄迈 | 天长 | 莒县 | 武安 | 黔南 | 三亚 | 内蒙古呼和浩特 | 阜新 | 大理 | 东莞 | 铜陵 | 玉溪 | 毕节 | 玉环 | 惠东 | 固原 | 石河子 | 凉山 | 天水 | 马鞍山 | 甘肃兰州 | 邹平 | 果洛 | 琼中 | 辽源 | 鸡西 | 永康 | 大丰 | 泸州 | 广西南宁 | 邢台 | 德清 | 济南 | 甘孜 | 萍乡 | 忻州 | 滁州 | 东海 | 曲靖 | 吐鲁番 | 石嘴山 | 兴安盟 | 内蒙古呼和浩特 | 昆山 | 玉溪 | 垦利 | 和县 | 玉树 | 慈溪 | 琼海 | 沭阳 | 保定 | 洛阳 | 东莞 | 海南海口 | 玉溪 | 江门 | 定安 | 德州 | 汝州 | 霍邱 | 江苏苏州 | 和县 | 琼中 | 威海 | 任丘 | 永康 | 定州 | 海宁 | 濮阳 | 廊坊 | 明港 | 临夏 | 辽阳 | 株洲 | 宁德 | 孝感 | 儋州 | 遵义 | 遵义 | 和田 | 秦皇岛 | 巴中 | 嘉善 | 邯郸 | 阿勒泰 | 韶关 | 定安 | 清远 | 塔城 | 潮州 | 盘锦 | 湘西 | 建湖 | 攀枝花 | 姜堰 | 济源 | 唐山 | 淮北 | 池州 | 雅安 | 博罗 | 溧阳 | 桂林 | 神木 | 靖江 | 那曲 | 余姚 | 义乌 | 阜阳 | 中山 | 天水 | 天门 | 南平 | 咸阳 | 张家口 |