Contexte
PHP est utilisé dans le projet, mais en raison de la tâche longue et fastidieuse, une fois le front-end soumis, le serveur doit répondre de manière asynchrone.
Il existe de nombreuses solutions pour les serveurs asynchrones, notamment MQ, fsocket, Swoole, etc.
Swoole est écrit en langage C pur et fournit un serveur multithread asynchrone en langage PHP, un client réseau TCP/UDP asynchrone, MySQL asynchrone, Redis asynchrone, un pool de connexions à la base de données, AsyncTask, une file d'attente de messages, un minuteur en millisecondes, asynchrone. lecture et écriture de fichiers, requête DNS asynchrone. Swoole a un serveur/client Http/WebSocket intégré et un serveur Http2.0.
Le plus important est qu'il supporte parfaitement le langage PHP. J'ai donc utilisé Swoole pour créer un serveur asynchrone afin de fournir une série de tâches telles que des réponses asynchrones, des tâches push et planifiées.
Installation
Swoole est écrit en langage C et utilise la compilation et l'installation.
Les dépendances d'installation sont :
php-5.3.10 ou version supérieure
gcc-4.4 ou version supérieure
make
autoconf
pcre (le système centos peut exécuter la commande : yum install pcre-devel)
Méthode d'installation :
phpize #Si la commande n'existe pas, veuillez ajouter php dans front Le chemin réel de
./configure
make
sudo make install
Une fois la compilation terminée, vous devez ajouter l'extension
extension=swoole.soUtiliser
Serveurclass 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) { //做一些事情 }
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"; } }
'open_length_check' => true, 'package_length_type' => 'N', 'package_length_offset' => 0, //第N个字节是包长度的值 'package_body_offset' => 4, //第几个字节开始计算长度 'package_max_length' => 2000000, //协长度
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!