Nicht blockierende PHP-Batch-Push-Daten

藏色散人
Freigeben: 2023-04-07 22:32:01
nach vorne
2622 Leute haben es durchsucht

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 &
........
Nach dem Login kopieren

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);
Nach dem Login kopieren

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]);
        }
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
php
Quelle:csdn.net
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage