使用php-zookeeper等待服務器端事件小結

首先需安裝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的進程運行完了進程就結束了,而沒有表現出在等待服務器端事件,應該就是這個緣由。多線程

相關文章
相關標籤/搜索