花了 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”处理程序的函数。
sleep(1) - 逃避 CPU 负载的简单方法。
第一个符号 - 预先设置消息的服务符号,它因客户端而异,所以我只是剪掉它。
这是回复代码。回复 - 真 |错误的值。
$message = @pack("nn", 2, $result);
fwrite($stdout, $message);
flush();
享受吧。