Heim  >  Artikel  >  Backend-Entwicklung  >  Nicht blockierende PHP-Batch-Push-Daten

Nicht blockierende PHP-Batch-Push-Daten

藏色散人
藏色散人nach vorne
2019-12-04 17:34:462609Durchsuche

Heute habe ich jemanden im Forum gesehen, der fragte, wie PHP Daten stapelweise und nicht blockierend an den Server übertragen kann. Hier ist eine grobe Zusammenfassung.

Verwandte Empfehlungen: „PHP-Tutorial

1. Der einfachste Weg:

Führen Sie ein Skript mehrmals gleichzeitig aus und verwenden Sie Parameter um den Umfang festzulegen. Wenn Sie 10.000 Benutzer pushen möchten, können Sie für alle 100 Benutzer ein Skript ausführen (die Skriptlogik besteht darin, 100 Benutzer zu durchlaufen und Daten seriell zu senden, der Code wird weggelassen), und mehrere (100) Skripte können gleichzeitig ausgeführt werden Zeit.

Ähnlich wie:

php task.php 1 100 &
php task.php 101 200 &
php task.php 201 300 &
........

Natürlich ist diese Methode nicht nicht blockierend, kann aber stapelweise ausgeführt werden, was die Verarbeitung erheblich beschleunigt.

2. Problematisch: Wenn Sie ein nicht blockierendes und kein HTTP-Protokoll wünschen

können Sie den folgenden Code verwenden:

<?php
// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();
 
// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://baidu.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://baidu.com/");
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);
 
// 轮询Server返回的结果
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);

3 Benutze PHP-Socket + stream_select

<?php
// uid数组,每个uid发送一个链接
$uids = array(1,2,3,4,5,6);
// 保存socket的数组
$sockets = array();
 
// 批量创建链接并发送数据
foreach($uids as $uid)
{
    // tcp://baidu.com 改成你要访问的ip或者域名
    if(!$socket = stream_socket_client("tcp://baidu.com:80", $errno, $errstr))
    {
        echo "$errstr\n";
        continue;
    }
 
    // 根据自己的协议向服务端写入数据,这里模拟HTTP协议
    fwrite($socket, "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n");
    // 设置成非阻塞
    stream_set_blocking($socket, 0);
    // 记录数组
    $sockets[(int)$socket] = $socket;
}
 
// 批量等待数据返回
while(count($sockets)>0)
{
    $read = $sockets;
    $write = $e = array();
    // 等待数据可读
    if(stream_select($read, $write, $e, 10))
    {
        // 循环读数据
        foreach($read as $socket)
        {
           // 这里是服务端返回的数据,需要的话可以循环读
           echo fread($socket, 8192);
           // 数据读取完毕关闭链接,并删除链接
           fclose($socket);
           unset($sockets[(int)$socket]);
        }
    }
}

Das obige ist der detaillierte Inhalt vonNicht blockierende PHP-Batch-Push-Daten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen