亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數(shù)據(jù)專(zhuān)欄

智能大數(shù)據(jù)搬運(yùn)工,你想要的我們都有

科技資訊

科技學(xué)院

科技百科

科技書(shū)籍

網(wǎng)站大全

軟件大全

HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我用springmvc做了文件上傳之后,發(fā)生了很奇怪的一件事 這個(gè)是我tomcat里的上傳文件目錄,可以看到這里有三張圖片,可是我在網(wǎng)頁(yè)中顯示的時(shí)候,只有一張圖片能找到,其它都404了,不知道為什么。 實(shí)在是搞不懂這是為什么
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-08-23 09:40:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> @幼兒園大班 你好,想跟你請(qǐng)教個(gè)問(wèn)題:請(qǐng)問(wèn)springmvc 知識(shí),從哪塊學(xué)習(xí)比較容易入手呢。順帶想加您一下好友,可否點(diǎn)播一下 !
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-08-17 17:59:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 請(qǐng)教一下各位Python的朋友,如何清瀏覽器緩存的問(wèn)題,請(qǐng)指教,謝謝!
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2014-07-02 09:56:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 直接上代碼: 環(huán)境:windowXP、7、10 問(wèn)題現(xiàn)象:Pyhook啟動(dòng)后,如果靜置一段時(shí)間后,大約5分鐘以上,Hook出現(xiàn)卡住現(xiàn)象,過(guò)好一會(huì)才有反應(yīng),如果不間斷有按鍵輸入的話,出現(xiàn)卡住的概率就很低。 詳情: tornado、python2.7 pyhook、 做了一個(gè)本地Python版的收銀系統(tǒng),利用 concurrent . futures . ProcessPoolExecutor 啟動(dòng)了若干個(gè)進(jìn)程,其中一個(gè)進(jìn)程為單獨(dú)跑pyhook,工作的內(nèi)容主要有: 1、監(jiān)聽(tīng)快捷鍵喚醒 2、監(jiān)聽(tīng)并過(guò)濾掃碼槍掃描到的SKU條碼,及客戶(hù)付款碼,進(jìn)而通過(guò)消息隊(duì)列將支付指令送往另外一個(gè)進(jìn)程進(jìn)行tessreact識(shí)別金額發(fā)起支付。 問(wèn)題就是:放一會(huì),TNND的hook就好似被休眠了一樣,沒(méi)反應(yīng)了,過(guò)好一會(huì)才有反應(yīng)。 鍵盤(pán)回調(diào)函數(shù)里,沒(méi)有夾雜任何耗時(shí)操作,及其他IO操作(目前已經(jīng)發(fā)現(xiàn)它會(huì)導(dǎo)致Hook直接卡死)。 哪位大神幫忙分析分析! 部分代碼如下: tornado 主函數(shù): with concurrent . futures . ProcessPoolExecutor ( max_workers = max_workers ) as executor : ''' 啟動(dòng)鍵盤(pán)監(jiān)聽(tīng) ''' executor . submit ( run_listen ) ''' 啟動(dòng)主程序 ''' executor . submit ( run_main ) ''' 啟動(dòng)定時(shí)任務(wù) ''' executor . submit ( run_schedule ) if str ( util . get_conf ( 'keyboard' , 'ocr' ))== '1' or str ( util . get_conf ( 'keyboard' , 'ocr_manual' ))== '1' : ''' 啟動(dòng) OCR''' executor . submit ( run_ocr ) if str ( util . get_conf ( 'keyboard' , 'ocr' )) == '1' : ''' 啟動(dòng)懸浮框 ''' executor . submit ( run_titleWins ) run_listen()函數(shù)內(nèi)容: def main (): print ( 'KeyBoard Listen Start.' ) hm = pyHook . HookManager () hm . KeyDown = onKeyboardEvent hm . HookKeyboard () pythoncom . PumpMessages ()
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2018-09-28 08:52:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我看 Gunicorn 是可以提供類(lèi)型位 tornado 的 worker_class 的。 但二者到底是有什么區(qū)別和聯(lián)系嗎? 不都是用來(lái)跑 Python 的服務(wù)器嗎?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-03-17 09:57:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 直接上示例: flask應(yīng)用代碼如下: flask_app.py from flask import Flask import time app = Flask(__name__) @app.route('/') def hello_world(): result = bingloop (10000000) return result @app.route('/a') def hi_world(): return "hi,world" def bigloop (number): for i in range(0,number): print i return "done" if __name__ == '__main__': app.run(host='0.0.0.0',debug=True) tornado代碼如下: from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from flask_app import app http_server = HTTPServer(WSGIContainer(app)) http_server.listen( 5000 ) IOLoop.instance().start() 然后在瀏覽器中訪問(wèn)0.0.0.0:5000/會(huì)卡住, 這時(shí)再打開(kāi)一個(gè)瀏覽器窗口訪問(wèn)0.0.0.0:5000/a,按理說(shuō)多線程不是應(yīng)該直接返回hi,world嗎? 但是會(huì)一直卡住等到上一個(gè)請(qǐng)求結(jié)束后,才會(huì)返回。 tornado該如何使用來(lái)支持flask應(yīng)用多線程處理呢?好疑惑
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-02-20 14:15:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 使用Tornado工具在線調(diào)試工程,無(wú)法設(shè)置斷點(diǎn),設(shè)置斷點(diǎn)時(shí),彈出對(duì)話框如下所示 確定后,彈出下面的對(duì)話框
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-10-24 13:09:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 第一部分:安裝必要工具。 1.因?yàn)檫@是部署Python開(kāi)發(fā)環(huán)境,所以安裝pip可以簡(jiǎn)化一些軟件的安裝過(guò)程。(PIP對(duì)應(yīng)Lua的luarocks) sudo apt-get install python-pip 安裝三個(gè)Python框架 sudo pip install flask sudo pip install django==1.5.1 sudo pip install tornado==3.1.1 2.安裝Gunicorn,這是運(yùn)行Python的WSGI HTTP服務(wù)。sudo pip install gunicorn 3.Virtualenv, 安裝這個(gè)是因?yàn)?,在部署Django的時(shí)候,使用了不同的版本。 sudo pip install virtualenv 第二部分:創(chuàng)建部署應(yīng)用。 1.創(chuàng)建一個(gè)WSGI類(lèi)型的Tornado應(yīng)用。 import tornado.web import tornado.wsgi class MainHandler(tornado.web.RequestHandler): def get(self): self.write("My source code in the MoPaas server by python Tornado!") settings = { "debug" : True, "static_path": "static", } ##### urls = [ (r"/", MainHandler), ] app = tornado.wsgi.WSGIApplication(urls, **settings) 啟動(dòng)這個(gè)服務(wù):gunicorn -w 4 torapp:app -b 0.0.0.0:8888 2.創(chuàng)建一個(gè)Flask應(yīng)用。from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "My source code in the MoPaas server by python Tornado!" if __name__ == "__main__": app.run() 啟動(dòng)這個(gè)服務(wù):gunicorn -w 4 server:app -b 0.0.0.0:8888 3.創(chuàng)建Django應(yīng)用。 Django是一個(gè)比較大的WEB應(yīng)用,創(chuàng)建各部署的過(guò)程,稍微復(fù)雜一些。 創(chuàng)建工程 django-admin.py startproject hotdoc 創(chuàng)建應(yīng)用 python manage.py startapp verp 創(chuàng)建數(shù)據(jù)庫(kù)表 python manage.py syncdb 啟動(dòng)工程 gunicorn hotdoc.wsgi:application -b 0.0.0.0:8888 需要在修改工程目錄下的settings.py 在INSTALLED_APPS中加入, verup和gunicorn: INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'verup', 'gunicorn' ) 以上,本地開(kāi)發(fā)環(huán)境是沒(méi)問(wèn)題的。 這些步驟也可以用virtualenv新創(chuàng)建一個(gè)虛擬環(huán)境完成,本地創(chuàng)建virtualenv可以 目前在WEB IDE上沒(méi)有測(cè)試通過(guò),理論上說(shuō),如果coding的WEB IDE是基于Docker 的,virtualevn也應(yīng)該好用。 mkdir ~/environments/ virtualenv ~/environments/tutorial/ cd ~/environments/tutorial/bin source bin/activate 目前的Paas平臺(tái)上的Python服務(wù)就是WSGI形式的應(yīng)用,比如SAE和Mopaas, 不同的是,在SAE上有些現(xiàn)成的例子。Mopaas需要自己從頭寫(xiě),這三個(gè)例子 在Mopaas生產(chǎn)環(huán)境下都運(yùn)行測(cè)試通過(guò)。在coding.net的WEB IDE也可成功運(yùn) 行。 作者:糖果 PS:轉(zhuǎn)載到其它平臺(tái)請(qǐng)注明作者姓名及原文鏈接。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-09-09 10:28:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> tornado的static_url函數(shù)說(shuō)明如下: static_url函數(shù)創(chuàng)建了一個(gè)基于文件內(nèi)容的hash值,并將其添加到URL末尾(查詢(xún)字符串的參數(shù)v) 在模塊文件中設(shè)置:{{ static_url("img/captcha.png") }} 可以在瀏覽頁(yè)面查看源碼時(shí)看到類(lèi)似:/static/img/captcha.png?v=fab8d818a22a90d8ff6136a9dc60ba17這樣的結(jié)果 開(kāi)發(fā)環(huán)境是Ubuntu,已經(jīng)實(shí)現(xiàn)相關(guān)功能。刷新頁(yè)面時(shí),v后面的hash值會(huì)改變。 生產(chǎn)環(huán)境是Centos,部署上去時(shí),卻發(fā)現(xiàn)刷新頁(yè)面,v值不變。 用了nginx做反向代理,配置稍有不同,但都沒(méi)在nginx設(shè)置靜態(tài)文件路徑。其他環(huán)境一致,找了很久也不知道是什么問(wèn)題。 小白一枚,求指教排查static_url函數(shù)失效原因的思路。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-05-11 21:44:00
假設(shè)我的數(shù)據(jù)模型: class Book(Model): id = PrimaryKeyField() title = CharField(max_length=64, unique=True) author = CharField(max_length=64) publisher = CharField(max_length=64) price = DecimalField(max_digits=10, decimal_places=2) desc = CharField(max_length=256) 如果我要根據(jù)條件更新的話, 找了很多文檔基本都是: Book.update({Book.price: 29.9}).where(Book.author == '魯迅') 但外部調(diào)用的話只能提供字段名比如 {'price': 29.9}, {'author': '魯迅'}, 怎樣才能拼出上邊的語(yǔ)句?
來(lái)源:V2EX
發(fā)布時(shí)間:2020-08-27 15:32:28
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> echo hello 性能壓測(cè)abtest tornado 4kqps nginx+tornado 9kqps nginx+uwsgi 8kqps (注意:沒(méi)說(shuō)比nginx快,只是這幾個(gè)web框架不行) 本server 3.2w qps 沒(méi)用任何python加速 不相信的可以自己壓測(cè)下哦 什么都不說(shuō)400行代碼加使用例子,歡迎吐槽,歡迎加好友一起進(jìn)步 server.py #!/usr/bin/python #-*- coding:utf-8 -*- # Copyright (c) 2012, Baidu.com Inc. # # Author : hemingzhe <512284622@qq.com>; xiaorixin # Date : Dec 20, 2012 # import socket, logging import select, errno import os import sys import traceback import Queue import threading import time import thread import cgi from cgi import parse_qs import json import imp from sendfile import sendfile from os.path import join, getsize import md5 import gzip from StringIO import StringIO from BaseHTTPServer import BaseHTTPRequestHandler import re logger = logging.getLogger("network-server") action_dic = {} action_time = {} static_file_dir = "static" static_dir = "/%s/" % static_file_dir cache_static_dir = "cache_%s" % static_file_dir if not os.path.exists(cache_static_dir): os.makedirs(cache_static_dir) filedic = {"HTM":None,"HTML":None,"CSS":None,"JS":None,"TXT":None} def getTraceStackMsg(): tb = sys.exc_info()[2] msg = '' for i in traceback.format_tb(tb): msg += i return msg def md5sum(fobj): m = md5.new() while True: d = fobj.read(65536) if not d: break m.update(d) return m.hexdigest() class QuickHTTPRequest(): def __init__(self, data): headend = data.find("\r\n\r\n") rfile = "" if headend > 0: rfile = data[headend+4:] headlist = data[0:headend].split("\r\n") else: headlist = data.split("\r\n") self.rfile = StringIO(rfile) first_line = headlist.pop(0) self.command, self.path, self.http_version = re.split('\s+', first_line) indexlist = self.path.split('?') indexlist = indexlist[0].split('/') while len(indexlist) != 0: self.index = indexlist.pop() if self.index == "": continue else: self.action,self.method = os.path.splitext(self.index) self.method = self.method.replace('.', '') break self.headers = {} for item in headlist: if item.strip() == "": continue segindex = item.find(":") if segindex < 0: continue key = item[0:segindex].strip() value = item[segindex+1:].strip() self.headers[key] = value c_low = self.command.lower() self.getdic = {} self.form = {} self.postdic = {} if c_low == "get" and "?" in self.path: self.getdic = parse_qs(self.path.split("?").pop()) elif c_low == "post" and self.headers.get('Content-Type',"").find("boundary") > 0: self.form = cgi.FieldStorage(fp=self.rfile,headers=None, environ={'REQUEST_METHOD':self.command,'CONTENT_TYPE':self.headers['Content-Type'],}) if self.form == None: self.form = {} elif c_low == "post": self.postdic = parse_qs(rfile) def sendfilejob(request, data, epoll_fd, fd): #print request.path,"3:",time.time() try: base_filename = request.path[request.path.find(static_dir)+1:] cache_filename = "./cache_"+base_filename filename = "./"+base_filename if not os.path.exists(filename): raise Exception("file not found") name,ext = os.path.splitext(filename) ext = ext.replace('.', '') iszip = False etag = request.headers.get("If-Modified-Since", None) #filemd5 = md5sum(file(filename)) filemd5 = str(os.path.getmtime(filename)) if ext.upper() in filedic: if not os.path.exists(cache_filename) or (etag != None and etag != filemd5): d,f = os.path.split(cache_filename) try: if not os.path.exists(d): os.makedirs(d) f_out = gzip.open(cache_filename, 'wb') f_out.write(open(filename).read()) f_out.close() except Exception, e: print str(e) pass filename = cache_filename iszip = True sock = data["connections"] #sock.setblocking(1) if etag == filemd5: #sock.send("HTTP/1.1 304 Not Modified\r\nLast-Modified: %s\r\n\r\n" % filemd5) data["writedata"] = "HTTP/1.1 304 Not Modified\r\nLast-Modified: %s\r\n\r\n" % filemd5 else: data["sendfile"] = True sock.setblocking(1) offset = 0 filesize = os.path.getsize(filename) f = open(filename, "rb") if iszip: headstr = "HTTP/1.0 200 OK\r\nContent-Length: %s\r\nLast-Modified: %s\r\nContent-Encoding: gzip\r\n\r\n" % (filesize,filemd5) else: headstr = "HTTP/1.0 200 OK\r\nContent-Length: %s\r\nLast-Modified: %s\r\n\r\n" % (filesize,filemd5) sock.send(headstr) while True: sent = sendfile(sock.fileno(), f.fileno(), offset, 65536) if sent == 0: break # EOF offset += sent f.close() data["writedata"] = "" data["sendfile"] = False #print request.path,"4:",time.time() except Exception, e: data["sendfile"] = False #data["writedata"] = str(e)+getTraceStackMsg() data["writedata"] = "file not found" pass try: data["readdata"] = "" epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT | select.EPOLLERR | select.EPOLLHUP) except Exception, e: print str(e)+getTraceStackMsg() class Worker(object): def __init__(self): pass def process(self, data, epoll_fd, fd): res = "" add_head = "" try: request = QuickHTTPRequest(data["readdata"]) except Exception, e: #return "http parser error:"+str(e)+getTraceStackMsg() res = "http format error" try: headers = {} headers["Content-Type"] = "text/html;charset=utf-8" if request.path == "/favicon.ico": request.path = "/"+static_file_dir+request.path if static_dir in request.path or "favicon.ico" in request.path: thread.start_new_thread(sendfilejob, (request,data,epoll_fd,fd)) #sendfilejob(request,data,epoll_fd,fd) return None action = action_dic.get(request.action, None) if action == None: action = __import__(request.action) mtime = os.path.getmtime("./%s.py" % request.action) action_time[request.action] = mtime action_dic[request.action] = action else: load_time = action_time[request.action] mtime = os.path.getmtime("./%s.py" % request.action) if mtime>load_time: action = reload(sys.modules[request.action]) action_time[request.action] = mtime action_dic[request.action] = action method = getattr(action, request.method) res = method(request, headers) if headers.get("Connection","") != "close": data["keepalive"] = True res_len = len(res) headers["Content-Length"] = res_len for key in headers: add_head += "%s: %s\r\n" % (key, headers[key]) except Exception, e: #res = str(e)+getTraceStackMsg() res = "page no found" try: data["writedata"] = "HTTP/1.1 200 OK\r\n%s\r\n%s" % (add_head, res) data["readdata"] = "" epoll_fd.modify(fd, select.EPOLLET | select.EPOLLOUT | select.EPOLLERR | select.EPOLLHUP) except Exception, e: print str(e)+getTraceStackMsg() def InitLog(): logger.setLevel(logging.DEBUG) fh = logging.FileHandler("network-server.log") fh.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.ERROR) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(fh) logger.addHandler(ch) class MyThread(threading.Thread): ind = 0 def __init__(self, threadCondition, shareObject, **kwargs): threading.Thread.__init__(self, kwargs=kwargs) self.threadCondition = threadCondition self.shareObject = shareObject self.setDaemon(True) self.worker = Worker() def processer(self, args, kwargs): try: param = args[0] epoll_fd = args[1] fd = args[2] self.worker.process(param, epoll_fd, fd) except: print "job error:" + getTraceStackMsg() def run(self): while True: try: args, kwargs = self.shareObject.get() self.processer(args, kwargs) except Queue.Empty: continue except : print "thread error:" + getTraceStackMsg() class ThreadPool: def __init__( self, num_of_threads=10): self.threadCondition=threading.Condition() self.shareObject=Queue.Queue() self.threads = [] self.__createThreadPool( num_of_threads ) def __createThreadPool( self, num_of_threads ): for i in range( num_of_threads ): thread = MyThread( self.threadCondition, self.shareObject) self.threads.append(thread) def start(self): for thread in self.threads: thread.start() def add_job( self, *args, **kwargs ): self.shareObject.put( (args,kwargs) ) def run_main(listen_fd): try: epoll_fd = select.epoll() epoll_fd.register(listen_fd.fileno(), select.EPOLLIN | select.EPOLLET | select.EPOLLERR | select.EPOLLHUP) except select.error, msg: logger.error(msg) tp = ThreadPool(16) tp.start() params = {} def clearfd(fd): epoll_fd.unregister(fd) params[fd]["connections"].close() del params[fd] last_min_time = -1 while True: epoll_list = epoll_fd.poll() for fd, events in epoll_list: cur_time = time.time() if fd == listen_fd.fileno(): while True: try: conn, addr = listen_fd.accept() #print "accept",time.time(),conn.fileno() conn.setblocking(0) epoll_fd.register(conn.fileno(), select.EPOLLIN | select.EPOLLET | select.EPOLLERR | select.EPOLLHUP) conn.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #conn.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True) params[conn.fileno()] = {"addr":addr,"writelen":0, "connections":conn, "time":cur_time} except socket.error, msg: break elif select.EPOLLIN & events: #print "read",time.time() param = params[fd] param["time"] = cur_time datas = param.get("readdata","") cur_sock = params[fd]["connections"] while True: try: data = cur_sock.recv(102400) if not data: clearfd(fd) break else: datas += data except socket.error, msg: if msg.errno == errno.EAGAIN: #logger.debug("%s receive %s" % (fd, datas)) param["readdata"] = datas len_s = -1 len_e = -1 contentlen = -1 headlen = -1 len_s = datas.find("Content-Length:") if len_s > 0: len_e = datas.find("\r\n", len_s) if len_s > 0 and len_e > 0 and len_e > len_s+15: len_str = datas[len_s+15:len_e].strip() if len_str.isdigit(): contentlen = int(datas[len_s+15:len_e].strip()) headend = datas.find("\r\n\r\n") if headend > 0: headlen = headend + 4 data_len = len(datas) if (contentlen > 0 and headlen > 0 and (contentlen + headlen) == data_len) or \ (contentlen == -1 and headlen == data_len): tp.add_job(param,epoll_fd,fd) #print "1:",time.time() #thread.start_new_thread(process, (param,epoll_fd,fd)) break else: clearfd(fd) logger.error(msg) break elif select.EPOLLHUP & events or select.EPOLLERR & events: clearfd(fd) logger.error("sock: %s error" % fd) elif select.EPOLLOUT & events: #print "write",time.time() param = params[fd] param["time"] = cur_time sendLen = param.get("writelen",0) writedata = param.get("writedata", "") total_write_len = len(writedata) cur_sock = params[fd]["connections"] if writedata == "": clearfd(fd) continue while True: try: sendLen += cur_sock.send(writedata[sendLen:]) if sendLen == total_write_len: if param.get("keepalive", True): param["readdata"] = "" param["writedata"] = "" param["writelen"] = 0 epoll_fd.modify(fd, select.EPOLLET | select.EPOLLIN | select.EPOLLERR | select.EPOLLHUP) else: clearfd(fd) break except socket.error, msg: if msg.errno == errno.EAGAIN: param["writelen"] = sendLen break else: continue #check time out if cur_time - last_min_time > 10: last_min_time = cur_time objs = params.items() for (key_fd,value) in objs: fd_time = value.get("time", 0) del_time = cur_time - fd_time if del_time > 10: sendfile = value.get("sendfile", False) if sendfile != True: clearfd(key_fd) elif fd_time < last_min_time: last_min_time = fd_time if __name__ == "__main__": InitLog() port = int(sys.argv[1]) try: listen_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) except socket.error, msg: logger.error("create socket failed") try: listen_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except socket.error, msg: logger.error("setsocketopt SO_REUSEADDR failed") try: listen_fd.bind(('', port)) except socket.error, msg: logger.error("bind failed") try: listen_fd.listen(1024) listen_fd.setblocking(0) except socket.error, msg: logger.error(msg) child_num = 8 c = 0 while c < child_num: c = c + 1 newpid = os.fork() if newpid == 0: run_main(listen_fd) run_main(listen_fd) 用戶(hù)文檔: 1、啟動(dòng): 指定監(jiān)聽(tīng)端口即可啟動(dòng) python server.py 8992 2、快速編寫(xiě)cgi,支持運(yùn)行時(shí)修改,無(wú)需重啟server 在PySvr.py同一目錄下 隨便建一個(gè)python 文件 例如: example.py 定義一個(gè)tt函數(shù): 則請(qǐng)求該函數(shù)的url為 http://ip:port/example.tt 修改后保存,即可訪問(wèn),無(wú)需重啟 example.py def tt(request,response_head): #print request.form #print request.getdic #print request.postdic return "ccb"+request.path 函數(shù)必須帶兩個(gè)參數(shù) request:表示請(qǐng)求的數(shù)據(jù) 默認(rèn)帶以下屬性 headers: 頭部 (字典) form: multipart/form表單 (字典) getdic: url參數(shù) (字典) postdic: httpbody參數(shù) (字典) rfile: 原始http content內(nèi)容 (字符串) action: python文件名 (這里為example) method: 函數(shù)方法 (這里為tt) command: (get or post) path: url (字符串) http_version: http版本號(hào) (http 1.1) response_head: 表示response內(nèi)容的頭部 例如如果要返回用gzip壓縮 則增加頭部 response_head["Content-Encoding"] = "gzip" 3、下載文件 默認(rèn)靜態(tài)文件放在static文件夾下 例如把a(bǔ).jpg放到static文件夾下 訪問(wèn)的url為 http://ip:port/static/a.jpg 支持etag 客戶(hù)端緩存功能 支持range 支持?jǐn)帱c(diǎn)續(xù)傳 (server 使用sendfile進(jìn)行文件發(fā)送,不占內(nèi)存且快速) 4、支持網(wǎng)頁(yè)模板編寫(xiě) 創(chuàng)建一個(gè)模板 template.html $title $contents 則對(duì)應(yīng)的函數(shù): def template(request,response_head): t = Template(file="template.html") t.title = "my title" t.contents = "my contents" return str(t) 模板實(shí)現(xiàn)使用了python最快速Cheetah開(kāi)源模板, 性能約為webpy django thinkphp等模板的10倍以上: http://my.oschina.net/whp/blog/112296 example.py import os import imp import sys import time import gzip from StringIO import StringIO from Cheetah.Template import Template def tt(request,response_head): #print request.form #print request.getdic #print request.postdic return "ccb"+request.path def getdata(request,response_head): f=open("a.txt") content = f.read() f.close() response_head["Content-Encoding"] = "gzip" return content def template(request,response_head): t = Template(file="template.html") t.title = "my title" t.contents = "my contents" response_head["Content-Encoding"] = "gzip" return str(t) 安裝 如果需要使用web模板功能這里需要安裝Cheetah 附件中有安裝腳本
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2014-05-09 14:00:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 項(xiàng)目主要實(shí)現(xiàn)一個(gè)腳本啟動(dòng)即可當(dāng)web服務(wù)器使用,目前封裝web服務(wù)器常用功能。 歡迎加群一起學(xué)習(xí)進(jìn)步: 339711102 (it民工群) 項(xiàng)目代碼 https://git.oschina.net/feimat/fastpy 本項(xiàng)目盡量少使用語(yǔ)言原生庫(kù),期望網(wǎng)友一起開(kāi)發(fā)不同語(yǔ)言版本 第一步: 首先要有個(gè)處理網(wǎng)絡(luò)異步io的模塊 這一步相信大部分做后臺(tái)開(kāi)發(fā)的程序員都做過(guò),模式大同小異,處理流程如下 第二步: 支持多平臺(tái) 第一步中的 epoll_fd用一個(gè)跨平臺(tái)的事件通知類(lèi)ev_fd代替 Linux unix可使用epoll,win使用Select,freebsd使用kqueue 這里拿epoll舉例 類(lèi)提供poll、register、unregi、modify函數(shù) 事件類(lèi)型統(tǒng)一為EV_DIS、EV_IN、EV_OUT 第三步:http分包 對(duì)第一步中的3,tcp收到包后,由于是粘包的,需要進(jìn)行http分包 服務(wù)器可以不考慮chunk模式,根據(jù)content-lenth來(lái)進(jìn)行分包即可 第四步: http解析 拆分出一個(gè)完整的http包后接著就要解析這個(gè)http 這里其實(shí)可以使用python原生http解析類(lèi),不過(guò)為了以后擴(kuò)展語(yǔ)言,自己再封裝而且速度比原生快 對(duì)于k=v&k2=v2類(lèi)似的內(nèi)容通過(guò)&、=號(hào)分割解析 對(duì)multipart格式的帶文件form內(nèi)容用boundary分割解析 解析后存放到: headers: 頭部 (字典) form: post參數(shù),包括form表單 (字典) getdic: url參數(shù) (字典) filedic: form表單中文件 (字典) rfile: 原始http content內(nèi)容 (字符串) action: url/最后一個(gè)單詞 command: (get or post or put or delete) path: url (字符串) http_version: http版本號(hào) (http 1.1) 第五步:支持大文件上傳 如果用戶(hù)是上傳大文件幾百M(fèi)甚至幾G怎么辦,socket收到的數(shù)據(jù),要落地磁盤(pán)緩存 然后解析時(shí),使用boundary分割并用文件句柄指向內(nèi)容的開(kāi)頭即可,不需讀進(jìn)內(nèi)存,使用時(shí)再讀 另外每次當(dāng)前socket關(guān)閉時(shí)要?jiǎng)h除之前緩存文件,節(jié)省磁盤(pán). 第六步:支持靜態(tài)文件下載 一般靜態(tài)文件下載都是使用sendfile系統(tǒng)調(diào)用實(shí)現(xiàn),這樣減少內(nèi)存拷貝(sendfile是磁盤(pán)直接到socket緩沖區(qū),調(diào)用send的話,用戶(hù)程序還要從磁盤(pán)read到內(nèi)存,多了一次拷貝) 然而 1、考慮到以后擴(kuò)展語(yǔ)言有些不支持sendfile,python 3.5之后才支持sendfile系統(tǒng)調(diào)用,網(wǎng)上開(kāi)源的sendfile功能不全,不支持自己控制每次send大小 2、另外實(shí)際上下載文件的瓶頸在網(wǎng)絡(luò)上,多一次內(nèi)存拷貝性能也不會(huì)有很大下降 3、對(duì)于頻繁下載的文件加速,還得加載進(jìn)內(nèi)存緩存和壓縮 這里我們直接使用send支持靜態(tài)文件下載。 每次讀100k去send,send完了再讀。直到egain或全部發(fā)送完。 第七步:支持Gzip壓縮、Etag客戶(hù)端緩存、斷點(diǎn)續(xù)傳等小功能 Web服務(wù)器有好多小功能,這里不會(huì)全部覆蓋,挑選了幾個(gè)必須用到的功能舉例 1、Gzip壓縮 對(duì)于指定類(lèi)型的文件或者h(yuǎn)ttp 頭部指定要gzip壓縮的返回結(jié)果使用gzip壓縮 2、etag客戶(hù)端緩存 last-modified檢測(cè) 檢查緩存有 時(shí)間戳 last-modified 服務(wù)器返回的最后修改時(shí)間 last-modified 客戶(hù)端請(qǐng)求到的上次修改時(shí)間 文件hash Etag 服務(wù)器返回文件hash If-none-match 客戶(hù)端請(qǐng)求到的上次文件hash 如果以上兩對(duì)都為發(fā)生改變 則返回304 not modified 對(duì)于etag由于計(jì)算hash較慢,在只有修改時(shí)間戳不一致的條件后再計(jì)算文件hash 然后計(jì)算hash還有好多優(yōu)化方法 例如分塊計(jì)算hash遇到不一致馬上返回,用修改后的時(shí)間戳做etag。 3、斷點(diǎn)續(xù)傳。就是http頭帶range:byte=100-499指定要下載文件哪部分,然后 HTTP/1.1 206 Partial Content Content-Range: bytes 100-499/102400 返回那部分內(nèi)容和總大小給客戶(hù)端即可 第八步:支持http/https正向代理 大家應(yīng)該會(huì)有時(shí)需要搭建Squid或apache翻墻看看新聞或者下...此處省略若干字,因?yàn)閚ginx不支持正向https代理,squid安裝又比較麻煩,這里直接提供幾十行腳本快速編寫(xiě)自己的http/https正向代理 代理原理很簡(jiǎn)單 1、如果是http,在代理進(jìn)程proxy里,使用http頭部的host(真實(shí)遠(yuǎn)程服務(wù)端)的地址建立個(gè)socket連接,然后把proxy recv到的數(shù)據(jù)send給遠(yuǎn)端,再把從遠(yuǎn)端recv到的數(shù)據(jù)send回client即可 2、如果是https,client會(huì)發(fā)來(lái) CONNECT XXX HTTP1.1 HOST XXX:443 格式的內(nèi)容包,我們?nèi)〉絟ost然后創(chuàng)建socket連接,然后返回給client HTTP/1.1 200 Connection Established,然后就和http一樣的流程繼續(xù)走了 這里要注意的是connect是阻塞的,proxy需要使用多線程或起協(xié)程來(lái)connect呦 另外如果接受完數(shù)據(jù)遠(yuǎn)程服務(wù)器關(guān)閉proxy要記得等數(shù)據(jù)發(fā)送給client成功再關(guān)閉呦 第九步: 支持cgi編寫(xiě)和運(yùn)行時(shí)更新 上面完成了支持靜態(tài)服務(wù)器常用功能,下面提供支持動(dòng)態(tài)cgi編寫(xiě)功能。這個(gè)實(shí)現(xiàn)方式太多了,這里就是簡(jiǎn)單的把解析后的http內(nèi)容扔到多線程或協(xié)程然后去加載腳本來(lái)執(zhí)行即可。 運(yùn)行時(shí)加載就是每收到一個(gè)請(qǐng)求要查看下py腳本的修改時(shí)間有沒(méi)和內(nèi)存中的一樣,不一樣就重新加載 Python動(dòng)態(tài)加載腳本 到此一個(gè)簡(jiǎn)單的web服務(wù)器和webcgi框架就寫(xiě)完了,不到800行的一個(gè)腳本fastpy.py,啟動(dòng)就能使用: 1、啟動(dòng): 指定監(jiān)聽(tīng)端口即可啟動(dòng) ,可在linux win freebsd使用 python fastpy.py 8998 2、編寫(xiě)cgi (默認(rèn)多線程模式,安裝gevent后自動(dòng)切換為協(xié)程模式) 在fastpy.py同一目錄下 隨便建一個(gè)python 文件 例如: example.py: #定義一個(gè)同名example類(lèi) #定義一個(gè)test函數(shù): FastpyAutoUpdate=True #表示支不支持動(dòng)態(tài)更新 class example(): def test(self, request, response_head): #print request.form #print request.getdic #fileitem = request.filedic["upload_file"] #fileitem.filename #fileitem.file.read() request.ret(200,"ccb"+request.path) 則訪問(wèn)該函數(shù)的url為 http://ip:port/example.test test函數(shù)必須帶兩個(gè)參數(shù) request:表示請(qǐng)求的數(shù)據(jù) 默認(rèn)帶以下屬性 headers: 頭部 (字典) form: post參數(shù),包括form表單 (字典) getdic: url參數(shù) (字典) filedic: form表單中文件 (字典) rfile: 原始http content內(nèi)容 (字符串) action: python文件名 (這里為example) method: 函數(shù)方法 (這里為tt) command: (get or post or put or delete or head...) path: url (字符串) http_version: http版本號(hào) (http 1.1) response_head: 表示response內(nèi)容的頭部 例如如果要返回用gzip壓縮 則增加頭部 response_head["Content-Encoding"] = "gzip" 3、靜態(tài)文件下載 虛擬目錄默認(rèn)放在fastpy同目錄的static目錄下 訪問(wèn) http://ip:port/static/ 即可查看該文件夾 4、使用正向代理功能 python proxy.py 8997 指定端口啟動(dòng)后,瀏覽器配置使用即可 歡迎加群一起學(xué)習(xí)進(jìn)步: 339711102 (it民工群) 項(xiàng)目代碼 https://git.oschina.net/feimat/fastpy
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-03-02 10:58:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 因?yàn)樵朴?jì)算業(yè)務(wù)需求,需要搞一個(gè)瀏覽器上使用linux 終端的需求,于是花一天時(shí)間寫(xiě)了一個(gè)雛形,由于不善于寫(xiě)前段加最近比較忙,前段下周末再美化,歡迎大家拍磚 地址: https://github.com/xsank/webssh 原理: 由于模擬終端,所以對(duì)于類(lèi)似top的命令會(huì)有服務(wù)器主動(dòng)推送的情況,這里使用了tornado的websocket功能 而由于ssh連接需求,這里使用了paramiko第三方ssh庫(kù),所以在程序跑起來(lái)的時(shí)候,功能更像是一個(gè)代理 前段終端界面模擬使用了term.js,這真心省了好多事啊,否則你會(huì)看到一大堆[10m; [34m之類(lèi)的東東 圖片演示:
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-09-14 19:59:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我的程序是個(gè)自動(dòng)化程序,會(huì)在運(yùn)行過(guò)程當(dāng)中檢查用戶(hù)是不是進(jìn)行了某個(gè)配置操作,如果沒(méi)有則后臺(tái)程序自動(dòng)去修改xml配置文件完成自動(dòng)配置。 因?yàn)槠脚_(tái)是多用戶(hù)操作,所以我必須保證如果有多個(gè)用戶(hù)都修改這個(gè)配置文件時(shí),只能有一個(gè)用戶(hù)操作,其他用戶(hù)等待。 請(qǐng)問(wèn),這個(gè)同步鎖該怎么加,我想加在修改配置文件的方法上,我用的是django1.6.11進(jìn)行開(kāi)發(fā),使用tornado4.1.x服務(wù)器進(jìn)行部署,使用frigga守護(hù)進(jìn)程來(lái)管理tornado服務(wù)器的運(yùn)行狀態(tài)。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-03-07 10:33:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我查閱了 官方文檔 ,默認(rèn)格式是 %(color)s[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]%(end_color)s %(message)s', datefmt='%y%m%d %H:%M:%S 如果我想修改這個(gè)格式(比如修改時(shí)間顯示,增加其他的信息),應(yīng)該怎么做呢?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-12-15 09:57:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 想要在tornado項(xiàng)目中實(shí)現(xiàn)mysql 異步,找了幾個(gè)mysql異步的庫(kù),本來(lái)使用ORM peewee 和pymyql 實(shí)現(xiàn)mysq操作,但是是同步的,現(xiàn)在想要使用異步的mysql庫(kù)(tornado_mysql) 不知道有沒(méi)有高人用過(guò)?請(qǐng)教一下該如何實(shí)現(xiàn)? 想要保留peewee,想實(shí)現(xiàn)peewee與tornado_mysql(異步mysql 庫(kù)) 整合。 如果不用peewee 項(xiàng)目很多部分就要重寫(xiě)了。。各位大俠求幫助。。。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-08-28 14:34:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 留言板 Python Web框架Tornado入門(mén)練習(xí)小項(xiàng)目:留言板 項(xiàng)目地址:https://github.com/su-kaiyao/mes-board 望支持,給我的Github項(xiàng)目一個(gè)star 已經(jīng)實(shí)現(xiàn)的功能: 用戶(hù)的注冊(cè)與登錄,包括昵稱(chēng),密碼等合法性要求的檢查 主要功能:用戶(hù)登錄后,進(jìn)行留言 用戶(hù)留言信息的顯示:用戶(hù)名,客戶(hù)端ip,留言?xún)?nèi)容,留言時(shí)間 回復(fù)功能 留言數(shù)量過(guò)多,會(huì)自動(dòng)分頁(yè)顯示功能 儀表盤(pán),統(tǒng)計(jì)站點(diǎn)用戶(hù)數(shù)量和留言數(shù)量 站點(diǎn)展示: 站點(diǎn)后臺(tái)采用tornado,前臺(tái)采用Amazon UI,數(shù)據(jù)庫(kù)采用MongoDB 待完成: 用戶(hù)自定義頭像功能 A回復(fù)B的留言,加入提醒功能(站點(diǎn)提醒+郵件提醒) 未完待續(xù)... 代碼是趕出來(lái)的,出錯(cuò)之處,多多包涵 喜歡的朋友,能否給個(gè)star呢
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-10-25 16:51:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 大家好,今天遇到一個(gè)問(wèn)題! 就是在tornado模板中需要轉(zhuǎn)換日期字符串的格式! 例如,收到的字符串是'2015-10-11',我需要轉(zhuǎn)換成'Oct 11, 2015' 我用的是strptime和strftime兩個(gè)函數(shù)! 具體如下: datetime.datetime.strptime('2015-10-11', "%Y-%m-%d").strftime("%b %d, %Y") 在tornado模板我看到datetime關(guān)鍵字是指的是python中的datatime模塊,然后我在tornado模板中寫(xiě)了這么一句代碼: 然后運(yùn)行的時(shí)候程序就報(bào)錯(cuò)了,錯(cuò)誤提示如下所示: Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/tornado-4.3.dev1-py2.7-linux-x86_64.egg/tornado/web.py", line 1411, in _execute result = method(*self.path_args, **self.path_kwargs) File "./blog.py", line 87, in get self.render("index.html", aside=True, passages=passages) File "/usr/local/lib/python2.7/dist-packages/tornado-4.3.dev1-py2.7-linux-x86_64.egg/tornado/web.py", line 701, in render html = self.render_string(template_name, **kwargs) File "/usr/local/lib/python2.7/dist-packages/tornado-4.3.dev1-py2.7-linux-x86_64.egg/tornado/web.py", line 808, in render_string return t.generate(**namespace) File "/usr/local/lib/python2.7/dist-packages/tornado-4.3.dev1-py2.7-linux-x86_64.egg/tornado/template.py", line 345, in generate return execute() File "index_html.generated.py", line 82, in _tt_execute _tt_tmp = datetime.datetime.strptime(passage.mtime, "%Y-%m-%d %H:%M:%S").strptime("%b %d, %Y") # index.html:16 (via base.html:56) TypeError: must be string, not datetime.datetime 我個(gè)人分析,感覺(jué)是tornado中將datetime關(guān)鍵字解析了兩次(datetime.datetime.strptime語(yǔ)句中),請(qǐng)問(wèn)一下這個(gè)該怎么解決???
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-10-11 19:26:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 用Tornado搭建基于Python的web應(yīng)用時(shí),遇到這樣一個(gè)問(wèn)題: 比如,我的路由里面有如下的規(guī)則: r"/test/M([0-9]+)",TestHandler 所以我在訪問(wèn)如http://xxx.xx.xx.xx/test/M1234這樣的頁(yè)面時(shí),Tornado或讓TestHandler去處理這個(gè)請(qǐng)求 在TestHandler里面的get方法render一個(gè)html文件test.html test.html有一些引入css和js的代碼: 比如: 這里的css_file是TestHandler里面?zhèn)鬟M(jìn)去的一個(gè)變量,代表渲染test.html時(shí)我需要引用的css文件 問(wèn)題是: 由于我訪問(wèn)的頁(yè)面URL是 http://xxx.xx.xx.xx/test/M1234 因此Tornado在渲染test.html時(shí),總是會(huì)以 http://xxx.xx.xx.xx/test做前綴來(lái)引用test.html中的css或者是js路徑,所以在打開(kāi)這個(gè)頁(yè)面時(shí)提示找不到: http://xxx.xx.xx.xx/test/static/css/xx.css static是一個(gè)包含所有靜態(tài)js和css文件的目錄,結(jié)構(gòu)如下: static | css-----xx.css | js-----xx.js 所以正確的路徑應(yīng)該是 http://xxx.xx.xx.xx/static/css/xx.css 而不是 http://xxx.xx.xx.xx /test /static/css/xx.css 難道我的路由規(guī)則里面不能有多于1級(jí)的的url地址嗎 如r"/test/a/M([0-9]+)" r"/test/M([0-9]+)" 因?yàn)門(mén)ornado在解析這些頁(yè)面的css和js鏈接時(shí),總是會(huì)引用成 http://xxx.xx.xx.xx /test /a /static/css/xx.css 和 http://xxx.xx.xx.xx /test /static/css/xx.css 實(shí)際上這個(gè)地址是不對(duì)的,有人知道怎么繞過(guò)這個(gè)問(wèn)題嗎?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-09-30 08:37:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 主要是靠raise Error 來(lái)控制還是返回值的方式?生產(chǎn)環(huán)境下一般使用自定義的Error嗎
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-05-03 11:31:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我有一個(gè)BaseHandler繼承了 RequestHandler ,然后具體handler繼承Base,然后發(fā)現(xiàn)Base的__init__在每次訪問(wèn)時(shí)都會(huì)被調(diào)用,是不是就意味著每次都會(huì)實(shí)例化一個(gè),而不是像java的servlet那樣? 再有就是我將業(yè)務(wù)方面的操作提取到了service類(lèi)里,當(dāng)handler需要調(diào)用的時(shí)候都必須new一個(gè)實(shí)例,有沒(méi)辦法可以使得在base里new好后可以被繼承調(diào)用?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-05-08 17:25:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> Chat Room web 實(shí)時(shí)聊天室 基于tornado服務(wù)器,Redis內(nèi)存數(shù)據(jù)庫(kù),SQlite 源碼: https://github.com/suliangxd/ChatRoom 思路: 當(dāng)用戶(hù)進(jìn)入某個(gè)聊天室,即相當(dāng)于訂閱了此聊天室對(duì)應(yīng)在redis里的一個(gè)channel 這里給出的架構(gòu)圖是指用戶(hù)進(jìn)入聊天室之后的實(shí)時(shí)聊天架構(gòu) 思路說(shuō)明:前端基于ajax的longpolling,后端采用redis的sub/pub機(jī)制 1. 服務(wù)器端會(huì)阻塞請(qǐng)求直到有數(shù)據(jù)傳遞或超時(shí)才返回,這里設(shè)置超時(shí)時(shí)間為60s 2. 客戶(hù)端JavaScript響應(yīng)處理函數(shù)會(huì)在處理完服務(wù)器返回的信息后,再次發(fā)出請(qǐng)求,重新建立連接 功能結(jié)構(gòu)圖: 架構(gòu)圖: 效果圖:
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-08-12 14:42:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 采用centos5.5系統(tǒng),cacti- 0.8.7g,rrdtool-1.4.4 cacti 通過(guò) import templates 將cacti_graph_template_win_services.xml,cacti_data_template_win_services.xml,cacti_data_query_win_services.xml,分別把這三個(gè)數(shù)據(jù)模版,圖形模版,數(shù)據(jù)庫(kù)查詢(xún)導(dǎo)入cacti, 并將 win_services.xml 復(fù)制到到 \var\www\cacti\resource\script_server\ 中,將 win_services.php 復(fù)制到 \var\www\cacti\scripts 目錄下。 在監(jiān)測(cè)設(shè)備中,能夠看到 windows 服務(wù)器的各種服務(wù)。 監(jiān)控windows系統(tǒng)可以看到相關(guān)的服務(wù)了。但是沒(méi)有圖像,根據(jù): http://www.oschina.net/bbs/thread/12057 這個(gè)帖子解決了,可以正常生成圖形,但是數(shù)據(jù)不對(duì)。監(jiān)控任何服務(wù)都顯示是停止?fàn)顟B(tài)。而這些都是在正常運(yùn)行的。 如果圖片小了看不清楚,請(qǐng)點(diǎn)擊圖片放大
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2011-01-05 22:38:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> [06-Jan-2016 23:57:01] WARNING: [pool www] child 16252 exited on signal 9 (SIGKILL) after 128403.246447 seconds from start [06-Jan-2016 23:57:01] NOTICE: [pool www] child 18235 started php-fpm日志一直有這個(gè)警告輸出,google半天沒(méi)看明白是什么意思,有沒(méi)有懂的指點(diǎn)一下
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-01-10 19:15:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 今天凌晨阿里云報(bào)警 說(shuō)訪問(wèn)超時(shí) 查了一下報(bào)錯(cuò)日志 [error] 22815#0: *27920484 connect() to unix:/tmp/php-cgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream 從網(wǎng)上找到了幾個(gè)解決方案 有的說(shuō) 把 fpm conf /var/run/php5-fpm.sock改 為127.0.0.1:9000 請(qǐng)問(wèn)這個(gè)的作用是? 還有的說(shuō) 把 max_children 進(jìn)程改大 不過(guò)查了一下當(dāng)前php-fpm 進(jìn)程數(shù) 只有5 當(dāng)前設(shè)置的最大值為100 估計(jì)也不是這個(gè)問(wèn)題 還查到有的說(shuō) 把 backlog = -1 改為 1024 請(qǐng)問(wèn)這個(gè)的作用是什么 記得之前嘗試改過(guò)一次 不過(guò)改動(dòng)不就后網(wǎng)站就出現(xiàn)大量502 大神們幫忙解答一下 謝謝
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-10-21 11:22:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> docker run --name php-fpm \ -p 9001:9000 \ -v /srv/www:/www \ -v /srv/php/conf/php.ini:/opt/bitnami/php/lib/php.ini \ --privileged=true \ -d bitnami/php-fpm docker命令如上,結(jié)合nginx,能順利訪問(wèn)phpinfo.php,根據(jù)phpinfo展示,找到php.ini Configuration File (php.ini) Path /opt/bitnami/php/lib Loaded Configuration File Scan this dir for additional .ini files /opt/bitnami/php/lib/php.ini /opt/bitnami/php/etc/conf.d 修改本地/srv/php/conf/php.ini,打開(kāi)session.save_path注解 但是在phpinfo上說(shuō)找不到save_path session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path no value no value session.serialize_handler session.sid_bits_per_character php 4 php 4 弄了半天了,實(shí)在找不到原因在哪里,help~
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2018-06-25 16:47:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> centos 上的php-soap,每天都會(huì)報(bào) Soap WSDL Error - "failed to load external entity 這個(gè)錯(cuò)誤 重啟php-fpm后就沒(méi)問(wèn)題了。不知是配置問(wèn)題,還是什么其他問(wèn)題
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-02-03 09:11:00
網(wǎng)易新聞使用頻率很高, 開(kāi)屏頁(yè)面以及應(yīng)用內(nèi)都是京東的廣告,10 次打開(kāi)網(wǎng)易新聞,8 次都不小心點(diǎn)了跳到京東 APP
來(lái)源:V2EX
發(fā)布時(shí)間:2020-08-27 15:30:01
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 在了解過(guò)世界最大的PHP站點(diǎn),F(xiàn)acebook的后臺(tái)技術(shù)后,今天我們來(lái)了解一個(gè)百萬(wàn)級(jí)PHP站點(diǎn)的網(wǎng)站架構(gòu):Poppen.de。Poppen.de是德國(guó)的一個(gè)社交網(wǎng)站,相對(duì)Facebook、Flickr來(lái)說(shuō)是一個(gè)很小的網(wǎng)站,但它有一個(gè)很好的架構(gòu),融合了很多技術(shù),如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。 Poppen.de目前有200萬(wàn)注冊(cè)用戶(hù)數(shù)、2萬(wàn)并發(fā)用戶(hù)數(shù)、每天20萬(wàn)條私有消息、每天25萬(wàn)登錄次數(shù)。而項(xiàng)目團(tuán)隊(duì)有11個(gè)開(kāi)發(fā)人員,兩個(gè)設(shè)計(jì),兩個(gè)系統(tǒng)管理員。該站點(diǎn)的商業(yè)模式采用免費(fèi)增值模式,用戶(hù)可以使用搜索用戶(hù)、給好友發(fā)送消息、上載圖片和視頻等功能。 如果用戶(hù)想享受不受限制發(fā)送消息和上載圖片,那么就得根據(jù)需要支付不同類(lèi)型的會(huì)員服務(wù),視頻聊天及網(wǎng)站其他服務(wù)也采用同樣的策略。 Nginx Poppen.de 所有的服務(wù)都是基于Nginx服務(wù)上的。前端有兩臺(tái)Nginx服務(wù)器在高峰期提供每分鐘15萬(wàn)次請(qǐng)求的負(fù)載,每個(gè)機(jī)器已經(jīng)有四年壽命,并且只有一個(gè)CPU 和3GB RAM。Poppen.de擁有三臺(tái)獨(dú)立的圖像服務(wù)器,由三臺(tái)Nginx服務(wù)器為*.bilder.poppen.de提供每分鐘8萬(wàn)次請(qǐng)求服務(wù)。 Nginx 架構(gòu)中一個(gè)很酷的設(shè)計(jì)就是有很多請(qǐng)求是由Memcached處理的,因此請(qǐng)求從緩存中獲取內(nèi)容而不需要直接訪問(wèn)PHP機(jī)器。比如,用戶(hù)信息頁(yè)(user profile)是網(wǎng)站需要密集處理的內(nèi)容,如果把用戶(hù)信息頁(yè)全部緩存到Memcached上,那么請(qǐng)求直接從Memcached上獲取內(nèi)容。 Poppen.de的Memcached每分鐘可以處理8000次請(qǐng)求。 架構(gòu)中有三個(gè)Nginx圖像服務(wù)器提供本地圖像緩存,用戶(hù)上載圖 像到一個(gè)中央文件服務(wù)器。當(dāng)向這三個(gè)Nginx之一中請(qǐng)求圖像時(shí),如果服務(wù)器本地中沒(méi)有存在該圖像,則從中央文件服務(wù)器下載到該服務(wù)器上作緩存并提供服 務(wù)。這種負(fù)載均衡的分布式圖像服務(wù)器架構(gòu)設(shè)計(jì)可以減輕主要存儲(chǔ)設(shè)備的負(fù)載。 PHP-FPM 該網(wǎng)站運(yùn)行在PHP- FPM上。共有28臺(tái)雙CPU、6GB內(nèi)存的PHP機(jī)器,每個(gè)機(jī)器上運(yùn)行100個(gè)PHP-FPM的工作線程。使用啟用了APC的PHP5.3.x。 PHP5.3可以降低CPU和內(nèi)存使用率的30%以上。 程序代碼是基于Symfony1.2框架之上開(kāi)發(fā)的。一是可以使用外部資源,二是 能夠提高項(xiàng)目開(kāi)發(fā)進(jìn)度,同時(shí)在一個(gè)著名的框架上可以讓新開(kāi)發(fā)人員更容易加入到團(tuán)隊(duì)中來(lái)。雖然沒(méi)有任何事情都是十全十美的,但可以從Symfony框架中得 到很多好處,讓團(tuán)隊(duì)可以更多的精力放在Poppen.de的業(yè)務(wù)開(kāi)發(fā)上去。 網(wǎng)站性能優(yōu)化使用XHProf,這是Facebook開(kāi)源出來(lái)的一個(gè)類(lèi)庫(kù)。這個(gè)框架非常容易個(gè)性化和配置,能夠可以緩存大部分高代價(jià)的服務(wù)器計(jì)算。 MySQL MySQL是網(wǎng)站主要的RDBMS。網(wǎng)站又幾個(gè)MySql服務(wù)器:一臺(tái)4CPU、32GB的服務(wù)器存儲(chǔ)用戶(hù)相關(guān)信息,如基本信息、照片描述信息等。這臺(tái)機(jī)器已經(jīng)使用了4 年,下一步計(jì)劃會(huì)使用共享集群來(lái)替換它。目前仍基于這個(gè)系統(tǒng)上進(jìn)行設(shè)計(jì),以簡(jiǎn)化數(shù)據(jù)訪問(wèn)代碼。根據(jù)用戶(hù)ID進(jìn)行數(shù)據(jù)分區(qū),因?yàn)榫W(wǎng)站中大部分信息都是以用戶(hù) 為中心的,如照片、視頻、消息等。 有三臺(tái)服務(wù)器按主-從-從配置架構(gòu)提供用戶(hù)論壇服務(wù)。一臺(tái)從服務(wù)器負(fù)責(zé)網(wǎng)站自定義消息存儲(chǔ),到現(xiàn)在有 2.5億條消息。另外四臺(tái)機(jī)器為主-從配置關(guān)系。另外由4臺(tái)機(jī)器配置成NDB族群專(zhuān)門(mén)服務(wù)于密集型寫(xiě)操作數(shù)據(jù),如用戶(hù)訪問(wèn)統(tǒng)計(jì)信息。 數(shù)據(jù)表設(shè)計(jì)盡量避免關(guān)聯(lián)操作,盡可能緩存最多的數(shù)據(jù)。當(dāng)然,數(shù)據(jù)庫(kù)的結(jié)構(gòu)化規(guī)范已經(jīng)完全被破壞掉了。因此,為了更容易搜索,數(shù)據(jù)庫(kù)設(shè)計(jì)創(chuàng)建了數(shù)據(jù)挖掘表。大部分表是MyISAM型表,可以提供快速查找?,F(xiàn)在的問(wèn)題是越來(lái)越多的表已經(jīng)全表鎖住了。Poppen.de正考慮往XtraDB存儲(chǔ)引擎上遷移。 Memcached 網(wǎng)站架構(gòu)中Memcached應(yīng)用相當(dāng)多,超過(guò)45GB的高速緩存和51個(gè)節(jié)點(diǎn)。緩存了Session會(huì)話、視圖緩存以及函數(shù)執(zhí)行緩存等。架構(gòu)中有一個(gè)系統(tǒng) 當(dāng)記錄被修改時(shí)可以自動(dòng)地把數(shù)據(jù)更新到緩存中去。未來(lái)改善緩存更新的可能方案是使用新的Redis Hash API或者M(jìn)ongoDB。 RabbitMQ 在 2009年中開(kāi)始在架構(gòu)中使用RabbitMQ。這是一個(gè)很好的消息解決方案,便于部署和集中到這個(gè)架構(gòu)中去,在LVS后運(yùn)行了兩臺(tái)RabbitMQ服務(wù) 器。在上個(gè)月,已經(jīng)把更多的東西集成到該隊(duì)列中,意味著同一時(shí)刻有28臺(tái)PHP服務(wù)器每天要處理50萬(wàn)次請(qǐng)求。發(fā)送日志、郵件通知、系統(tǒng)消息、圖像上載等 更多的東西到這個(gè)隊(duì)列中。 應(yīng)用PHP-FPM中的fastcgi_finish_request()函數(shù)集成隊(duì)列消息,可以把消息異步發(fā) 送到隊(duì)列中。當(dāng)系統(tǒng)需要給用戶(hù)發(fā)送HTML或JSON格式響應(yīng)時(shí),就調(diào)用這個(gè)函數(shù),這樣用戶(hù)就沒(méi)有必要等到PHP腳本清理。 這個(gè)系統(tǒng)可以改善架構(gòu)資源管理。例如,在高峰期服務(wù)每分鐘可以處理1000次登錄請(qǐng)求。這表示有1000并發(fā)更新用戶(hù)表保存用戶(hù)的登錄時(shí)間。由于使用了隊(duì)列機(jī)制,可以 按相反的順序來(lái)運(yùn)行這些查詢(xún)。如果需要提高處理速度,只需要增加更多的隊(duì)列處理者即可,甚至可以增加更多的服務(wù)器到這集群中去,而不需要修改任何配置和部 署新節(jié)點(diǎn)。 CouchDB 日志存儲(chǔ)CouchDB運(yùn)行在一臺(tái)機(jī)器上。在這臺(tái)機(jī)器上可以根據(jù)模塊/行為進(jìn)行日志查詢(xún) /分組,或者根據(jù)錯(cuò)誤類(lèi)型等等。這對(duì)定位問(wèn)題非常有用。在使用日志聚合服務(wù)CouchDB之前,不得不逐臺(tái)登錄到PHP服務(wù)器上設(shè)法日志分析定位問(wèn)題,這 是非常麻煩的。而現(xiàn)在把所有的日志集中到隊(duì)列中保存到CouchDB中,可以集中進(jìn)行問(wèn)題檢查和分析。 Graphite 網(wǎng)站使用Graphite采集網(wǎng)站實(shí)時(shí)信息并統(tǒng)計(jì)。從請(qǐng)求每個(gè)模塊/行為到Memcached的命中和未命中、RabbitMQ狀態(tài)監(jiān)控以及Unix負(fù)載等等。Graphite服務(wù)平均每分鐘有4800次更新操作。實(shí)踐已經(jīng)證實(shí)要監(jiān)測(cè)網(wǎng)站發(fā)發(fā)生什么是非常有用的,它的簡(jiǎn)單文本協(xié)議和繪圖功能可以方便地即插即 用的方式用于任何需要監(jiān)控的系統(tǒng)上。 一件很酷的事情是使用Graphite同時(shí)監(jiān)控了網(wǎng)站的兩個(gè)版本。一月份部署了Symfony框架新 版本,以前代碼作為一個(gè)備份部署。這就意味著網(wǎng)站可能會(huì)面臨性能問(wèn)題。因此可以使用Graphite來(lái)對(duì)兩個(gè)版本在線進(jìn)行對(duì)比。 發(fā)現(xiàn)新版本上的Unix負(fù)載表較高,于是使用 XHProf 對(duì)兩個(gè)版本進(jìn)行性能分析,找出問(wèn)題所在。 Red5 網(wǎng)站為用戶(hù)也提供了兩種類(lèi)型的視頻服務(wù),一種是用戶(hù)自己上載的視頻,另外一種是視頻聊天,用戶(hù)視頻互動(dòng)和分享。到2009年年中,每月為用戶(hù)提供17TB的流量服務(wù)。 Tsung Tsung 是一個(gè) Erlang 編寫(xiě)的分布式基準(zhǔn)分析工具。在Poppen.de網(wǎng)站中主要用于HTTP基準(zhǔn)分析、MySQL與其他存儲(chǔ)系統(tǒng)(XtraDB)的對(duì)比分 析。用一個(gè)系統(tǒng)記錄了主要的MySQL服務(wù)器的流量,再轉(zhuǎn)換成Tsung的基準(zhǔn)會(huì)話。然后對(duì)該流量進(jìn)行回放,由Tsung產(chǎn)生數(shù)以千計(jì)的并發(fā)用戶(hù)訪問(wèn)實(shí)驗(yàn) 室的服務(wù)器。這樣就可以在實(shí)驗(yàn)環(huán)境中與真實(shí)場(chǎng)景非常接近。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2011-12-29 20:14:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> centos,24核32G ab壓力測(cè)試工具,1000并發(fā)客戶(hù)端請(qǐng)求頁(yè)面5萬(wàn)次 lnmp環(huán)境下,壓力測(cè)試靜態(tài)html處理能力達(dá)到14000次每秒 (這個(gè)靜態(tài)處理能力我也想提升,主要是服務(wù)器資源還剩余的多) ab -c 1000 -n 50000 -k http://127.0.0.1/index.html Concurrency Level: 1000 Time taken for tests: 3.387 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 50000 Total transferred: 23341512 bytes HTML transferred: 11619792 bytes Requests per second: 14764.11 [#/sec] (mean) Time per request: 67.732 [ms] (mean) Time per request: 0.068 [ms] (mean, across all concurrent requests) Transfer rate: 6730.79 [Kbytes/sec] received ================================ 但是測(cè)試一個(gè)很簡(jiǎn)單的PHP頁(yè)面(只有echo語(yǔ)句)才3000次每秒 Concurrency Level: 1000 Time taken for tests: 12.982 seconds Complete requests: 50000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 0 Total transferred: 13250265 bytes HTML transferred: 3450069 bytes Requests per second: 3851.56 [#/sec] (mean) Time per request: 259.635 [ms] (mean) Time per request: 0.260 [ms] (mean, across all concurrent requests) Transfer rate: 996.76 [Kbytes/sec] received php-fpm的狀態(tài)頁(yè)大概如下:最大800的php-fpm進(jìn)程實(shí)際最高用了不到30的進(jìn)程 在壓力測(cè)試的期間,top命令查看機(jī)器的cpu和內(nèi)存,cpu占用不到8%,內(nèi)存占用不到20% listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 355 active processes: 14 total processes: 369 max active processes: 269 max children reached: 0 slow requests: 0 php-fpm開(kāi)的進(jìn)程是800,但是壓力測(cè)試的時(shí)候觀察php-fpm狀態(tài)頁(yè)顯示的活動(dòng)進(jìn)程只有300左右,請(qǐng)求完成都是200狀態(tài),但是秒處理能力太弱了,感覺(jué)php-fpm沒(méi)有完全啟動(dòng)并發(fā)處理,按道理應(yīng)該是在有請(qǐng)求的時(shí)候應(yīng)該全部啟動(dòng)運(yùn)行,有人知道這個(gè)怎么提高php處理能力么?? 我想要壓榨服務(wù)器的性能啊,這感覺(jué)沒(méi)有跑起來(lái)啊。。有大神知道的給我指導(dǎo)下拉,,謝謝。
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-06-25 16:46:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 各位好,遇到一個(gè)問(wèn)題?,F(xiàn)在的項(xiàng)目是基于tinkphp上面二次開(kāi)發(fā)的系統(tǒng),目前發(fā)現(xiàn)系統(tǒng)經(jīng)常出現(xiàn)訪問(wèn)時(shí)快時(shí)慢的情況,排查了一下數(shù)據(jù)庫(kù)、還有web服務(wù)器使用率都不高。 但是排查日志的時(shí)候,發(fā)現(xiàn)在調(diào)用數(shù)據(jù)庫(kù)的時(shí)候,經(jīng)常出現(xiàn)dump情況。麻煩各位幫忙看下,到底是怎么回事。 [07-May-2017 17:00:18] [pool www] pid 1195 script_filename = /usr/local/nginx/html/index.php [0x00007fd033454a90] query() /usr/local/nginx/html/ThinkPHP/Library/Think/Db/Driver/Mysqli.class.php:88 [0x00007fd0334547d8] query() /usr/local/nginx/html/ThinkPHP/Library/Think/Db.class.php:773 [0x00007fd0334539a8] select() /usr/local/nginx/html/ThinkPHP/Library/Think/Model.class.php:618 [0x00007fd0334535d0] select() /usr/local/nginx/html/Application/Common/Api/ConfigApi.class.php:20 [0x00007fff42f22c90] lists() unknown:0 [0x00007fd033453290] call_user_func_array() /usr/local/nginx/html/Application/Common/Common/function.php:1054 [0x00007fd03344f360] api() /usr/local/nginx/html/ThinkPHP/Library/Think/Dispatcher.class.php:197 [0x00007fd03344eb08] dispatch() /usr/local/nginx/html/ThinkPHP/Library/Think/App.class.php:36 [0x00007fd03344e930] init() /usr/local/nginx/html/ThinkPHP/Library/Think/App.class.php:184 [0x00007fd03344d128] run() /usr/local/nginx/html/ThinkPHP/Library/Think/Think.class.php:121 [0x00007fd03344bae0] start() /usr/local/nginx/html/ThinkPHP/ThinkPHP.php:96 [0x00007fd03344b440] +++ dump failed [07-May-2017 17:00:25] [pool www] pid 1196 script_filename = /usr/local/nginx/html/index.php [0x00007fd033454c28] query() /usr/local/nginx/html/ThinkPHP/Library/Think/Db/Driver/Mysqli.class.php:88 [0x00007fd033454798] query() /usr/local/nginx/html/ThinkPHP/Library/Think/Db/Driver/Mysqli.class.php:209 [0x00007fd033453d88] getFields() /usr/local/nginx/html/ThinkPHP/Library/Think/Model.class.php:138 [0x00007fd033453a10] flush() /usr/local/nginx/html/ThinkPHP/Library/Think/Model.class.php:125 [0x00007fd033453498] _checkTableInfo() /usr/local/nginx/html/ThinkPHP/Library/Think/Model.class.php:1510 [0x00007fd033453018] db() /usr/local/nginx/html/ThinkPHP/Library/Think/Model.class.php:99 [0x00007fd033452888] __construct() /usr/local/nginx/html/ThinkPHP/Common/functions.php:625 [0x00007fd033451a38] D() /usr/local/nginx/html/Application/Mob/Model/ActivityModel.class.php:430 [0x00007fd033450c20] get_ActivityHallList() /usr/local/nginx/html/Application/Mob/Controller/EnterpriseController.class.php:1285 [0x00007fff42f22c50] getMore() unknown:0 [0x00007fd03344f2f8] invoke() /usr/local/nginx/html/ThinkPHP/Library/Think/App.class.php:155 [0x00007fd03344f120] exec() /usr/local/nginx/html/ThinkPHP/Library/Think/App.class.php:193 [0x00007fd03344d918] run() /usr/local/nginx/html/ThinkPHP/Library/Think/Think.class.php:121 [0x00007fd03344c2d0] start() /usr/local/nginx/html/ThinkPHP/ThinkPHP.php:96 [0x00007fd03344bc30] +++ dump failed [07-May-2017 17:00:25] [pool www] pid 1217 script_filename = /usr/local/nginx/html/index.php [0x00007fd033457c70] is_file() /usr/local/nginx/html/ThinkPHP/Library/Think/Cache/Driver/File.class.php:79 [0x00007fd033457690] get() /usr/local/nginx/html/ThinkPHP/Common/functions.php:1245 [0x00007fd033457590] S() /usr/local/nginx/html/Application/Common/Model/UserModel.class.php:147 [0x00007fd033457228] read_query_user_cache() /usr/local/nginx/html/Application/Common/Model/UserModel.class.php:183 [0x00007fd033455ae0] getCachedFields() /usr/local/nginx/html/Application/Common/Model/UserModel.class.php:37 [0x00007fd033455908] query_user() /usr/local/nginx/html/Application/Common/Common/query_user.php:18 [0x00007fd033455230] query_user() /usr/local/nginx/html/Application/People/Widget/HomeBlockWidget.class.php:34 [0x00007fd0334550a8] assignUser() /usr/local/nginx/html/Application/People/Widget/HomeBlockWidget.class.php:18 [0x00007fff42f22360] render() unknown:0 [0x00007fd033454dc8] call_user_func_array() /usr/local/nginx/html/ThinkPHP/Common/functions.php:771 [0x00007fd033454cd8] R() /usr/local/nginx/html/ThinkPHP/Common/functions.php:1176 [0x00007fd0334524e0] W() /usr/local/nginx/html/Runtime/Cache/Home/769e70f2e46f34ceb60619bbda5e4691.php:337 [0x00007fd033452390] +++ dump failed
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-05-07 22:28:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 在Windows下,用Nginx+php。發(fā)現(xiàn)都是啟動(dòng)php-cgi.exe的,但是在Linux下是有php-fpm的,php-fpm負(fù)責(zé)管理cgi。 所以想問(wèn)下,在Windows下,php-fpm怎樣啟動(dòng)?或者說(shuō),Windows下還有php-fpm嗎?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-03-23 15:01:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> [root @localhost sbin]# ./php-fpm [17-Feb-2017 23:14:09] WARNING: Nothing matches the include pattern '/usr/local/php/etc/php-fpm.d/*.conf' from /usr/local/php/etc/php-fpm.conf at line 125. [17-Feb-2017 23:14:09] ERROR: No pool defined. at least one pool section must be specified in config file [17-Feb-2017 23:14:09] ERROR: failed to post process the configuration [17-Feb-2017 23:14:09] ERROR: FPM initialization failed
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2017-02-17 15:15:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 服務(wù)器是雙核的4GB內(nèi)存,搭建的是LNMP的環(huán)境,在用 webbench做壓力測(cè)試的時(shí)候100的并發(fā),就變成這樣了,是不是服務(wù)器配置不行啊
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2015-12-22 11:00:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 安裝 PHP 和 nginx 后,無(wú)法解析 PHP 文件。 其中,PHP 和 nginx 的編譯安裝 configure 如下: # PHP 5.3.9 ./configure --prefix=/usr/local/php -- enable-fpm # nginx 1.0.11 ./configure --prefix=usr/local/nginx # 成功安裝后,創(chuàng)建 php-fpm.conf 配置文件,刪除 nginx.conf 中“pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000”部分的注釋 cd /usr/local/php/etc mv php-fpm.conf.default php-fpm.conf vi /usr/local/nginx/conf/nginx.conf # 刪除如下部分的注釋?zhuān)4嫱顺觯? location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } # 啟動(dòng) php-fpm 和 nginx /usr/local/php/sbin/php-fpm /usr/local/nginx/sbin/nginx # 在 nginx 的 html 目錄下放一個(gè) php 文件,瀏覽器訪問(wèn),不能解析,顯示“ File not found. ” 請(qǐng)問(wèn)是為什么?如何解決?謝謝!
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2012-01-29 15:22:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 最近兩天凌晨0點(diǎn) 服務(wù)器經(jīng)常出現(xiàn)大量502 從阿里云后臺(tái)監(jiān)控來(lái)看 基本所有正常訪問(wèn)用戶(hù)都是返回502 昨天登了一下服務(wù)器 用netstat -napo |grep "php-fpm" | wc -l這條命令查到 php-fpm的進(jìn)程數(shù)已經(jīng)到達(dá)380多 (平時(shí)基本在10個(gè)左右) 目前無(wú)法排查問(wèn)題 請(qǐng)問(wèn)有什么好的方案來(lái)排查 看過(guò)php-fpm的error log 無(wú)相關(guān)記錄 慢日志也開(kāi)了 還是查不到問(wèn)題 開(kāi)了滿(mǎn)日志 每天出問(wèn)題的時(shí)候 所有的訪問(wèn)都會(huì)很慢所以都被記錄進(jìn)去了 太多了查不到 每天大概0:05 的時(shí)候 進(jìn)程多三四百個(gè)的時(shí)候 cpu會(huì)被沾滿(mǎn) 而且用top命令查看沒(méi)有占cpu很高的php-fpm進(jìn)程
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-10-25 19:02:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 最近兩天凌晨0點(diǎn) 服務(wù)器經(jīng)常出現(xiàn)大量502 從阿里云后臺(tái)監(jiān)控來(lái)看 基本所有正常訪問(wèn)用戶(hù)都是返回502 昨天登了一下服務(wù)器 用netstat -napo |grep "php-fpm" | wc -l這條命令查到 php-fpm的進(jìn)程數(shù)已經(jīng)到達(dá)380多 (平時(shí)基本在10個(gè)左右) 目前無(wú)法排查問(wèn)題 請(qǐng)問(wèn)有什么好的方案來(lái)排查 看過(guò)php-fpm.log 無(wú)記錄
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-10-22 10:19:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 假如我有 3 臺(tái)服務(wù)器, 一臺(tái)服務(wù)器使用 nginx 做負(fù)載均衡,轉(zhuǎn)發(fā)到另外兩臺(tái)應(yīng)用服務(wù)器, 那么這兩臺(tái)應(yīng)用服務(wù)器的配置是只有 php-fpm 呢,還是 nginx+php-fpm 我看到網(wǎng)上的配置有 (nginx 負(fù)載均衡)+ (ngin + php-fpm)+(ngin+php-fpm) 也有 (nginx 負(fù)載均衡)+ (php-fpm)+(php-fpm) 這兩種配置架構(gòu)有什么區(qū)別?一般都使用哪種?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-09-18 11:33:08
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 用openresty nginx、php-fpm、PHP來(lái)架設(shè)個(gè)人網(wǎng)站wordpress,輸入192.168.80.141:8080/index.php可以訪問(wèn),點(diǎn)擊其中的鏈接瀏覽器的地址欄就變成下面的鏈接 http://localhost/wordpress/index.php/2016/09/05/i-am-a-boy/ 是什么原因?qū)е戮W(wǎng)址前面自動(dòng)添加localhost而不是IP地址?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2016-09-08 11:25:00
HDC調(diào)試需求開(kāi)發(fā)(15萬(wàn)預(yù)算),能者速來(lái)!>>> 我安裝的是 PHP 5.3.9,并且使用如下配置安裝: ./configure --prefix=/usr/local/php --enable-fpm 但是使用 /usr/local/php/sbin/php-fpm 卻無(wú)法啟動(dòng),提示錯(cuò)誤: ERROR: failed to load configuration file '/usr/local/php/etc/php-fpm.conf' ERROR: FPM initialization failed 請(qǐng)問(wèn),應(yīng)該如何啟動(dòng) php-fpm 呢?
來(lái)源:開(kāi)源中國(guó)
發(fā)布時(shí)間:2012-01-25 21:58:00