<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 1 Gearman簡介 ## 1.1 概況 Gearman是一個用來把工作委派給其他機器、分布式的調用更適合做某項工作的機器、并發的做某項工作在多個調用間做負載均衡、或用來在調用其它語言的函數的系統。 ## 1.2 組成 Gearman是一個分發任務的程序架構,由三部分組成: * Gearman client:提供gearman client API給應用程序調用。API可以使用C,PHP,PERL,MYSQL UDF等待呢個語言,它是請求的發起者。 * Gearman job server:將客戶端的請求分發到各個gearman worker的調度者,相當于中央控制器,但它不處理具體業務邏輯。 * Gearman worker:提供gearman worker API給應用程序調用,具體負責客戶端的請求,并將處理結果返回給客戶端。 ## 1.3 應用 Mogilefs的分布式文件系統的核心就是用gearman實現的。 * 這個軟件的應用場景很多,比如視頻網站的視頻處理,分布式日志處理,電子郵件處理,文件同步處理,圖片處理等等,只要是可以放開,不影響體驗和響應的場 景,需要并行進行大量計算和處理的程序都是可以的。Yahoo在60或更多的服務器上使用gearman每天處理600萬個作業。新聞聚合器digg構建 了一個相同規模的gearman網絡,每天可處理400000個作業。 * Gearman不但可以做為任務分發,還可以做為應用方面的負載均衡。可以讓worker放在不同的一堆服務器上,也可以啟動放在同一個cpu的多個核 上。比如,應用視頻轉換程序,不希望web服務器來處理視頻格式轉換,這時,可以在這一堆服務器上進行任務分發,在上面加載worker處理視頻格式,對 外的web服務器就不會被視頻轉換過程影響。而且擴展方便,加一臺服務器到任務調度中心,注冊成worker即可,這時job server會在請求到來的時候,將請求發送給空閑的worker。還可以運行多個job server,組成ha架構,如果一個job server當掉了,client和worker會自動遷移到另一臺job server上。 1.4 工作原理圖 ![](https://box.kancloud.cn/71a0489ae48c6002ca8f92d3f043d288_479x302.png) 2 運行過程 `一個Gearman請求的處理過程涉及三個角色:Client -> Job -> Worker。` * Client:請求的發起者,可以是 C,PHP,Perl,MySQL UDF 等等。 * Job:請求的調度者,用來負責協調把 Client 發出的請求轉發給合適的 Work。 * Worker:請求的處理者,可以是 C,PHP,Perl 等等。 `因為 Client,Worker 并不限制用一樣的語言,所以有利于多語言多系統之間的集成。` `甚至我們通過增加更多的 Worker,可以很方便的實現應用程序的分布式負載均衡架構。` # 3 Gearman下載 1)官網 http://gearman.org/ 2)官網下載 https://launchpad.net/gearmand 3)官網使用向導 http://gearman.org/getting-started/ 4)gearman服務 https://github.com/gearman/gearmand/releases 5)gearman-php擴展 https://github.com/wcgallego/pecl-gearman/releases # 4 Gearman安裝 ``` //更新下載列表 apt-get update //安裝服務 apt-get install gearman-server apt-get install gearman-job-server apt-get install gearman-tools //查看進程 是否安裝成功 ps -aux | grep gearman gearman 10896 0.0 0.6 68684 6448 ? Ssl Mar06 0:06 /usr/sbin/gearmand --log-file=/var/log/gearman-job-server/gearman.log root 22920 0.0 0.2 4692 2072 pts/3 S+ 10:23 0:00 grep --color=auto gear //查看監聽端口 # netstat -anp | grep 4730 ``` ## 4.1 詳細參數 -b,--backlog= 儲備的監聽連接數量 -d, --daemon 后臺運行 -f, --file-descriptors= 文件描述符的數量 -h, --help 幫助 -j, --job-retries= 在ob server移除不可用job之前運行的次數,防止不斷運行導致其他可用worker崩潰。默認沒有限制 -l, -log-file= 日志文件存放位置(默認記錄最簡單日志) -L, --listen= 監聽的IP,默認全部接受 -p, --port= 指定監聽端口 -P, --pid-file= 指定進程ID寫入位置 -r, --protocol= 加載協議模塊 -q, --queue-type= 指定持久化隊列 -t, --threads= 使用的I/9線程數量。默認為0 -u, --user= 啟動后,切換到指定用戶 -V, --version 顯示版本信息 ## 5 Gearadmin 管理 ``` 輸入以下命令,查看4730端口情況。 (echo "status" ; sleep 2 ) | telnet 192.168.142.130 4730 或者輸入以下命令查看gearman運行情況 # gearadmin --status email 0 0 2 emailtemplate 0 0 1 ``` * 字段說明:"已知注冊的任務" "正在運行的任務" "隊列中的任務" "可用的 Worker". * emailtemplate 0 0 1,注冊的任務名為 emailtemplate,0 個正常在運行,隊列為空,有一個可用的 Worker. ## 5.1 常用參數 * --status 查看 Status for the server. * --workers 查看 Workers for the server. * --shutdown 關閉服務器。 # 6 Gearman使用 ## 6.1 Gearmanjob ```php /** * @param array $argv 傳入worker名稱 * 或者 $_SERVER['argv'] * */ $channel = !empty($argv[1]) ? $argv[1] : 'email'; $worker = new GearmanWorker(); $worker->addServer('192.168.142.130', '4730'); //參數1:worker在Gearadmin管理中顯示的名稱,參數2回調方法 $worker->addFunction($channel,array(new GearmanWorkerDeal($channel),'invoke')); while($worker->work()); ``` ## 6.2 GearmanWorker ```php class GearmanWorkerDeal{ public $channel; public static $dealResult = false; public function __construct($channel = 'email') { $this->channel = $channel; } /** * @param GearmanJob $job */ public function invoke(GearmanJob $job) { $ret = $job->workload(); $ret = unserialize($ret); $func = $this->channel.'Invoke'; if(!empty($ret) && method_exists(new GearmanWorkerDeal($this->channel),$func)) { //業務處理 $this->$func($ret); } } public function emailInvoke($data = []){ $vars = [ 'to'=>[$data['email']], 'sub'=>[ '%userName%'=>[$data['userName']], '%subject%'=>[''], '%content%'=>[$data['content']], '%emailIconClass%' => [$data['type']], ], ]; $params = array( 'api_user'=>'api_user', 'api_key'=>'api_key', 'template_invoke_name' => '模版名稱', 'subject' => '標題', 'from' => '發件人郵箱', 'fromname' => '發件人姓名', 'substitution_vars'=>json_encode($vars), ); $ret = self::requestApi($params); } //請求接口發送 public static function requestApi($params = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_URL, 'https://sendcloud.sohu.com/webapi/mail.send_template.json'); //不同于登錄SendCloud站點的帳號,您需要登錄后臺創建發信子帳號,使用子帳號和密碼才可以進行郵件的發送。 curl_setopt($ch, CURLOPT_POSTFIELDS,$params); $result = curl_exec($ch); //請求失敗 if($result === false) { echo 'last error : ' . curl_error($ch); } curl_close($ch); return $result; } } ``` ## 6.3 啟動Job端 啟動job端 任務服務器,讓該命令在后臺執行,并把輸出重定向到email_error.log文件。 `nohup /usr/bin/php /data/Gearmanjob.php email > /data/email_error.log 2>&1 &` >[info] > nohup:不掛斷地運行命令 > &:在后臺運行 > 2>&1:是將標準出錯重定向到標準輸出,這里的標準輸出已經重定向到了email_error.log文件,即將標準出錯也輸出到email_error.log文件中 ## 6.4 創建Client ```php $client = new GearmanClient(); $client->addServer('192.168.142.130', '4730'); $data = [ 'email' => '', 'userName' => '', 'content' => '', 'type' => '' ] //參數1:Worker的名稱,參數2:序列化后的參數 $ret = $client->doBackground('emial', serialize($data)); echo $ret."\r\n"; ``` # 7 使用注意 * 在調試或者更新Worker代碼后,一定要重啟進程。 * 命令行下執行帶參數php,并取得參數: * 可使用 $argv 或者 $_SERVER['argv'] 或者 getopt('a:b:') * 測試文件 ```php <?php print_r($argv); echo "\n"; echo $argc; echo "\n"; ?> ``` * 命令行下調用 ``` $ php test.php aaa ccc bbbb Array ( [0] => test.php //參數0,文件本身 [1] => aaa //參數1 [2] => ccc //參數2 [3] => bbbb //參數3 ) 4 //$argc的值,參數的總數 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看