花了1天試圖獲得工作ejabberd授權。
問題基本上出現在從標準輸入讀取時阻止進程。它在請求字符串的末尾被阻塞,直到由於超時而斷開連接。
這裏是用於非塊符號由符號從描述符讀取的溶液:
function non_block_read($fd, &$data) {
$read = array($fd);
$write = array();
$except = array();
$result = stream_select($read, $write, $except, 0);
if($result === false) {
throw new Exception('stream_select failed');
}
if($result === 0) return false;
$data.= stream_get_line($fd, 1);
return true;
}
這裏是守護程序代碼也使壽命讀取週期。
$fh = fopen("php://stdin", 'r');
$fhout = fopen("php://stdout", 'w');
$pdo = new PDO('mysql:host='.$host.';dbname='.$db, $user,$pass);
if(!$fh){
die("Cannot open STDIN\n");
}
$aStr='';
$collect=false;
do {
if (!non_block_read($fh,$aStr)) {
if (strlen($aStr) > 0) {
$toAuth = substr(trim($aStr),1);
checkAuth($toAuth,$pdo,$fhout);
$aStr='';
}
else sleep (1);
}
}
while (true);
一些解釋:checkAuth - 實現'auth'和'isuser'處理程序的任何函數。
睡眠(1) - 簡單的方法來逃避CPU負載。
第一個符號 - 服務符號,前置消息,它不同於客戶端,所以我只是把它剪掉。
這裏是答覆代碼。回覆 - true |錯誤的值。
$message = @pack("nn", 2, $result);
fwrite($stdout, $message);
flush();
享受。
我正在使用此腳本http://www.ejabberd.im/files/efiles/check_mysql.php.txt –
我作爲root用戶和ejabberd用戶從命令行手動執行腳本,它執行並且看起來不像投擲錯誤。 –