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