‘ PHP’ Archives

PHP Socket实现队列

Server 端:

<?php
error_reporting (E_ALL);
set_time_limit (0);
ob_implicit_flush ();
$ip = "127.0.0.1";
$port = 12345;
$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
echo $socket ? "socket_create() successed!\n" : "socket_create() failed:".socket_strerror ($socket)."\n";
$setLinger['l_onoff'] = 1;
$setLinger['l_linger'] = 0;
$set = socket_set_option($socket,SOL_SOCKET,SO_LINGER,$setLinger);
echo $set ? "socket_set_option() successed!\n" : "socket_set_option() failed:".socket_strerror(socket_last_error())."\n";
$bind = socket_bind ($socket, $ip, $port);
echo $bind ? "socket_bind() successed!\n" : "socket_bind() failed:".socket_strerror ($bind)."\n";
$listen = socket_listen ($socket,10000);
echo $listen ? "socket_listen() successed!\n" : "socket_listen() failed:".socket_strerror ($listen)."\n";

$queue = new Queue();
while (true){
	$msg = socket_accept($socket);
	if (!$msg){
	  echo "socket_accept() failed:".socket_strerror ($msg)."\n";
	  break;
	}
	while (true){
		$command = trim(socket_read($msg,1024));
		if (!$command){
			break;
        }
		else if($command == "readnow"){
            $out = $queue->deQueue();
            if($out != ""){
				socket_write($msg,$out,strlen($out));
            }
			else{
				socket_write($msg,"NULL",strlen("NULL"));
            }
			echo 'send out!'."\n";
        }
		else{
			if($queue->enQueue($command)){
				socket_write($msg,"success",strlen("success"));
            }
			echo 'write in!'."\n";
        }
	}
	socket_close ($msg);
}
socket_close ($socket);
socket_close ($dbsocket);
class Queue{
    private $queue;
    private $front;
    private $rear;

    function Queue(){
        $this->queue[0]["content"] = "NULL";
        $this->front = 0;
        $this->rear = 0;
        return true;
    }

    function enQueue($node){
        $this->rear += 1;
        $this->queue[$this->rear]["content"] = $node;
        return true;
    }

    function deQueue(){
        if($this->front == $this->rear){
            return false;
        }else{
            $this->front += 1;
            $temp = $this->queue[$this->front]["content"];
            unset($this->queue[$this->front]);
            if($this->front == $this->rear){
                $this->front = 0;
                $this->rear = 0;
            }
            return $temp;
        }
    }
}
?>

队列写入端:

<?

    $ip = "127.0.0.1";
    $port = 12345;
    $socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
    $conn = socket_connect ($socket, $ip, $port);
    socket_write($socket,"HELLO WORLD",strlen("HELLO WORLD"));
    echo socket_read ($socket,1024);
    socket_close ($socket);

?>
队列读取端:
<?

    $ip = "127.0.0.1";
    $port = 12345;
    $socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
    $conn = socket_connect ($socket, $ip, $port);
    socket_write($socket,"readnow",strlen("readnow"));
    echo socket_read ($socket,1024);
    socket_close ($socket);

?>

要停止服务端,只用修改队列写入端,发送一个空消息就行了

PHP类的函数:__call,__callStatic基于php5.3以上

_call和___callStatic这两个函数是php类的默认函数,

__call() 在一个对象的上下文中,如果调用的方法不能访问,它将被触发

__callStatic() 在一个静态的上下文中,如果调用的方法不能访问,它将被触发


<?php
class MethodTest {
public function __call($name, $arguments
) {
// Note: value of $name is case sensitive.
echo
"Calling object method '$name' "
. implode(', ', $arguments). "\n"
;
}

/**   As of PHP 5.3.0   */
public static function __callStatic($name, $arguments
) {
// Note: value of $name is case sensitive.
echo
"Calling static method '$name' "
. implode(', ', $arguments). "\n"
;
}
}

$obj = new MethodTest;
$obj->runTest('in object context'
);

MethodTest::runTest('in static context'); // As of PHP 5.3.0
?>

运行结果:
Calling object method ‘runTest’ in object context

Calling static method 'runTest' in static context

PHP Socket编程,包括服务端和客户端

PHP使用Berkley的socket库来创建它的连接。socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。

服务器端代码:
Read More »

关于本人

本人虎子,今年24,正好本命年

分类