我與socket_select
玩,但有一個主機,這個功能確實奇怪的事情:立即socket_select立即返回false buth沒有錯誤代碼
- 的回報,而不是等待5秒
- 返回false,表示一些錯誤
- 但
socket_last_error()
返回0(成功)。
此服務器的phpinfo()
:http://jsfiddle.net/Lmrfe/embedded/result/
$server = socket_create(AF_UNIX, SOCK_STREAM, 0);
$r = socket_bind($server, '/some/file/somewhere');
$r = socket_listen($server);
// none of the above socket_* returns false
$t = microtime(true);
socket_clear_error();
$read = array($server); $write = null; $except = null;
$read = array($server); $write = array(); $except = array();
$read = array(); $write = array(); $except = array();
$read = null; $write = null; $except = null;
$changed = socket_select($read, $write, $except, 5,0);
$changed = socket_select($read, $write, $except, null);
$changed = socket_select($read, $write, $except, 5000000);
$changed = socket_select($read, $write, $except, 5000000, 0);
$changed = socket_select($read, $write, $except, 5000000, 5000000);
/* Results:
microtime(true) - $t == almost zero
$changed === false
socket_last_error() === 0
socket_strerror(socket_last_error()) === Success
$read === array(1) {
[0]=>
resource(2) of type (Socket)
}
$write === NULL
$except === NULL
*/
$s = socket_read($server, 1024, PHP_BINARY_READ);
// $s === false
發生了什麼事嗎?
更新測試腳本:仍然運行在瞬間:
header('Content-Type: text/plain; charset=utf-8');
error_reporting(-1);
for($i = 0; $i < 4; $i++){
for($j = 0; $j < 5; $j++){
echo "\n\n\n\n\n[i,j]=[{$i},{$j}]\n";
$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
var_dump('socket_create', $socket); echo "\n"; if($socket === false) continue;
$socket_file = dirname(__FILE__)."/test_socket_i{$i}_j{$j}";
if(file_exists($socket_file)) unlink($socket_file);
$r = socket_bind($socket, $socket_file);
var_dump('socket_bind', $r); echo "\n"; if($r === false) continue;
$r = socket_listen($socket);
var_dump('socket_listen', $r); echo "\n"; if($r === false) continue;
$t = microtime(true);
socket_clear_error();
if($i==0){ $read = null; $write = null; $except = null; }
if($i==1){ $read = array(); $write = array(); $except = array(); }
if($i==2){ $read = array($socket); $write = null; $except = null; }
if($i==3){ $read = array($socket); $write = array(); $except = array(); }
if($j==0){ $changed = socket_select($read, $write, $except, 5,0); } // 5 seconds
if($j==1){ $changed = socket_select($read, $write, $except, null); } // forever
if($j==2){ $changed = socket_select($read, $write, $except, 5000000); }
if($j==3){ $changed = socket_select($read, $write, $except, 5000000, 0); }
if($j==4){ $changed = socket_select($read, $write, $except, 5000000, 5000000); }
var_dump('•socket_select returned:', $changed);echo "\n";
var_dump('•$read/$write/$except:',$read,$write,$except);echo "\n";
var_dump('•error:', socket_last_error(), socket_strerror(socket_last_error()));echo "\n";
var_dump('time: ', microtime(true) - $t);echo "\n"; // almost zero
}}
您好,我究竟做如下的引用部分做例子:'$ E = NULL; socket_select($ r,$ w,$ e,0);'這是「禁止」語法我認爲:'socket_select($ r,null,null,0);' – biziclop 2013-02-14 11:07:05
雖然沒有任何答案對此有解釋錯誤,我因爲你的聲望最低而給你賞金。把它作爲一個受歡迎的禮物:) – biziclop 2013-02-18 14:55:56