Hintergrund
PHP wird im Projekt verwendet, aber aufgrund der langen und zeitaufwändigen Aufgabe muss der Server nach der Übermittlung des Front-Ends asynchron reagieren.
Es gibt viele Lösungen für asynchrone Server, einschließlich MQ, fsocket, Swoole usw.
Swoole ist in reiner C-Sprache geschrieben und bietet asynchronen Multithread-Server in PHP-Sprache, asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL, asynchrones Redis, Datenbankverbindungspool, AsyncTask, Nachrichtenwarteschlange, Millisekunden-Timer, Asynchron Lesen und Schreiben von Dateien, asynchrone DNS-Abfrage. Swoole verfügt über einen integrierten HTTP/WebSocket-Server/Client und einen HTTP2.0-Server.
Das Wichtigste ist, dass es die PHP-Sprache perfekt unterstützt. Deshalb habe ich mit Swoole einen asynchronen Server erstellt, der eine Reihe von Aufgaben wie asynchrone Antworten, Push und geplante Aufgaben bereitstellt.
Installation
Swoole ist in der Sprache C geschrieben und verwendet Kompilierung und Installation.
Die Installationsabhängigkeiten sind:
php-5.3.10 oder höhere Version
gcc-4.4 oder höhere Version
make
autoconf
pcre (Centos-System kann den Befehl ausführen: yum install pcre-devel)
Installationsmethode:
phpize #Wenn der Befehl nicht vorhanden ist, fügen Sie bitte PHP hinzu front Der tatsächliche Pfad von
./configure
make
sudo make install
Nachdem die Kompilierung abgeschlossen ist, müssen Sie die Erweiterung extension=swoole.so
Verwenden SieServer
class Server{ private $serv; public function __construct() { $this->serv = new swoole_server("0.0.0.0", 9501); $this->serv->set(array( //'worker_num' => 1, //一般设置为服务器CPU数的1-4倍 'daemonize' => 1, //以守护进程执行 'max_request' => 10000, 'task_worker_num' => 1, //task进程的数量 "task_ipc_mode " => 3 , //使用消息队列通信,并设置为争抢模式 'open_length_check' => true, 'dispatch_mode' => 1, 'package_length_type' => 'N', //这个很关键,定位包头的 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //第几个字节开始计算长度 'package_max_length' => 2000000, //协议最大长度 "log_file" => "/tmp/swoole_test.log" //日志 )); $this->serv->on('Receive', array($this, 'onReceive')); $this->serv->on('Task', array($this, 'onTask')); $this->serv->on('Finish', array($this, 'onFinish')); $this->serv->start(); } public function onReceive( swoole_server $serv, $fd, $from_id, $data ) { //放入任务队列,开始执行 $task_id = $serv->task( $data ); } public function onTask($serv,$task_id,$from_id, $data) { //做一些事情 }
Client
class Client{ private $client, $ip, $port, $params; public function __construct($ip, $port, $params) { $this->ip = $ip; $this->port = $port; $this->params = $params; $this->client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); $this->client->set(array( 'open_length_check' => true, 'package_length_type' => 'N', 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //第几个字节开始计算长度 'package_max_length' => 2000000, //协议最大长度 )); //设置事件回调函数 $this->client->on('Connect', array($this, 'onConnect')); $this->client->on('Receive', array($this, 'onReceive')); $this->client->on('Close', array($this, 'onClose')); $this->client->on('Error', array($this, 'onError')); //发起网络连接 $this->client->connect($ip, $port, 3); } public function onReceive( $cli, $data ) { echo "Received: " . $data . "\n"; } public function onConnect($cli) { $data = pack('N', strlen($data)) . $data; $cli->send($data); $cli->close(); } public function onClose( $cli) { echo "Connection close\n"; } public function onError() { echo "Connect failed\n"; } }
Achtung
'open_length_check' => true, 'package_length_type' => 'N', 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //第几个字节开始计算长度 'package_max_length' => 2000000, //协长度
Diese werden zur Definition der Frame-Trennung verwendet. Da Swooles Client und Server über TCP-Verbindungen kommunizieren, müssen mehrere Frame-Trennungsmethoden angegeben werden. Hier ist eine Möglichkeit, mit dem Kopf Länge hinzuzufügen.
Das obige ist der detaillierte Inhalt vonGrundlegende Verwendung von PHP Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!