【swoole快速入門10】使用非同步客戶端
阿新 • • 發佈:2018-12-10
PHP
提供的MySQL
、CURL
、Redis
等客戶端是同步的,會導致伺服器程式發生阻塞。Swoole
提供了常用的非同步客戶端元件,來解決此問題。編寫純非同步伺服器程式時,可以使用這些非同步客戶端。
非同步客戶端可以配合使用SplQueue
實現連線池,以達到長連線複用的目的。在實際專案中可以使用PHP
提供的Yield/Generator
語法實現半協程的非同步框架。也可以基於Promises
簡化非同步程式的編寫。
MySQL
$db = new Swoole\MySQL; $server = array( 'host' => '127.0.0.1', 'user' => 'test', 'password' => 'test', 'database' => 'test', ); $db->connect($server, function ($db, $result) { $db->query("show tables", function (Swoole\MySQL $db, $result) { var_dump($result); $db->close(); }); });
與mysqli
和PDO
等客戶端不同,Swoole\MySQL
是非同步非阻塞的,連線伺服器、執行SQL時,需要傳入一個回撥函式。connect
的結果不在返回值中,而是在回撥函式中。query
的結果也需要在回撥函式中進行處理。
Redis
$redis = new Swoole\Redis; $redis->connect('127.0.0.1', 6379, function ($redis, $result) { $redis->set('test_key', 'value', function ($redis, $result) { $redis->get('test_key', function ($redis, $result) { var_dump($result); }); }); });
Http
$cli = new Swoole\Http\Client('127.0.0.1', 80); $cli->setHeaders(array('User-Agent' => 'swoole-http-client')); $cli->setCookies(array('test' => 'value')); $cli->post('/dump.php', array("test" => 'abc'), function ($cli) { var_dump($cli->body); $cli->get('/index.php', function ($cli) { var_dump($cli->cookies); var_dump($cli->headers); }); });
Swoole\Http\Client
的作用與CURL
完全一致,它完整實現了Http
客戶端的相關功能。具體請參考 HttpClient文件
其他客戶端
Swoole
底層目前只提供了最常用的MySQL
、Redis
、Http
非同步客戶端,如果你的應用程式中需要實現其他協議客戶端,如Kafka
、AMQP
等協議,可以基於Swoole\Client
非同步TCP
客戶端,開發相關協議解析程式碼,來自行實現。