Heim  >  Artikel  >  Backend-Entwicklung  >  Bitte geben Sie mir einige Ideen zur Implementierung der Aufgabenwarteschlange in PHP Redis

Bitte geben Sie mir einige Ideen zur Implementierung der Aufgabenwarteschlange in PHP Redis

WBOY
WBOYOriginal
2016-10-19 10:40:501891Durchsuche

Mein PHP-Website-Programm ruft die Schnittstelle einer externen Website auf.
Wenn der Benutzer Daten eingibt, empfängt das PHP-Programm die Daten, fordert dann basierend auf den Daten die Schnittstelle der externen Website an, ruft die Daten ab und gibt sie an den Benutzer zurück.
Wenn jedoch mehrere Benutzer gleichzeitig Daten übermitteln, fordert PHP diese Schnittstelle gleichzeitig an und diese Schnittstelle gibt einen Fehler zurück.

Ich möchte jetzt PHP Redis verwenden, um eine Warteschlange zu erstellen. Benutzeranfragen werden in die Redis-Warteschlange gestellt und nacheinander auf den externen Schnittstellen abgefragt, um das Problem zu vermeiden, dass gleichzeitig Schnittstellen angefordert werden.

Wie setzt man es konkret um?

Antwortinhalt:

Mein PHP-Website-Programm ruft die Schnittstelle einer externen Website auf.
Wenn der Benutzer Daten eingibt, empfängt das PHP-Programm die Daten, fordert dann basierend auf den Daten die Schnittstelle der externen Website an, ruft die Daten ab und gibt sie an den Benutzer zurück.
Wenn jedoch mehrere Benutzer gleichzeitig Daten übermitteln, fordert PHP diese Schnittstelle gleichzeitig an und diese Schnittstelle gibt einen Fehler zurück.

Ich möchte jetzt PHP Redis verwenden, um eine Warteschlange zu erstellen. Benutzeranfragen werden in die Redis-Warteschlange gestellt und nacheinander auf den externen Schnittstellen abgefragt, um das Problem zu vermeiden, dass gleichzeitig Schnittstellen angefordert werden.

Wie setzt man es konkret um?

Probieren Sie es aus

<code>// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超时策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
    if((time()-$time_start)> $time_out) {
        break; // 超时跳出(某些原因队列异常了, 可能永远取不到)
    }
    usleep(10); // sleep 10ms, 再次尝试
}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容
// 处理完成后(数据库等已入库更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求
    $redis->lPop($tsk_name); // 完成任务了, 从队列中移除
}
 
// 响应内容
return $response;</code>

Der Handtyp wurde nicht überprüft, die Idee ist diese.

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