首頁 > 後端開發 > PHP問題 > php如何實作並發

php如何實作並發

藏色散人
發布: 2023-03-06 15:42:01
原創
5235 人瀏覽過

php實作並發的方法:先寫好針對第三方的請求接口;然後使用並發請求這些第三方的接口,並發程式碼如「function request(){...}」;最後使用php實作循環請求介面即可。

php如何實作並發

推薦:《PHP影片教學》 

php實作並發

使用場景

如果你第三方的多個接口,需要循環請求,這時候就需要並發處理,因為php 是單進程,順序執行的程序,如果有一個接口掛了,那麼後面的介面也不能得到請求,或是某個介面等待時間過長,下面的介面也需要等待時間,那麼十多個介面每個介面等待1S,十個介面就需要10S才能完成一次請求。這時候,就需要使用並發請求

使用方案

可以先寫好針對某個第三方的請求接口,然後使用並發請求這些第三方的接口

#並發程式碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

function request(){

$srart_time = microtime(TRUE);

$webSiteUrl = 'http://test/';

/**

 * 结算

 */

$alls = [

    $webSiteUrl . "1.php",

    $webSiteUrl . "2.php",

];

//1 创建批处理cURL句柄

$chHandle = curl_multi_init();

$chArr = [];

//2.创建多个cURL资源

foreach ($alls as $Url) {

    $chArr[$Url] = curl_init();

    curl_setopt($chArr[$Url], CURLOPT_URL, $Url);

    curl_setopt($chArr[$Url], CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($chArr[$Url], CURLOPT_TIMEOUT, 1);

    curl_multi_add_handle($chHandle, $chArr[$Url]); //2 增加句柄

}

$active = null;

/**常量

 * CURLM_CALL_MULTI_PERFORM==-1

 * // CURLM_OK == 0

 **/

do {

    $mrc = curl_multi_exec($chHandle, $active); //3 执行批处理句柄

} while ($mrc == CURLM_CALL_MULTI_PERFORM); //4

//4 $active 为true,即$chHandle批处理之中还有$ch句柄正待处理,$mrc==CURLM_OK,即上一次$ch句柄的读取或写入已经执行完毕。

while ($active && $mrc == CURLM_OK) {

    if (curl_multi_select($chHandle) != CURLM_CALL_MULTI_PERFORM) {//$chHandle批处理中还有可执行的$ch句柄,curl_multi_select($chHandle) != -1程序退出阻塞状态。

        do {

            $mrc = curl_multi_exec($chHandle, $active);//继续执行需要处理的$ch句柄。

        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

    }

}

foreach ($chArr as $k => $ch) {

//    $result[$k] = curl_multi_getcontent($ch); //5 获取句柄的返回值,不需要

    curl_multi_remove_handle($chHandle, $ch);//6 将$chHandle中的句柄移除

}

curl_multi_close($chHandle); //7 关闭全部句柄

$end_time = microtime(TRUE);

echo sprintf("use time:%.3f s", $end_time - $srart_time);

}

登入後複製

php 實作循環請求介面

這種情況針對的是循環需要在1S內執行的程序,如果執行頻率超過1S,則直接使用linux 的排程任務即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

// 无时间限制执行此程序

set_time_limit(0);

// 设置默认时区  北京时间

date_default_timezone_set('PRC');

do {

    //  如果不存在 stop  文件,则程序停止 并且记录停止时间

    if (!file_exists(dirname(__FILE__) . '/stop')) {

        $handle = fopen('./ceshi.log', 'a+');

        fwrite($handle, '程序停止时间: ' . date('Y-m-d H:i:s') . "\n");

        fclose($handle);

        exit();

    }

    sleep(4);

    try {

        requestNewOpen();

    } catch (Exception $exception) {

        $handle = fopen('./ceshi.log', 'a+');

        fwrite($handle, 'catch : ' . $exception->getMessage() . "\n");

        fclose($handle);

    }

} while (true);

登入後複製

以上是php如何實作並發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板