月度归档:2015年07月

while 1 比while True 更快, 只适用于python2.6

#! /usr/bin/python
# -*- coding: utf-8 -*-
 
import timeit
 
def while_one():
    i = 0
    while 1:
        i += 1
        if i == 10000000:
            break
 
def while_true():
    i = 0
    while True:
        i += 1
        if i == 10000000:
            break
 
if __name__ == "__main__":
    w1 = timeit.timeit(while_one, "from __main__ import while_one", number=3)
    wt = timeit.timeit(while_true, "from __main__ import while_true", number=3)
    print "while one: %s\nwhile_true: %s" % (w1, wt)

swoole的心跳设置

<?php

$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
    'worker_num' => 8,   //工作进程数量
    'daemonize' => false, //是否作为守护进程
    'max_connection'=>50,
    'heartbeat_check_interval' => 5, //每隔5秒做一次心跳检查
    'heartbeat_idle_time' => 6, //检查最近一次发送数据的时间和当前时间的差 大于指定的值就强制关闭
));

其中heartbeat_idle_time的默认值是heartbeat_check_interval的两倍。
在设置这两个选项后,swoole会在内部启动一个线程
每隔heartbeat_check_interval秒后遍历一次全部连接,检查最近一次发送数据的时间和当前时间的差
如果这个差值大于heartbeat_idle_time,则会强制关闭这个连接,并通过回调onClose通知Server进程。

基于swoole的socket服务器与python客户端打包解包

swoole:

$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    $head=substr($data,0,17);
    $msg=substr($data,17);
    $ar_msg=json_decode($msg,true);
    var_dump($ar_msg);
    $head_array=unpack('cHEAD_0/cHEAD_1/cHEAD_2/cHEAD_3/cProtoVersion/NServerVersion/Nsendstrlen/NcommandId',$head);
    var_dump($head_array);
    $serv->send($fd, 'Swoole11111111: '.$data);
    //$serv->close($fd);
});

python 打包:

def sendData(sendstr,commandId):
    """78,37,38,48,9,0"""
    HEAD_0 = chr(78)
    HEAD_1 = chr(37)
    HEAD_2 = chr(38)
    HEAD_3 = chr(48)
    ProtoVersion = chr(9)
    ServerVersion = 0
    sendstr = sendstr
    data = struct.pack('!sssss3I',HEAD_0,HEAD_1,HEAD_2,\
                       HEAD_3,ProtoVersion,ServerVersion,\
                       len(sendstr)+4,commandId)
    senddata = data+sendstr
    return senddata

firefly之netconnlost

首先是netserver

from net import initconfig
initconfig.loadModule()

接下来看initconfig.py中

from firefly.server.globalobject import GlobalObject
from firefly.netconnect.datapack import DataPackProtoc
def callWhenConnLost(conn):
    dynamicId = conn.transport.sessionno
    GlobalObject().remote['gate'].callRemote("netconnlost",dynamicId) #remote call netconnlost in gate server

GlobalObject().netfactory.doConnectionLost = callWhenConnLost #netlost
dataprotocl = DataPackProtoc(78,37,38,48,9,0)
GlobalObject().netfactory.setDataProtocl(dataprotocl)



def loadModule():
    import netapp
    import gatenodeapp

往下就是去gate中调用 netconnlost 自定义网络断开后要作的清理动作

@rootserviceHandle
def netconnlost(dynamicId):
    '''客户端断开连接时的处理
    @param dynamicId: int 客户端的动态ID
    '''
    vcharacter = VCharacterManager().getVCharacterByClientId(dynamicId)
    print 111111111111111111111111
    if vcharacter and vcharacter.getNode()>0:#判断是否已经登入角色
        vcharacter.lock()#锁定角色
        d = SavePlayerInfoInDB(dynamicId)#保存角色,写入角色数据
        d.addErrback(SaveDBSuccedOrError,vcharacter)#解锁角色
        d.addCallback(dropClient,dynamicId,vcharacter)#清理客户端的数据
    else:
        UsersManager().dropUserByDynamicId(dynamicId)

python下的常见两种单例

#coding:utf8

class Singleton(type):
    """Singleton Metaclass"""

    def __init__(self, name, bases, dic):
        super(Singleton, self).__init__(name, bases, dic)
        self.instance = None

    def __call__(self, *args, **kwargs):
        if self.instance is None:
            self.instance = super(Singleton, self).__call__(*args, **kwargs)
        return self.instance

class UsersManager:
    __metaclass__ = Singleton
    def __init__(self):
        print "init"
        self._users = {}

def singleton(cls, *args, **kw):
    instances = {}
    def _singleton():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return _singleton

@singleton
class adminuser:
    def __init__(self):
        print "inits"
        self._user={}


v=UsersManager()
t=UsersManager()

f=adminuser()
g=adminuser()

zend framework 添加自定义helper

首先添加helper目录

        Zend_Controller_Action_HelperBroker::addPath('../application/helpers/actions', 'Helper_');

新建helper文件

<?php

class Helper_Comm extends Zend_Controller_Action_Helper_Abstract
{

    public function abc(){
        $ff=Zend_Registry::get('abc');
        return $ff;
    }
}

action中调用:

	public function indexAction() {
        echo 123;
        Zend_Registry::set('abc','dddddddddd');
        $abc=$this->_helper->Comm->abc();
        echo $abc;
        exit;
		// action body
	}

view_helper: 添加路径

    public function testAction(){
        $this->view->addHelperPath('../application/helpers/views/', 'View_Helper_');
    }
<?php

class View_Helper_Ftest extends Zend_Controller_Action_Helper_Abstract
{
    public function ftest()
    {
        return 'lol123';
    }
}

view 调用:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
fttttttttttttttttttttttttttttttt
<?=$this->Ftest();?>
<br>
<?=$this->Gtest();?>
</body>
</html>