php如何進行多進程與異步調用方法

瀏覽器和服務器之間只一種面向無鏈接的HTTP協議進行通信的,面向無鏈接的程序的特色是客戶端請求服務端,服務端根據請求輸出相應的程序,不能保持持久鏈接。php

這樣就出現了一個問題,一個客戶端的相應服務端可能執行1秒也有可能執行1分鐘,這樣瀏覽器就會一直處於等待狀態,若是程序執行緩慢,用戶可能就沒耐心關掉了瀏覽器。linux

而有的時候咱們不須要關心程序執行的結果,沒有必要這樣浪費時間和耐心等待,那咱們就要想出辦法讓程序不收等待在後臺靜默執行。瀏覽器

根據我的的總結,總結了以下方法:服務器

1.客戶端頁面採用AJAX技術請求服務器swoole

   大多用於提高用戶的體驗而弄。網絡

2 利用linux多進程與php函數相結合多線程

 利用php的popen函數打開進程文件指針,配合linux命令,打開的多進程趨於穩定。框架

$cmd = "cd /dir/代碼目錄;php index.php method >> ".$log_file." &";
// linux命令 ,建議把執行結果輸出於日誌

for($i = 1; $i <= $thisPlantaskConfig['thread']; $i++)  //用參數thread控制開啓的進程數
{
     pclose(popen($cmd, "w"));  //打開進程
     usleep(mt_rand(100,500));  //間隔打開
} curl

這樣子開啓的多進程模式會存在某些缺陷,在後期的文章中會說起異步

3 遠程請求的多進程

  curl的多線程操做,建立批處理句柄,發出多請求,不用等待上個請求是否成功

<?php
// 建立一對cURL資源
$ch1 = curl_init();
$ch2 = curl_init();

// 設置URL和相應的選項
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 建立批處理cURL句柄
$mh = curl_multi_init();

// 增長2個句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
// 執行批處理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 關閉所有句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?> 

4 使用某些擴展

 利用某些通訊擴展,例如php-process

   固然,我我的不建議使用這個。

5 利用開源項目

   善於利用前輩的經驗,站在巨人的肩膀上。

  swoole 和 workerman 是我我的認爲很是過優秀的異步,並行,高性能的網絡通訊框架,值得學習

相關文章
相關標籤/搜索