// 受到PHP性能限制(包括pthread自身限制以及代码加密,锁等待等问题)
// 经过测试,这个休眠时间几乎是必须的
// 要完美解决这个问题,需要使用golang
define ( 'USLEEP_TIME', 10000 );
function recv_data($socket, $length, $max_time) {
$time = microtime ( true );
$recv_length = 0;
$data = '';
$close_flag = false;
while ( microtime ( true ) - $time <= $max_time && $recv_length
if (! is_resource ( $socket ) || $close_flag) {
break;
}
$recv_length_this = socket_recv ( $socket, $temp_data, $length - $recv_length, MSG_DONTWAIT );
$recv_length += $recv_length_this;
$data .= $temp_data;
if ($recv_length_this === 0) {
$close_flag = true;
}
usleep ( USLEEP_TIME );
}
return array (
$recv_length,
$data
);
}
function data_get($sem, $shm, $index) {
$data_array = array ();
if (sem_acquire ( $sem, false )) {
$data_array = shm_get_var ( $shm, $index );
sem_release ( $sem );
}
return $data_array;
}
function data_set($sem, $shm, $index, $data) {
if (sem_acquire ( $sem, false )) {
$data_array = array ();