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. (Empfohlenes Lernen: Swoole-Video-Tutorial )
Swoole ist in reiner C-Sprache geschrieben und bietet einen asynchronen Multithread-Server in PHP-Sprache, einen asynchronen TCP/UDP-Netzwerk-Client, asynchrones MySQL und asynchrones Redis, Datenbankverbindungspool, AsyncTask, Nachrichtenwarteschlange, Millisekunden-Timer, asynchrones 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 Swoole verwendet, um einen asynchronen Server zu erstellen, der eine Reihe von Aufgaben wie asynchrone Antworten, Push und geplante Aufgaben bereitstellt.
Swoole ist in der Sprache C geschrieben und wird kompiliert und installiert.
Die Installationsabhängigkeiten sind:
php-5.3.10 或更高版本 gcc-4.4 或更高版本
make autoconf pcre (centos系统可以执行命令:yum install pcre-devel)
Installationsmethode:
phpize #如果命令不存在 请在前面加上php的实际路径 ./configure make sudo make install
Nach Abschluss der Kompilierung benötigen Sie Um PHP zu installieren, fügen Sie die Erweiterung
extension=swoole.so
Server
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"; } }
Das obige ist der detaillierte Inhalt vonSo verwenden Sie PHP swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!