Readline 只會在啟動時或收到 SIGWINCH 訊號時讀取視窗大小。這表示如果在非 readline() 呼叫期間調整視窗大小,則下次呼叫會因為視窗大小的混淆而產生異常行為。
解決方法是透過發送 SIGWINCH 訊號強制 Readline 重新讀取視窗大小。這是透過非同步介面完成的,該介面會安裝訊號處理程式,但將控制權返回 PHP。
以下函式是 readline() 的替代方案,但每次都會重新讀取視窗大小
<?
function xreadline($prompt)
{
global $xreadline, $xreadline_line;
$code = '$GLOBALS["xreadline"] = false;' .
'$GLOBALS["xreadline_line"] = $line;' .
'readline_callback_handler_remove();';
$cb = create_function('$line', $code);
readline_callback_handler_install($prompt, $cb);
$signal = defined("SIGWINCH") ? SIGWINCH : 28;
posix_kill(posix_getpid(), $signal);
$xreadline = true;
while ($xreadline)
readline_callback_read_char();
return is_null($xreadline_line) ? false : $xreadline_line;
}
?>