‘ 学习资料’ 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

Wordpress的表情插件Custom Smilies

为了让博客更加生动,表情是不可少的,实现这个功能其实很简单,Wordpress有一个插件叫Custom Smilies。

Custom Smilies的配置:

  • 下载Custom Smilies插件,解压后,上传到plugin目录;
  • 登录后台控制面板,在plugins中找到Rustom Smilies插件,激活插件后既可使用了插件。
  • 在“Settings”中找到“Smilies”,设置插件即可。
  • 插件默认的是读取/wp-includes/images/smilies目录中的表情,如果你没有删除smilies文件夹中图片,会列出默认的几个小图标,但是wp默认的表情有点丑。
    Read More »

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

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

    服务器端代码:
    Read More »

    VPS自动备份网站到FTP服务器

    如今使用国外VPS的人越来越多了,但是网站放在国外的话数据安全是个主要的问题,冷不丁哪天就被墙了,下面是我找到的一个自动备份网站的shell脚本。(备注:shell脚本名为backup.sh,存储位置在/root下,mysql的安装目录为/usr/local/mysql,网站的根目录为/home/wwwroot)

    #!/bin/bash
    /usr/local/mysql/bin/mysqldump -u mysql用户名 -p mysql密码 mysql数据库名 > /home/wwwroot/$(date +%Y%m%d)-sqlbackup.sql
    cd /home/wwwroot/
    tar -zcvf $(date +%Y%m%d)-webbackup.tar.gz ./*
    echo "open ftp的ip地址
          user ftp用户名 ftp密码
          bin
          prompt off
          mput $(date +%Y%m%d)-webbackup.tar.gz
          printf "\n"
          close
          bye"|ftp -i -n
    rm -rf $(date +%Y%m%d)-sqlbackup.sql $(date +%Y%m%d)-webbackup.tar.gz

    将以上代码保存在/root下,然后给backup.sh添加运行权限
    chmod +x /root/backup.sh

    自动运行,我这里使用的是crontab,先设置下crontab
    crontab -e

    然后再最后添加如下一行,这里设置为每天00:05分自动运行
    05 00 * * * /root/backup.sh

    最后重启下crontab
    service crond restart

    Nginx的Rewrite重写规则

    Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:

    rewrite ^/b/(.*)\.html /play.php?video=$1 break;
    如果加上if语句,示例如下:
    if (!-f $request_filename)
    {
    rewrite ^/img/(.*)$ /site/$host/images/$1 last;
    }
    Read More »

    123
    关于本人

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

    分类