1. 程式人生 > >【swoole快速入門10】使用非同步客戶端

【swoole快速入門10】使用非同步客戶端

PHP提供的MySQLCURLRedis 等客戶端是同步的,會導致伺服器程式發生阻塞。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();
    });
});

mysqliPDO等客戶端不同,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底層目前只提供了最常用的MySQLRedisHttp非同步客戶端,如果你的應用程式中需要實現其他協議客戶端,如KafkaAMQP等協議,可以基於Swoole\Client非同步TCP客戶端,開發相關協議解析程式碼,來自行實現。