自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

誰(shuí)說(shuō)PHP不能異步和并行運(yùn)行?

開發(fā) 前端
如果每個(gè)接口調(diào)用需要1秒,那么即使是10條數(shù)據(jù),也需要10秒來(lái)完成,這還沒(méi)有考慮到網(wǎng)絡(luò)延遲和接口提供方可能出現(xiàn)的問(wèn)題。

場(chǎng)景

在處理需要遠(yuǎn)程接口調(diào)用的大量數(shù)據(jù)時(shí),我們面臨一個(gè)關(guān)鍵問(wèn)題:串行處理導(dǎo)致的效率低下。如果每個(gè)接口調(diào)用需要1秒,那么即使是10條數(shù)據(jù),也需要10秒來(lái)完成,這還沒(méi)有考慮到網(wǎng)絡(luò)延遲和接口提供方可能出現(xiàn)的問(wèn)題。在串行執(zhí)行的情況下,一旦接口調(diào)用遇到問(wèn)題,整個(gè)處理時(shí)間會(huì)成倍增加,這不僅降低了程序的響應(yīng)速度,也增加了系統(tǒng)的不穩(wěn)定性。

為了解決這個(gè)問(wèn)題,我們可以采取以下幾種優(yōu)化策略:

  • 異步執(zhí)行:通過(guò)異步調(diào)用遠(yuǎn)程接口,可以讓程序在等待接口響應(yīng)的同時(shí)繼續(xù)執(zhí)行其他任務(wù),從而提高整體的處理速度。
  • 并行處理:利用多線程或多進(jìn)程技術(shù),同時(shí)發(fā)起多個(gè)遠(yuǎn)程接口調(diào)用,顯著減少總的處理時(shí)間。

現(xiàn)有方案

遠(yuǎn)程接口案例

假設(shè)第三方或者遠(yuǎn)程接口調(diào)用偽代碼如下:

<?php
public function sync(): \support\Response
{
    sleep(1);
    return json(['data' => date('Y-m-d H:i:s')]);
}

接口調(diào)用訪問(wèn)地址:http://127.0.0.1:8888/index/sync

業(yè)務(wù)系統(tǒng)案例

假設(shè)業(yè)務(wù)系統(tǒng)調(diào)用偽代碼:

<?php
declare(strict_types=1);

foreach (range(1, 10) as $key) {
    $list[] = file_get_contents("http://127.0.0.1:8888/index/sync");
}
print_r($list);

調(diào)用輸出:

[x] [系統(tǒng)調(diào)用耗時(shí)時(shí)間] 10.138074159622
Array
(
    [0] => {"data":"2024-05-16 22:38:00"}
    [1] => {"data":"2024-05-16 22:38:01"}
    [2] => {"data":"2024-05-16 22:38:02"}
    [3] => {"data":"2024-05-16 22:38:03"}
    [4] => {"data":"2024-05-16 22:38:04"}
    [5] => {"data":"2024-05-16 22:38:05"}
    [6] => {"data":"2024-05-16 22:38:06"}
    [7] => {"data":"2024-05-16 22:38:07"}
    [8] => {"data":"2024-05-16 22:38:08"}
    [9] => {"data":"2024-05-16 22:38:09"}
)

可以看出上面是按順序調(diào)用接口,總共耗時(shí)10.14秒。

異步并行調(diào)用

這個(gè)庫(kù)提供了一個(gè)小而簡(jiǎn)單的PHP PCNTL擴(kuò)展的包裝器。它允許并行運(yùn)行不同的進(jìn)程,并具有易于使用的API。官方地址:https://github.com/spatie/async

安裝

您可以通過(guò)composer安裝該軟件包:

composer require spatie/async

注意:該擴(kuò)展庫(kù)異步并行執(zhí)行需要所需的擴(kuò)展pcntl 和 posix。沒(méi)有安裝在您當(dāng)前的PHP運(yùn)行時(shí)中, Pool 將自動(dòng)回退到同步執(zhí)行任務(wù)。

Pool類有一個(gè)靜態(tài)方法 isSupported,你可以調(diào)用它來(lái)檢查你的平臺(tái)是否能夠運(yùn)行異步進(jìn)程。

require '../vendor/autoload.php';

use Spatie\Async\Pool;
var_dump(Pool::isSupported());

支持異步進(jìn)程則打印true,否則為false。

使用

<?php
/**
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/5/21 14:00
 */
declare(strict_types=1);

require '../vendor/autoload.php';

use Spatie\Async\Pool;

$timeOne = microtime(true);
$pool = Pool::create();

foreach (range(1, 10) as $item) {
    $pool[] = async(function () use ($item) {
        return file_get_contents("http://127.0.0.1:8888/index/sync");
    })->then(function (string $output) use (&$list) {
        // Handle success
        $list[] = $output;
    })->catch(function (Throwable $exception) {
        // Handle exception
        echo '[x] [異常] ' . $exception->getMessage() . PHP_EOL;
    });
}
await($pool);

$timeTwo = microtime(true);
echo '[x] [系統(tǒng)調(diào)用耗時(shí)時(shí)間] ' . ($timeTwo - $timeOne) . PHP_EOL,
print_r($list);

調(diào)用輸出:

[x] [系統(tǒng)調(diào)用耗時(shí)時(shí)間] 4.3443310260773
Array
(
    [0] => {"data":"2024-05-16 22:53:47"}
    [1] => {"data":"2024-05-16 22:53:47"}
    [2] => {"data":"2024-05-16 22:53:47"}
    [3] => {"data":"2024-05-16 22:53:47"}
    [4] => {"data":"2024-05-16 22:53:47"}
    [5] => {"data":"2024-05-16 22:53:47"}
    [6] => {"data":"2024-05-16 22:53:47"}
    [7] => {"data":"2024-05-16 22:53:47"}
    [8] => {"data":"2024-05-16 22:53:48"}
    [9] => {"data":"2024-05-16 22:53:49"}
)

可以看出上面是按并行調(diào)用接口,總共耗時(shí)4.34秒。節(jié)省了差不多一半多時(shí)間。

責(zé)任編輯:武曉燕 來(lái)源: 開源技術(shù)小棧
相關(guān)推薦

2022-04-26 08:41:38

Swift并發(fā)系統(tǒng)iOS

2013-08-02 10:32:56

DevOps

2013-09-12 13:27:07

DevOps

2012-02-24 22:54:56

開源linux

2009-10-27 09:12:50

Visual Stud

2019-07-26 09:20:21

ClusterShel命令Linux

2011-05-04 14:19:46

iPad打印打印機(jī)

2022-10-24 09:02:28

Selenium自動(dòng)化

2010-03-04 09:10:34

Linux Chrom

2009-07-02 10:08:23

安裝Azure

2010-03-08 09:17:13

F#異步

2021-10-03 20:08:29

HTTP2Scrapy

2009-03-13 10:54:18

SQL Server并行查詢數(shù)據(jù)庫(kù)管理

2018-10-18 09:34:16

高并發(fā)異步化并行化

2009-12-08 18:33:22

PHP函數(shù)printa

2017-08-31 13:50:53

Python編程語(yǔ)言庫(kù)

2017-06-09 13:36:33

人工智能深度學(xué)習(xí)

2009-03-24 11:11:19

加速并行查詢SQL

2010-03-26 19:03:19

F#異步并行模式

2024-09-23 17:15:28

Python并發(fā)并行
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)