首先需安裝zookeeper的php擴展:http://pecl.php.net/package/zookeeper php
這是我最早寫的demo,都符合zookeeper的api定義及行爲定義。git
#!/usr/bin/env php <?php if (!extension_loaded('zookeeper')) { die('zookeeper is required'); } $host = 'localhost:2181'; $zk = new Zookeeper($host); $zk->get('/bar', 'cb'); while( true ) { echo '.'; sleep(2); } function cb($event, $stat, $path) { echo "in watch callback\n"; }
但當接收到服務器端的數據時,會報以下錯誤:github
PHP Warning: sleep(): could not invoke watcher callback in /Users/x/src/zoo-php/watch2.php on line 14 PHP Stack trace: PHP 1. {main}() /Users/x/src/zoo-php/watch2.php:0 PHP 2. sleep() /Users/x/src/zoo-php/watch2.php:14 Warning: sleep(): could not invoke watcher callback in /Users/x/src/zoo-php/watch2.php on line 14 Call Stack: 0.0012 227664 1. {main}() /Users/x/src/zoo-php/watch2.php:0 754.5150 228272 2. sleep() /Users/x/src/zoo-php/watch2.php:14
這樣的運行結果給我帶來苦惱,代碼應該是極簡單的,而後在網上找了不少資料及官方的文檔。找到一個能夠正確運行的用例 https://github.com/andreiz/php-zookeeper/issues/34 ,這個用例和個人demo的差異僅是watch函數一個是簡單的函數,一個是對象的方法。api
我諮詢過有經驗人士,反饋說這多是因爲zookeeper的php擴展存在BUG,建議不要去浪費時間探究。
服務器
小結一下:進程在sleep系統調用上阻塞。曾經我覺得進程在設置watcher的zookeeper的api上阻塞,如get、exists等,事實上不是。php-zookeeper擴展是使用C api封裝的,其使用的多線程模型,至於線程在何處阻塞,不瞭解。有網友反饋用於watch的進程運行完了進程就結束了,而沒有表現出在等待服務器端事件,應該就是這個緣由。多線程