Mit der Funktion von Socket_Set_Blocking () wird festgelegt, ob sich der Socket im Blockierungsmodus befindet. Im Blockierungsmodus warten die Lese- und Schreibvorgänge des Sockets, bis die Daten fertig sind. Anstatt den Modus zu blockieren, kehrt die Operation sofort zurück, anstatt auf die Daten zu warten. Dies ist besonders wichtig für Server, die mehrere Client-Verbindungen verarbeiten müssen, und der Nicht-Blocking-Modus kann verhindern, dass das gesamte Programm aufgrund der Blockierung einer Verbindung hängt.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$blocking</span></span><span> )
</span></span>$ Socket : Socket -Ressource.
$ blocking : Wenn wahr , ist der Socket im Blockierungsmodus; Wenn falsch , befindet sich der Sockel im nicht blockierenden Modus.
Stellen Sie beispielsweise einen Socket in den Nicht-Blocking-Modus fest:
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>Mit der Funktion von Socket_Get_Status () werden die Statusinformationen des aktuellen Sockets erhalten, einschließlich der Frage, ob sie sich im Blockierungsmodus befindet, ob der Socket geschlossen wurde, usw. Gibt ein assoziatives Array zurück, das die folgenden Felder enthält:
Blockiert : Ob im Blockierungsmodus, 1 bedeutet Blockierung und 0 bedeutet nicht blockierend.
EOF : Ob das Dateiende -Flag erreicht wurde (für den Fall, in dem die Verbindung geschlossen ist).
Fehler : Der Fehlercode des aktuellen Sockets.
Fehler : Fehlermeldung für den aktuellen Socket.
<span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>Ein Beispiel: Erhalten Sie den Status einer Steckdose:
<span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Blocked: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"EOF: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>Das Kombinieren von Socket_Set_Blocking () und Socket_Get_Status () kann eine flexiblere und effizientere Netzwerkkommunikation erreichen, insbesondere bei der Behandlung gleichzeitiger Verbindungen. Hier finden Sie einige Tipps und Vorsichtsmaßnahmen bei der Verwendung:
In einigen Fällen müssen wir den Blockierungsmodus der Steckdose dynamisch schalten. Wenn beispielsweise die Verarbeitung einer Netzwerkanforderung, wenn sich die Socket -Lesedaten im Blockierungsmodus befinden,, wenn das Netzwerk nicht in gutem Zustand ist oder die Daten nicht fertig sind, kann das gesamte Programm hängen. Zu diesem Zeitpunkt können Sie über Socket_Set_Blocking () in den Nicht-Blocking-Modus wechseln und dann den Status des Socket über Socket_get_status () überprüfen, um das Blockieren zu vermeiden.
Zum Beispiel:
<span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] == </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Sockeln befinden sich jetzt im nicht blockierenden Modus。\n"</span></span><span>;
}
</span></span>Wenn sich der Socket im nicht blockierenden Modus befindet, werden Funktionen wie Socket_read () sofort zurückgegeben, auch wenn keine Daten gelesen werden. Um wiederholte bedeutungslose Aufrufe zu vermeiden, kann Socket_get_status () mit socket_get_status () kombiniert werden, um festzustellen, ob der aktuelle Socket die Daten gelesen hat oder ob sie EOF (Ende der Datei) erreicht hat.
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
</span><span><span class="hljs-keyword">break</span></span><span>; </span><span><span class="hljs-comment">// Keine Daten zum Lesen</span></span><span>
}
</span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// Handlungsfehler</span></span><span>
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-variable">$data</span></span><span> .= </span><span><span class="hljs-variable">$buffer</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Daten lesen: <span class="hljs-subst">$data</span></span></span><span>\n";
</span></span>Durch den obigen Code können wir beurteilen, ob EOF in Echtzeit erreicht wird, und unnötige wiederholte Messwerte zu vermeiden.
socket_get_status () überprüft nicht nur den Blockierungsstatus, sondern hilft uns auch, andere wichtige Informationen über den Socket zu verstehen. Zum Beispiel kann es verwendet werden, um festzustellen, ob der Sockel geschlossen wurde (EOF -Flag) oder ob ein Fehler aufgetreten ist.
<span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Die Verbindung ist geschlossen。\n"</span></span><span>;
}
</span></span>Obwohl Socket_Get_Status () in Echtzeit den Soziktstatus erhalten kann, kann das Aufrufen dieser Funktion zu häufig zu Leistungsaufwand führen. Daher wird in einer hohen Parallelitätsumgebung die Anruffrequenz vernünftig gesteuert, um unnötige Zustandsprüfungen zu vermeiden.
Bei Verwendung dieser beiden Funktionen, insbesondere bei der Ausführung von Socket -Operationen (wie z. B. Socket_read () ), muss die Fehlerbehandlung durchgeführt werden. Socket -Operationen können aufgrund von Netzwerkproblemen oder aus anderen Gründen fehlschlagen. Daher sollte eine angemessene Fehlerbehandlungslogik hinzugefügt werden, wenn sie tatsächlich verwendet werden.
<span><span><span class="hljs-variable">$buffer</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$error_code</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Fehler lesen: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$error_code</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>Mit Socket_Set_Blocking () und Socket_Get_Status () können die Socket_Get_Status () Socket -Statusinformationen effektiv steuern und die durch Blockierung verursachten Leistungs Engpässe vermeiden. In der tatsächlichen Entwicklung kann die Reaktionsgeschwindigkeit und Robustheit des Programms durch ein vernünftiges Festlegen des Blockierungsmodus und der Beurteilung von EOF und Fehlerstatus verbessert werden. Es ist jedoch zu beachten, dass häufige Aufrufe zur Überprüfung der Staatsprüfungen möglicherweise Auswirkungen auf die Leistung haben. Daher sollte die Überprüfung zu geeigneten Zeiten durchgeführt werden, um übermäßige Anrufe zu vermeiden.
Die Verwendung dieser beiden Funktionen kann vernünftigerweise die Flexibilität und Effizienz des Umgangs mit gleichzeitigen Verbindungen erheblich verbessern, wodurch PHP -Netzwerkkommunikationsanwendungen stabiler und effizienter werden.