Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie Parallelität in PHP

So implementieren Sie Parallelität in PHP

藏色散人
藏色散人Original
2020-10-10 10:18:575013Durchsuche

So implementieren Sie Parallelität in PHP: Schreiben Sie zuerst die Anforderungsschnittstelle für diese Drittanbieterschnittstellen und verwenden Sie dann gleichzeitigen Code wie „Funktionsanforderung () {...}“. Implementieren Sie die Schleifenanforderungsschnittstelle. Das war's.

So implementieren Sie Parallelität in PHP

Empfohlen: „PHP-Video-Tutorial

php, um Parallelität zu erreichen

Verwendungsszenarien

Wenn Sie über mehrere Schnittstellen von Drittanbietern verfügen, die Schleifenanforderungen benötigen, müssen Sie diese gleichzeitig verarbeiten , weil PHP Es ist ein einzelner Prozess, ein Programm, das nacheinander ausgeführt wird. Wenn eine Schnittstelle hängen bleibt, können die nachfolgenden Schnittstellen keine Anforderungen erhalten, oder die Wartezeit einer bestimmten Schnittstelle ist zu lang und die folgenden Schnittstellen müssen ebenfalls warten Daher muss jede der mehr als zehn Schnittstellen 1 Sekunde warten, während zehn Schnittstellen 10 Sekunden benötigen, um eine Anfrage abzuschließen. Zu diesem Zeitpunkt müssen Sie gleichzeitige Anforderungen verwenden

Nutzungsplan

Sie können zuerst die Anforderungsschnittstelle für einen bestimmten Drittanbieter schreiben und dann gleichzeitige Anforderungen für diese Drittanbieterschnittstellen verwenden

Gleichzeitiger Code

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 zum Implementieren die Schleifenanforderungsschnittstelle

Diese Situation gilt für Programme, die innerhalb von 1S ausgeführt werden müssen. Wenn die Ausführungshäufigkeit 1S überschreitet, können Sie die geplanten Aufgaben von Linux direkt verwenden

// 无时间限制执行此程序
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);

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Parallelität in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn