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


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

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

而有的時候我們不需要關心程序執行的結果,沒有必要這樣浪費時間和耐心等待,那我們就要想出辦法讓程序不收等待在后台靜默執行。

根據個人的總結,總結了如下方法:

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

   大多用於提升用戶的體驗而弄。

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));  //間隔打開
}

這樣子開啟的多進程模式會存在某些缺陷,在后期的文章中會提及

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 是我個人認為非常過優秀的異步,並行,高性能的網絡通信框架,值得學習

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM