• 关于

    .NET标准可以做什么

    的搜索结果

问题

oschina网站的首页问题? 400 报错

oschina网站的首页问题? 400 报错 不像其他脚本语言,java和jsp的功能是分开的,所以jsp显示的数据都是需要经过java请求处理。 有的在index.jsp里做一个forward 跳转发...
爱吃鱼的程序员 2020-06-03 15:11:26 0 浏览量 回答数 1

问题

2018MySQL技术问答集锦,希望能给喜欢MySQL的同学一些帮助

小编发现问答专区中有很多人在问关于mysql的问题,小编把这些问题汇总一下,希望能给喜欢mysql的大家一些启示和帮助本帖不定期更新,喜欢的可以收藏哦如何搭建MySQL集群?https://yq.aliyun.com/ask/482768m...
技术小能手 2019-12-01 19:31:11 1856 浏览量 回答数 0

回答

Web Services(网络服务) Web Services 向其他的应用程序提供数据和服务。 未来的应用程序将通过标准的 Web 格式 (HTTP, HTML, XML, 以及 SOAP) 来访问 Web Services,而无需知晓 Web Services 本身是如何实现的。 在微软的 .NET 编程模型中,Web Services 是主要的构建模块。 2. Standard Communication(标准的通信) 正式的 Web 标准将被用来描述什么是因特网数据,以及 Web Services 可以做的事情。 未来的 Web 应用程序将被构建在灵活的服务之上,这些服务可以在保持其完整性的同时互相交互以及交换数据。 3. Internet Storages(因特网存储) .NET 在网络上提供安全的可寻址的空间来存储数据和应用程序。并允许各种类型的因特网设备(PC、掌上电脑、移动电话等)访问数据和应用程序。 这些 Web Services 构建于微软公司现有的 NTFS、SQL Server 以及交换技术之上。 4. Internet Dynamic Delivery(因特网动态传送) 通过请求和安装独立的应用程序,可进行可靠的自动化的更新。 .NET 将支持可被动态重新配置的应用程序的快速开发。 5. Internet Identity(因特网验证) .NET 提供多种层级的身份验证服务,比如密码、钱包以及智能卡片。 这些服务被构建于现有的微软 Passport 和 Windows 身份验证技术之上。 6. Internet Messaging(因特网通信) .NET 支持把即时通信、电子邮件、语音邮件以及传真整合为一个统一的因特网服务,其对象是各种 PC 以及智能因特网设备。 这些服务构建在现有的 hotmail、交换以及即时通信软件技术之上。 7. Internet Calendar(因特网日历) .NET 支持对工作、社会以及私人家庭日历在因特网进行集成。允许各种类型的设备(PC、掌上电脑、移动电话等)访问这些数据。 这些服务构建在现有的 Outlook 以及 Hotmail 技术之上。 8. Internet Directory Services(因特网目录服务) .NET 支持新型的目录服务,可回答基于 XML 的和因特网服务相关的问题,远胜于搜索引擎以及黄页。 这些服务构建在 UDDI 标准之上。
游客bnlxddh3fwntw 2020-04-24 10:23:01 0 浏览量 回答数 0

阿里云域名特惠专场,热门域名1元抢购!

全网低价特惠,顶级域名低至1元,更有96元/年服务器限时抢购!

问题

【精品问答】智能媒体管理知识大全

阿里云智能媒体管理(Intelligent Media Management,简称 IMM),场景化封装数据智能分析管理。为云上文档、图片数据,提供一站式数据处理、分析、...
montos 2020-04-04 13:45:28 23 浏览量 回答数 1

回答

HTTP定义的事务处理由以下四步组成: 1.建立连接。 2.客户端发送HTTP请求头。 3.服务器端响应生成结果回发。 4.服务器端关闭连接,客户端解析回发响应头,恢复页面。 1.建立连接:以下用我的另一篇文章的地址做为例子 Servlet容器(Tomacat)介绍及配置 客户端,也就是我请求一个地址时,即打开了到 Web 服务器的HTTP端口的一个套接字。因为在网络中间作为传递数据的实体介质就是网线,数据实质上是通过IO流进行输出和输入,这就不难理解我们为什么在写一个Servlet的时候要引用 import java.io.*; 的原因,包括我们在向客户端回发结果的时候要用到 PrintWriter 对象的println()方法。 比如我在这里请求CSDN社区的一个地址http://blog.csdn.net, 实际上首先要请求这个地址,以及一个端口80(8080)http://blog.csdn.net:80 80可以不写,是因为浏览器网页服务默认的端口号是 80. 在Java底层代码中是这样实现的,只不过它们已经帮我们做了。 Socket socket=new Socket("blog.csdn.net",8080); InputStream in=socket.getInputStream(); OutputStream out=socket.getOutputStream(); 2.客户端发送HTTP请求头 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,是一个ASCII文本请求行,后跟0个或多个HTTP头标,一个空行和实现请求的任意数据。四个部分:请求行,请求头标,空行和请求数据。 1)请求行由三个标记组成:请求方法 请求URL HTTP版本,中间用空格分开 例如:GET lvpin/archive/2007/06/09/1645767.aspx HTTP/1.1 HTTP规范定义了8种可能的请求方法:(最常见的就是 GET 和 POST 两种方法) GET 检索URI中标识资源的一个简单请求 HEAD 与GET方法相同,服务器只返回状态行和头标,并不返回请求文档 POST 服务器接受被写入客户端输出流中的数据的请求 PUT 服务器保存请求数据作为指定URI新内容的请求 DELETE 服务器删除URI中命名的资源的请求 OPTIONS 关于服务器支持的请求方法信息的请求 TRACE Web服务器反馈Http请求和其头标的请求 CONNECT 已文档化但当前未实现的一个方法,预留做隧道处理 2)请求头标:由key :value 键值组成,每行一对。请求头标通知服务器有关客户端的功能和标识。 HOST 请求的哪一个服务器端地址,主地址 ,比如 我现在所在的CSDN blog.csdn.net/ User-Agent 用户即客户端可以使用的浏览器 ,如 : Mozilla/4.0 Accept 即客户端可以接受的MIME 类型列表,如image/gif text/html, application/msword Content-Length 只适用于POST请求,以字节给出POST数据的尺寸 3)空行 发送回车符和退行,通知服务器以下不再有头标。 4)请求数据:使用POST传送数据,最常使用的是Content-Type和Content-Length头标。 总结以上 我们可以这样写出一个标准的 HTTP请求 POST /lvpin/archive/2007/06/09/1645767.aspx HTTP1.1 HOST: blog.csdn.net/ User-Agent :Mozilla/4.0 Accpt: image/gif,text/html,application/pdf,image/png... key=value&key=value&key=value.....................................(POST()请求的数据) 那么,这上面的一个例子说明的就是 我要去访问的服务器端的地址是blog.csdn.net/ 它下面的资源 /lvpin/archive/2007/06/09/1645767.aspx连起来就是 http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx 这个页面用的是 HTTP1.1 规范 我的浏览器版本是Mozilla/4.0 可以支持的MIME格式为 image/gif,text/html,application/pdf,image/png...等等 这个MIME格式我们response.setContentType("text/html;charset=gb2312");或者在一个 <%@ page contentType="text/html;charset=gb2312"%> 或者<meta .....contentType="text/html;charset=gb2312"..>总能见到 那么在这里如何理解 GET 和 POST 最直观的区别,最明显的就是 GET方法将数据的请求跟在了所请求的URL后面,也就是在请求行里面我们是这么样来做的: GET lvpin/archive/2007/06/09/1645767.aspx? key=value&key=value&key=value......HTTP1.1 也实际上就是 用 GET 如此传递数据 : http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx?name=simon&password=simonlv........ 3.服务器端接受请求,处理数据后生成响应返回数据到客户端 (部分Servlet 内容穿插) Web 服务器 解析请求,定位指定的资源http://blog.csdn.net/lvpin/archive/2007/06/09/1645767.aspx 1)根据在 请求时的 GET/POST 来按照响应的 doGet() /doPost()方法来处理(有可能是一些业务逻辑,也有可能是一些验证等等,也有可能是一些数据查询,提交等等)其有效的数据就来源于name=simon&password=simonlv,还有其它的一些封装在 request 对象中的数据资源。 2)处理请求之后,由 response 对象得到 PriterWriter 输出流对象out ,通过 out.println () 将数据以 在客户端提交过的采用的Accpt: 中形式的一种 如 按照 response.setcontentType("text/html;charset=gb2312' )的格式输出流。 它的响应信息与请求信息非常类似,其区别就在于 我们在请求阶段的请求行被状态行给替换了,一个响应由四个部分组成:状态行、响应头标、空行、响应数据 1.状态行:状态行由三个标记组成:HTTP版本、响应代码和响应描述。 HTTP1.1 100 continue ------继续追加后继内容 HTTP1.1 200 OK -----一切正常 HTTP1.1 301 Moved Permanently ---请求的文档在其它地方,会自动连接 HTTP1.1 403 Forbidden -------绝对拒绝你访问这个资源,不管授权没有 HTTP1.1 400 Bad Request -----客户端请求中的不良语法 HTTP1.1 404 Not Found ---最常见,绝对是大名鼎鼎的找不到 HTTP响应码: 1xx:提示性信息,告诉客户端应该对某些其它的动作做出响应 2xx:这些就代表了请求成功 3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误 500-599:服务器端的错误 2.响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。 Date: Sat,31 Dec 2005 23:59:59 GMT --响应生成的日期和时间 ContentType: text/html;charset=gb2312' Content-Length: 122 ---响应中的字节数,只在浏览器使用永久(Keep-alive)HTTP连接时需要。 3.空行:最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不再有头标。 4.响应数据:HTML文档和图像等,也就是HTML本身。out.println("").......写出的。。。 <html> <head> <title>Welcom to simon lv 's home</title> </head> <body> <!-- 这里是具体的内容,看到了这里 相信大家对 HTTP 工作原理和服务器交互过程已经很清楚了吧 --> </body> </html>
游客2q7uranxketok 2021-02-08 10:54:10 0 浏览量 回答数 0

问题

Java技术1000问(3)【精品问答】

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的Java语言概述、数据类型和运算符、面向对象等维度内容。 我们会以每天至少50条的速度,增...
问问小秘 2020-06-02 14:27:10 11463 浏览量 回答数 3

问题

【精品问答】python技术1000问(1)

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术1000问内容,包含最基础的如何学python、实践中遇到的技术问题、python面试等维度内容。 我们会以每天至少50条的...
问问小秘 2019-12-01 21:57:48 456417 浏览量 回答数 22

回答

首先让我们看一下数据 path = os.getcwd() + '\data\ex1data2.txt' data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price']) data2.head() Size Bedrooms Price 0 2104 3 399900 1 1600 3 329900 2 2400 3 369000 3 1416 2 232000 4 3000 4 539900 每个变量值的大小都是不同的,一个房子大约有2-5个卧室,可能每个房间的大小都不一样,如果我们在这个数据集上运行原来的回归算法,那么“size”影响的权重就太大了,就会降低“number of bedrooms”的影响,为了解决这个问题,我们需要做一些所谓的“特征标准化”。也就是需要调整特征的比例来平衡竞争关系。一种方法是用特征的均值减去另一个特征的均值,然后除以标准差。这是使用的pandas的代码。 data2= (data2- data2.mean())/ data2.std() data2.head() 接下来我们需要修改练习一中的线性回归的实现,以处理多个因变量。下面是梯度下降函数的代码。 def gradientDescent(X, y, theta, alpha, iters): temp = np.matrix(np.zeros(theta.shape)) parameters = int(theta.ravel().shape[1]) cost = np.zeros(iters) for i in range(iters): error = (X * theta.T) - y for j in range(parameters): term = np.multiply(error, X[:,j]) temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term)) theta = temp cost[i] = computeCost(X, y, theta) return theta, cost 仔细观察计算误差项的代码行error = (X * theta.T) – y,我们会在矩阵运算中一直使用它。这是线性代数在工作中的力量:不管X中有多少变量(列),只要参数的个数是一致的,这个代码就能正常工作。类似地,只要y中的行数允许,它将计算X中每行的错误项。这是一种将ANY表达式一次性应用于大量实例的有效方法。 由于我们的梯度下降和成本函数都使用矩阵运算,所以处理多元线性回归所需的代码实际上没有变化。我们来测试一下,首先通过初始化创建适当的矩阵来传递函数。 # add ones column data2.insert(0, 'Ones', 1) # set X (training data) and y (target variable) cols = data2.shape[1] X2 = data2.iloc[:,0:cols-1] y2 = data2.iloc[:,cols-1:cols] # convert to matrices and initialize theta X2 = np.matrix(X2.values) y2 = np.matrix(y2.values) theta2 = np.matrix(np.array([0,0,0])) 现在运行,看会发生什么 # perform linear regression on the data set g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters) # get the cost (error) of the model computeCost(X2, y2, g2) 0.13070336960771897 我们可以绘制训练过程,确认实际误差随着每次迭代梯度下降而减少。 fig, ax = plt.subplots(figsize=(12,8)) ax.plot(np.arange(iters), cost2, 'r') ax.set_xlabel('Iterations') ax.set_ylabel('Cost') ax.set_title('Error vs. Training Epoch') 解决方案的成本或误差随着每个成功的迭代而下降,直到它触底。这正是我们希望发生的事情。我们的算法起作用了。 Python的伟大之处在于它的庞大的开发者社区和丰富的开源软件。在机器学习领域,顶级Python库是scikit-learn。让我们看看如何使用scikit- learn的线性回归类来处理第一部分的简单线性回归任务。 from sklearn import linear_model model = linear_model.LinearRegression() model.fit(X, y) 没有比这更简单的了。“fit”方法有很多参数,我们可以根据我们想要的算法来调整参数,默认值可以感测到遗留下来的问题。试着绘制拟合参数,和之前的结果比较。 x = np.array(X[:, 1].A1) f = model.predict(X).flatten() fig, ax = plt.subplots(figsize=(12,8)) ax.plot(x, f, 'r', label='Prediction') ax.scatter(data.Population, data.Profit, label='Traning Data') ax.legend(loc=2) ax.set_xlabel('Population') ax.set_ylabel('Profit') ax.set_title('Predicted Profit vs. Population Size') 可参考:https://www.johnwittenauer.net/machine-learning-exercises-in-python-part-2/)
珍宝珠 2019-12-02 03:22:32 0 浏览量 回答数 0

回答

在线程中使用 System.Windows.Forms.Timer 是不能触发 Tick 事件的,为什么?如何在线程中使用定时器呢?就看本文介绍。 一. System.Windows.Forms.Timer System.Windows.Forms.Timer 要求要有UI 消息泵, 所以通常只在主线程上使用. System.Windows.Forms.Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程. 且看MSDN的用法解释: 实现在用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。 二. System.Timers.Timer System.Timers.Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 Elapsed 事件的周期性间隔。 然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务器,必须每周 7 天、每天 24 小时都保持运行。 可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。 基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。 服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。 有关基于服务器的计时器的更多信息,请参见“基于服务器的计时器介绍”。 在 Visual Studio 和 .NET Framework 中有三种计时器控件:基于服务器的计时器(可以在“工具箱”的“组件”选项卡上看到)、基于 Windows 的标准计时器(可以在“工具箱”的“Windows 窗体”选项卡上看到)和线程计时器(只能以编程方式使用)。 基于 Windows 的计时器从 Visual Basic 1.0 版起就存在于该产品中,并且基本上未做改动。该计时器针对在 Windows 窗体应用程序中使用而进行了优化。 基于服务器的计时器是传统的计时器为了在服务器环境上运行而优化后的更新版本。 线程计时器是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持。 在 Win32 体系结构中有两种类型的线程:UI 线程和辅助线程。UI 线程绝大多数时间处于空闲状态,等待消息循环中的消息到来。 一旦接收到消息,它们就进行处理并等待下一个消息到来。另外,辅助线程用来执行后台处理而且不使用消息循环。 Windows 计时器和基于服务器的计时器在运行时都使用 Interval 属性。线程计时器的时间间隔在 Timer 构造函数中设置。 计时器的设计目的各不相同,它们的线程处理明确地指出了这一点: 1.Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。Windows 计时器的精度限定为 55 毫秒。 这些传统计时器要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。对于 COM 组件来说,这样会降低性能。 2.基于服务器的计时器是为在多线程环境下与辅助线程一起使用而设计的。由于它们使用不同的体系结构,因此基于服务器的计时器可能比 Windows 计时器精确得多。 服务器计时器可以在线程之间移动来处理引发的事件。 3.对消息不在线程上发送的方案中,线程计时器是非常有用的。例如,基于 Windows 的计时器依赖于操作系统计时器的支持,如果不在线程上发送消息,与计时器相关的事件将不会发生。 在这种情况下,线程计时器就非常有用。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!
牧明 2019-12-02 02:17:14 0 浏览量 回答数 0

回答

手机上有很多云笔记app,大多支持云存储。可是把笔记放在别人的服务器上,总觉得不太安全。所以想把云笔记存在自己家。 有很多开源的云笔记,比如蚂蚁笔记(Leanote),nextcloud-note, 可是建立起来都比较麻烦,当然功能也是很强的。 leanote是golang写的,要mango数据库支持。nextcloud-note需要安装nextcloud云盘系统,需要php+mysql支持。 网上搜了一下, Android,有几款笔记支持webdav同步,比如"一本日记"(要付费),"可乐记"(免费),"易码"(免费)。 苹果,只找到一款免费的。收费的就很多了。"Notebooks for iPhone"(免费), "Notebooks Write and Organize"(收费) 软件自行搜索。 所以尝试自己建个webdav服务器。 尝试 NextCloud nextcloud 支持webdav协议。 买了台迷你pc(x86架构),装CentOS7,安装nginx,php-fpm,mariadb,然后装nextcloud,然后在nextcloud中装notepad插件。 手机端app: nextcloud-note,挺好的,支持markdown。支持多层目录。但只支持配置一个服务器地址。或者说,app只支持一个账号。不能多账号共存。 nextcloud,云盘,也不错,支持文件,图片,通讯录同步。支持多账号共存。 nextcloud 的 webdav 对易码的支持也很好。 nextcloud 云盘的安卓版 APP 本身就可以备份手机通讯录(打包为一个文件,上传到云盘目录) 易码,支持markdown,支持多账号共存。(这个云笔记,我很推荐) nextcloud 对 DAVdroid(DAVx5)2.6.3 支持很好。配置好账号后,通讯录,日历,个人提醒 就都可以同步了。 用了一段时间,发现云盘我基本上没什么需求,为了用个云笔记,建了这么个大东西,感觉挺浪费。 看了看leanote 也挺复杂的,还要装mango数据库。放弃。 尝试只建个webdav服务 apache2,nginx,lighttpd 都支持webdav。 apache2 比较臃肿,放弃。 所以只尝试 nginx 和 lighttpd 。 如果从源码安装,无论什么系统,无论 nginx 或 lighttpd 都能装好webdav服务。 以下是尝试使用系统的预编译包安装和配置。 CentOS7/8 上 从epel源安装nginx,为1.12.2版。(yum install) 发现有http_dav_module,但缺失http_dav_ext. 导致PROPFIND指令不支持。 从nginx-stable源安装nginx,1.16.1版,(yum install) 也是有http_dav_module,没有http_dav_ext。 CentOS7 , CentOS8 的预编译 nginx 都有 http_dav_module, 都缺失了 http_dav_ext。 从epel源装lighttpd,是1.4.54版,(yum install, centos7) 配置好后出错 Sorry, no sqlite3 and libxml2 support include,发现编译时缺少 --with-webdav-props 参数。导致PROPFIND指令没有按要求返回XML内容,而是返回了0字节。 debian-10/Armbian 手上还有台斐讯N1盒子,刷了armbian。debian10(buster)版。 装nginx,1.14.2,(apt install) 有http_dav_module 和 http_dav_ext 。 PUT,DELETE,MOVE,PROPFIND 支持OK。 不知道 COPY,OPTION 支持如何,因为没用到。 不过有bug,nginx要求MKCOL指令跟的目录名,必须以'/' 除号结尾。而易码app在创建目录时,目录名末尾不带除号。 MKCOL 的问题,可以通过配置 rewrite 解决。 所以,易码能用,只是要事先手动把目录创建好。易码保存和更新笔记,没问题。 手动 mkdir mynote/ mynote/assets/ 每个目录中要有assets目录,易码用assets来存放附件。 最终可以完美支持易码。 x86/64 debian-10 的预编译 nginx,完全和 armbian 的 debian10 一样。支持很好。 装lighttpd,1.4.53,(apt install) 有lighttpd-mod-webdav模块。 PUT,DELETE,MKCOL,PROPFIND 支持OK。 不知道 COPY,OPTION 支持如何,因为没用到。 有bug。但MOVE指令总是返回400 Bad request. (lighttpd独立运行在80或88,或通过nginx的proxy_pass到88口,MOVE指令都返回400) 好像是 1.4.53 的 bug, 1.4.54 就修复了。 所以,易码能同步获取更新,能创建新笔记。但不能修改旧笔记(会出错)。 openwrt-19.07 lighttpd-1.4.54 opkg install lighttpd lighttpd-mod-auth lighttpd-mod-authn_file lighttpd-mod-webdav 配置: document-root指向别的目录。其他配置参考本文后面的内容。 "易码"访问,能创建目录,创建新笔记,修改笔记,删除笔记。但不能同步获取笔记的更新,返回 "Not a valid DAV response" 原因是 PROPFIND "目录"(不带/结尾) 重定向 到 "目录/" 的返回码是200 而非 301,易码不能识别。 配置中加入 rewrite 可以解决。 opkg install lighttpd-mod-rewrite,然后配置中加入 url.rewrite-if-not-file=( "^/dav/(.*)$" => "/dav/$1/" ) 最终可以完美支持易码。 nginx-1.17.7 opkg install nginx-all-module (基础包nginx,没有webdav支持) 配置: root指向别的目录。其他配置参考本文后面的内容。 "易码"能用,只是要事先手动把目录创建好。MKCOL指令要求以'/'结尾,表现和 debian10 中的预编译 nginx 一样。 MKCOL 的问题,可以通过配置 rewrite 解决。 最终可以完美支持易码。 nginx 的 webdav 配置 (debian-10里的nginx对webdav支持很好) centos7/8 : (缺少"http_dav_ext",导致PROPFIND不支持,放弃) debian-10/armbian : nginx (支持很好) openwrt-19 : nginx-all-module (支持很好) yum install nginx 或者 apt install nginx 。 在vhost的 server { ... } 中,加上以下一段。则在 http(s)://youdomain.doman/dav/ 中打开webdav。 location ^~ /dav/ { if ($request_method = MKCOL) { # 解决 MKCOL 需要以'/'结尾 rewrite ^(.*[^/])$ $1/ break; } dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; # 上传文件的最大容量限制,0为不限制 client_max_body_size 20M; create_full_put_path on; dav_access user:rw group:rw all:r; auth_basic "Authorized Users Only"; auth_basic_user_file $document_root/dav/.htaccess.pw.basic ; satisfy any; } .htaccess.pw.basic 用 htpasswd 命令创建。(yum install apache2-utils/apt install apache2-utils) 如果使用"易码",则手动建立存放笔记的目录,同时在这个目录中创建"assets"目录。 如果用其他支持webdav的云笔记,则自己去确定,云笔记需要创建什么目录。 因为页面认证用的是basic,所以不建议用http,不安全。建议用https (ssl)。 ssl 的配置自行上网搜索。 nginx 运行在非标准端口(比如http/8001,https/8443),webdav的功能不影响,也能工作。 关于MKCOL需要以'/'结尾的问题 参考: Nginx WebDAV模块配置简述 , 修复Nginx的WebDAV功能 , 修复Nginx的WebDAV功能 if ($request_method = MKCOL) { rewrite ^(.*[^/])$ $1/ break; } lighttpd 的 webdav 配置 配置文档: Documentation Overview centos7/8 : yum install lighttpd (缺少"--with-webdav-props",导致PROPFIND有问题,放弃) debian-10/armbian : apt install lighttpd lighttpd-mod-webdav (MOVE指令有问题, 等升级到1.4.54再说, 暂时放弃) openwrt-19 : lighttpd (支持很好) 启用两个module: lighttpd-enable-mod auth webdav 修改 /etc/lighttpd/lighttpd.conf server.document-root = "/var/www/lighttpd" # 设置web的根目录 server.port = 88 # http 的端口,缺省为 80 lighttpd 的运行身份,一般不修改,就用缺省设置 server.username = "www-data" server.groupname = "www-data" #添加以下段落 $HTTP["url"] =~ "^/note($|/)" { webdav.activate = "enable" webdav.is-readonly = "disable" webdav.sqlite-db-name = "/..../webdav.db" auth.backend = "plain" auth.backend.plain.userfile = "/etc/lighttpd/webdavuser" auth.require = ( "" => ( "method" => "basic", "realm" => "Access DAV", "require" => "valid-user" ), ) # rewrite,是针对openwrt19.07中的 重定向问题。debian-10 不用此项配置。 url.rewrite-if-not-file=( "^/dav/(.*)$" => "/dav/$1/" ) } 创建目录 mkdir -p /var/www/lighttpd/note 修改目录的owner chown www-data.www-data note,(www-data为lighttpd的运行身份) 创建账号文件 touch /etc/lighttpd/webdavuser 设置账号文件的权限 chown root.www-data webdavuser; chmod 640 webdavuser webdavuser文件为纯文本文件,一行一个账号。用户名和密码之间用冒号隔开。 test:123456 user:password systemctl restart lighttpd 设置完成,http://xxx.xxx.xxx:88/note/ 目录就开启了webdav。 让 webdav 运行在 ssl 上 因为页面认证用的是basic,所以不建议用http,不安全。建议用https (ssl)。 方法一,用 lighttpd 就配置 lighttpd 的 ssl。用 nginx 就配 nginx 的 ssl。自行上网搜索。 方法二,nginx 配置好 ssl 的支持,然后用 nginx 做反向代理。 在nginx的配置文件中的 server { ... } 中加入, location ^~ /note/ { allow all; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_pass http://127.0.0.1:88/note/; } 注意,loction后的路径(note)要和proxy_pass中的路径相同。 方法三,lighttpd 配置好 ssl 支持,加上 mod_proxy 支持反向代理。请自行上网搜索。 方法四,apache2 配置好 ssl 支持,apache2 也支持反向代理。请自行上网搜索。 最后,把ssl的web,443口在路由器上做个映射(需公网ipv4)。 如果80和443标准端口不能用,也可以把https映射到8443这种非标准端口。 或者在路由器上允许转发(ipv6)。路由器支持ipv6就行。宽带运营商都已经提供ipv6了。国内三大手机运营商的4G网都有ipv6支持。 再配置个动态域名。 就可以设置"易码"app,添加webdav服务器。开心的写你的云笔记。 其他搭建webdav的方法: GO: parkomat 很多 golang 依赖包难以下载。 终于 build 成功。amd64的执行文件约9.7MB. 集成了DNS解析服务+web服务+webdav服务。 dns 解析配置简单,功能不错,可以用来负责解析一个域名(记录不多的话)。这样就不用装bind。 web,做个静态网站似乎也不错。 webdav,易码访问显示"400 Bad Request", parkomat 显示 "prop must not be empty" C语言: WebDAV-Daemon 1.1 配置比较麻烦 在项目目录中make之后, 把build目录中的rap和webdavd两个文件,复制到 /root/webdavd目录中。 把package-with/share复制到/root/webdavd目录中。 把package-with/pam.conf复制为/etc/pam.d/webdavd 写config.conf文件 83 none /root/webdavd/data /etc/mime.types /root/webdavd/rap webdavd /root/webdavd/share /root/webdavd/error.log /root/webdavd/access.log 执行 ./webdavd config.conf & 问题: MKCOL 命令能成功创建目录,但返回内容似乎不标准,不被"易码"接受。 MOVE 命令执行失败。 账号认证,缺省使用系统用户。如果要文件认证,则需要改pam文件,需要学习pam模块。 chroot-path只能指定为~或绝对路径,不支持类似~/data的格式。 GO: Simple Go WebDAV server 3.0.0 有binary包下载,直接就能用。有arm的包。 不会配置。总是返回"400 Bad Request" go-webdav 0.2.0 go build cmd/webdav-server/main.go 然后copy出来测试。 没有认证机制,"易码" 返回 "Not valid DAV response" webdavserver 1.0.3 go build 失败,好多依赖包下载不了。 终于 build 成功。amd64的执行文件约 8MB. 易码访问,显示"400 Bad Request"。 GO: The simple webdav server 0.3.0 有amd64的binary包,没有arm64的。 易码访问出错 "prop must not be empty" phpEasyVCS 用"易码"访问 测试页面 http://phpeasyvcs.sourceforge.net/demo/webdav.php ,失败。返回403错误。放弃。 phpdav (对webdav支持好) github上最后更新时间为 2019-5-13 代码中无用户认证机制。如要用户认证,则需依赖nginx或apache的认证。所以也不支持多用户。 PUT,DELETE,MKCOL,MOVE,PROPFIND 支持OK。对"易码"支持很好。 不知道 COPY,OPTION 支持如何,因为没用到。 只需要sqlite3支持,不需要其他数据库。 有一点小bug,不过不太影响。 PUT 指令时,Undefined index: Request-Body-File in /..xxx../handlers/Put.php on line 70 作者只试过装在网站的 root。不过我费了好大劲才装到二级目录。 项目的php文件放置的路径,不能包含下划线( _ )。 浏览器访问,当访问的路径末尾不带/时,页面左上角的"上级目录"会跳两层,链接不正确。 安装配置: 从github中把所有文件copy到本地目录。比如 /mydir/phpdav/ (这个路径中不能包含下划线) 保留 conf/ handlers/ library/ logs/ models/ interface/, 其他的没有用,可删。 mkdir -p logs/phpdav/debug; #这个目录中会生成log文件,不知道有什么用。 chown apache.apache logs/phpdav/debug; chown apache.apache library/db/sqlite; mv interface/ mydav/; #下文以及配置文件中,所有的"mydav"必须一样。 安装nginx,php72-fpm,配置方法自己搜索。 php72 需要 php72-pdo, php72-sqlite3, php72-mbstring, php72-xml, 几个包。 修改 conf/config.ini.php 中 $cloud_root='/mydir/dav-data' mkdir -p /mydir/dav-data/mydav; chmod apache.apache /mydir/dav-data/mydav; nginx的两个配置文件 phpdav.conf, php72-fpm.conf 如下。 把include phpdav.conf; 写入 nginx.conf 中的 server {..} 内,location / {..} 之前,即可。 这样就把 webdav 配置在 mydav 目录。通过访问 http://127.0.0.1/mydav/ 即可。 php72-fpm.conf location ~ .php(?:$|/) { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info if_not_empty; fastcgi_param SERVER_SOFTWARE phpdav-1.0; fastcgi_param REQUEST_ID $request_id; fastcgi_param REQUEST_BODY_FILE $request_body_file; } phpdav.conf location ^~ /mydav { root /mydir/phpdav; index index.php; include php7-fpm.conf; rewrite ^/(.*)$ /mydav/index.php last;
游客2q7uranxketok 2021-02-03 18:23:04 0 浏览量 回答数 0

问题

Windows服务器日常维护策略

一、windows系统帐号1.将administrator改名,如改为别名,如:boco_ofm;或者取中文名(这样可以为黑客攻击增加一层障碍)2.将guest改名为administrator作为陷阱帐户...
我的中国 2019-12-01 21:57:39 2665 浏览量 回答数 1

回答

遇到这种问题,我的回答总是一样的: 别瞎JB折腾了,在后台自己封装一次,然后在同一个域名之下调用吧! ######少了一个callback参数,并且服务返回的内容必须是callback包的###### 看下我的这个例子,我当初模仿京东和淘宝做单点登录,跨域问题处理 <script>varsuccess_count=0;varerror_count=0;$.ajax({type:"get",dataType:"jsonp",url:"http://sso:8080/getAllDomain?callback=?",crossDomain:true,success:function(domains){if(domains){$.each(domains,function(){$.ajax({type:"get",dataType:"jsonp",url:this,crossDomain:true,success:function(data){success_count++;console.log("success");},error:function(){error_count++;}});})}}});</script> 这是后端 @RequestMapping("getExitAllDomain")publicvoidgetExitAllDomain(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse){List<String>allDomain=newArrayList<String>();allDomain.add("http://sso:8080/delCookie?t=a:8080&callback=?");allDomain.add("http://sso:8080/delCookie?t=b:8080&callback=?");allDomain.add("http://sso:8080/delCookie?t=c:8080&callback=?");allDomain.add("http://sso:8080/delCookie?t=d:8080&callback=?");PrintWriterout=null;try{out=httpServletResponse.getWriter();}catch(IOExceptione){e.printStackTrace();}Stringcallback=httpServletRequest.getParameter("callback");out.println(callback+String.format("(%s);",JSON.toJSONString(allDomain)));}  ######如果用jsonp看下服务器返回的是不是回调函数类型,跨域建议使用cors###### 别人说设置jsonp是说在jquery的ajax方法的时候,你封装的那个不知道...###### 在jQuery的ajax方法下用jsonp,你那个封装方法虽然看起来差不多但是具体里面对跨域的处理不知道写了什么,只能自己另外做处理###### 先研究一下jsonp的实现方法再用###### 可以看我的这篇,https://my.oschina.net/tp123/blog/1506646 希望对你有帮助###### 解决了###### Stringorigin=request.getHeader( "Origin") ; if(StringUtils. isNotBlank(origin)){response.setHeader( "Access-Control-Allow-Origin" ,origin) ; //允许访问的域 response.setHeader( "Access-Control-Allow-Methods" , "POST,GET") ; //允许GET、POST的外域请求 response.setHeader( "Access-Control-Allow-Credentials" , "true") ; //允许请求带cookie到服务器 response.setContentType( "application/json;charset=utf-8") ; //设定JSON格式标准输出、及编码}
优选2 2020-06-09 15:44:15 0 浏览量 回答数 0

回答

在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行。因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行。必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情。如果你还没看过的话,我建议你看看Eqbal Quran的文章《Ruby中的并发和并行》。 在本文中,我们将会写一个小的Python脚本,用于下载Imgur上最热门的图片。我们将会从一个按顺序下载图片的版本开始做起,即一个一个地下载。在那之前,你得注册一个Imgur上的应用。如果你还没有Imgur账户,请先注册一个。 本文中的脚本在Python3.4.2中测试通过。稍微改一下,应该也能在Python2中运行——urllib是两个版本中区别最大的部分。 1、开始动手让我们从创建一个叫“download.py”的Python模块开始。这个文件包含了获取图片列表以及下载这些图片所需的所有函数。我们将这些功能分成三个单独的函数: get_links download_link setup_download_dir 第三个函数,“setup_download_dir”,用于创建下载的目标目录(如果不存在的话)。 Imgur的API要求HTTP请求能支持带有client ID的“Authorization”头部。你可以从你注册的Imgur应用的面板上找到这个client ID,而响应会以JSON进行编码。我们可以使用Python的标准JSON库去解码。下载图片更简单,你只需要根据它们的URL获取图片,然后写入到一个文件即可。 代码如下: import jsonimport loggingimport osfrom pathlib import Pathfrom urllib.request import urlopen, Request logger = logging.getLogger(__name__) def get_links(client_id): headers = {'Authorization': 'Client-ID {}'.format(client_id)} req = Request('https://api.imgur.com/3/gallery/', headers=headers, method='GET') with urlopen(req) as resp: data = json.loads(resp.readall().decode('utf-8')) return map(lambda item: item['link'], data['data']) def download_link(directory, link): logger.info('Downloading %s', link) download_path = directory / os.path.basename(link) with urlopen(link) as image, download_path.open('wb') as f: f.write(image.readall()) def setup_download_dir(): download_dir = Path('images') if not download_dir.exists(): download_dir.mkdir() return download_dir接下来,你需要写一个模块,利用这些函数去逐个下载图片。我们给它命名为“single.py”。它包含了我们最原始版本的Imgur图片下载器的主要函数。这个模块将会通过环境变量“IMGUR_CLIENT_ID”去获取Imgur的client ID。它将会调用“setup_download_dir”去创建下载目录。最后,使用get_links函数去获取图片的列表,过滤掉所有的GIF和专辑URL,然后用“download_link”去将图片下载并保存在磁盘中。下面是“single.py”的代码: import loggingimport osfrom time import time from download import setup_download_dir, get_links, download_link logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')logging.getLogger('requests').setLevel(logging.CRITICAL)logger = logging.getLogger(__name__) def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] for link in links: download_link(download_dir, link) print('Took {}s'.format(time() - ts)) if name == '__main__': main()注:为了测试方便,上面两段代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from time import sleep, timeimport sys, threading reload(sys)sys.setdefaultencoding('utf-8') def getNums(N): return xrange(N) def processNum(num): num_add = num + 1 sleep(1) print str(threading.current_thread()) + ": " + str(num) + " → " + str(num_add) if name == "__main__": t1 = time() for i in getNums(3): processNum(i) print "cost time is: {:.2f}s".format(time() - t1) 结果: <_MainThread(MainThread, started 4436)>: 0 → 1<_MainThread(MainThread, started 4436)>: 1 → 2<_MainThread(MainThread, started 4436)>: 2 → 3cost time is: 3.00s在我的笔记本上,这个脚本花了19.4秒去下载91张图片。请注意这些数字在不同的网络上也会有所不同。19.4秒并不是非常的长,但是如果我们要下载更多的图片怎么办呢?或许是900张而不是90张。平均下载一张图片要0.2秒,900张的话大概需要3分钟。那么9000张图片将会花掉30分钟。好消息是使用了并发或者并行后,我们可以将这个速度显著地提高。 接下来的代码示例将只会显示导入特有模块和新模块的import语句。所有相关的Python脚本都可以在这方便地找到this GitHub repository。 2、使用线程线程是最出名的实现并发和并行的方式之一。操作系统一般提供了线程的特性。线程比进程要小,而且共享同一块内存空间。 在这里,我们将写一个替代“single.py”的新模块。它将创建一个有八个线程的池,加上主线程的话总共就是九个线程。之所以是八个线程,是因为我的电脑有8个CPU内核,而一个工作线程对应一个内核看起来还不错。在实践中,线程的数量是仔细考究的,需要考虑到其他的因素,比如在同一台机器上跑的的其他应用和服务。 下面的脚本几乎跟之前的一样,除了我们现在有个新的类,DownloadWorker,一个Thread类的子类。运行无限循环的run方法已经被重写。在每次迭代时,它调用“self.queue.get()”试图从一个线程安全的队列里获取一个URL。它将会一直堵塞,直到队列中出现一个要处理元素。一旦工作线程从队列中得到一个元素,它将会调用之前脚本中用来下载图片到目录中所用到的“download_link”方法。下载完成之后,工作线程向队列发送任务完成的信号。这非常重要,因为队列一直在跟踪队列中的任务数。如果工作线程没有发出任务完成的信号,“queue.join()”的调用将会令整个主线程都在阻塞状态。 from queue import Queuefrom threading import Thread class DownloadWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: # Get the work from the queue and expand the tuple # 从队列中获取任务并扩展tuple directory, link = self.queue.get() download_link(directory, link) self.queue.task_done() def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] # Create a queue to communicate with the worker threads queue = Queue() # Create 8 worker threads # 创建八个工作线程 for x in range(8): worker = DownloadWorker(queue) # Setting daemon to True will let the main thread exit even though the workers are blocking # 将daemon设置为True将会使主线程退出,即使worker都阻塞了 worker.daemon = True worker.start() # Put the tasks into the queue as a tuple # 将任务以tuple的形式放入队列中 for link in links: logger.info('Queueing {}'.format(link)) queue.put((download_dir, link)) # Causes the main thread to wait for the queue to finish processing all the tasks # 让主线程等待队列完成所有的任务 queue.join() print('Took {}'.format(time() - ts))注:为了测试方便,上面的代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from Queue import Queuefrom threading import Threadfrom single import *import sys reload(sys)sys.setdefaultencoding('utf-8') class ProcessWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: # Get the work from the queue num = self.queue.get() processNum(num) self.queue.task_done() def main(): ts = time() nums = getNums(4) # Create a queue to communicate with the worker threads queue = Queue() # Create 4 worker threads # 创建四个工作线程 for x in range(4): worker = ProcessWorker(queue) # Setting daemon to True will let the main thread exit even though the workers are blocking # 将daemon设置为True将会使主线程退出,即使worker都阻塞了 worker.daemon = True worker.start() # Put the tasks into the queue for num in nums: queue.put(num) # Causes the main thread to wait for the queue to finish processing all the tasks # 让主线程等待队列完成所有的任务 queue.join() print("cost time is: {:.2f}s".format(time() - ts)) if name == "__main__": main() 结果: : 3 → 4: 2 → 3: 1 → 2 : 0 → 1cost time is: 1.01s在同一个机器上运行这个脚本,下载时间变成了4.1秒!即比之前的例子快4.7倍。虽然这快了很多,但还是要提一下,由于GIL的缘故,在这个进程中同一时间只有一个线程在运行。因此,这段代码是并发的但不是并行的。而它仍然变快的原因是这是一个IO密集型的任务。进程下载图片时根本毫不费力,而主要的时间都花在了等待网络上。这就是为什么线程可以提供很大的速度提升。每当线程中的一个准备工作时,进程可以不断转换线程。使用Python或其他有GIL的解释型语言中的线程模块实际上会降低性能。如果你的代码执行的是CPU密集型的任务,例如解压gzip文件,使用线程模块将会导致执行时间变长。对于CPU密集型任务和真正的并行执行,我们可以使用多进程(multiprocessing)模块。 官方的Python实现——CPython——带有GIL,但不是所有的Python实现都是这样的。比如,IronPython,使用.NET框架实现的Python就没有GIL,基于Java实现的Jython也同样没有。你可以点这查看现有的Python实现。 3、生成多进程多进程模块比线程模块更易使用,因为我们不需要像线程示例那样新增一个类。我们唯一需要做的改变在主函数中。 为了使用多进程,我们得建立一个多进程池。通过它提供的map方法,我们把URL列表传给池,然后8个新进程就会生成,它们将并行地去下载图片。这就是真正的并行,不过这是有代价的。整个脚本的内存将会被拷贝到各个子进程中。在我们的例子中这不算什么,但是在大型程序中它很容易导致严重的问题。 from functools import partialfrom multiprocessing.pool import Pool def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] download = partial(download_link, download_dir) with Pool(8) as p: p.map(download, links) print('Took {}s'.format(time() - ts))注:为了测试方便,上面的代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from functools import partialfrom multiprocessing.pool import Poolfrom single import *from time import time import sys reload(sys)sys.setdefaultencoding('utf-8') def main(): ts = time() nums = getNums(4) p = Pool(4) p.map(processNum, nums) print("cost time is: {:.2f}s".format(time() - ts)) if name == "__main__": main() 结果: <_MainThread(MainThread, started 6188)>: 0 → 1<_MainThread(MainThread, started 3584)>: 1 → 2<_MainThread(MainThread, started 2572)>: 3 → 4<_MainThread(MainThread, started 4692)>: 2 → 3 cost time is: 1.21s4、分布式任务你已经知道了线程和多进程模块可以给你自己的电脑跑脚本时提供很大的帮助,那么在你想要在不同的机器上执行任务,或者在你需要扩大规模而超过一台机器的的能力范围时,你该怎么办呢?一个很好的使用案例是网络应用的长时间后台任务。如果你有一些很耗时的任务,你不会希望在同一台机器上占用一些其他的应用代码所需要的子进程或线程。这将会使你的应用的性能下降,影响到你的用户们。如果能在另外一台甚至很多台其他的机器上跑这些任务就好了。 Python库RQ非常适用于这类任务。它是一个简单却很强大的库。首先将一个函数和它的参数放入队列中。它将函数调用的表示序列化(pickle),然后将这些表示添加到一个Redis列表中。任务进入队列只是第一步,什么都还没有做。我们至少还需要一个能去监听任务队列的worker(工作线程)。 第一步是在你的电脑上安装和使用Redis服务器,或是拥有一台能正常的使用的Redis服务器的使用权。接着,对于现有的代码只需要一些小小的改动。先创建一个RQ队列的实例并通过redis-py 库传给一台Redis服务器。然后,我们执行“q.enqueue(download_link, download_dir, link)”,而不只是调用“download_link” 。enqueue方法的第一个参数是一个函数,当任务真正执行时,其他的参数或关键字参数将会传给该函数。 最后一步是启动一些worker。RQ提供了方便的脚本,可以在默认队列上运行起worker。只要在终端窗口中执行“rqworker”,就可以开始监听默认队列了。请确认你当前的工作目录与脚本所在的是同一个。如果你想监听别的队列,你可以执行“rqworker queue_name”,然后将会开始执行名为queue_name的队列。RQ的一个很好的点就是,只要你可以连接到Redis,你就可以在任意数量上的机器上跑起任意数量的worker;因此,它可以让你的应用扩展性得到提升。下面是RQ版本的代码: from redis import Redisfrom rq import Queue def main(): client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] q = Queue(connection=Redis(host='localhost', port=6379)) for link in links: q.enqueue(download_link, download_dir, link) 然而RQ并不是Python任务队列的唯一解决方案。RQ确实易用并且能在简单的案例中起到很大的作用,但是如果有更高级的需求,我们可以使用其他的解决方案(例如 Celery)。 5、总结如果你的代码是IO密集型的,线程和多进程可以帮到你。多进程比线程更易用,但是消耗更多的内存。如果你的代码是CPU密集型的,多进程就明显是更好的选择——特别是所使用的机器是多核或多CPU的。对于网络应用,在你需要扩展到多台机器上执行任务,RQ是更好的选择。 6、注:关于并发、并行区别与联系并发是指,程序在运行的过程中存在多于一个的执行上下文。这些执行上下文一般对应着不同的调用栈。 在单处理器上,并发程序虽然有多个上下文运行环境,但某一个时刻只有一个任务在运行。 但在多处理器上,因为有了多个执行单元,就可以同时有数个任务在跑。 这种物理上同一时刻有多个任务同时运行的方式就是并行。 和并发相比,并行更加强调多个任务同时在运行。 而且并行还有一个层次问题,比如是指令间的并行还是任务间的并行。
xuning715 2019-12-02 01:10:11 0 浏览量 回答数 0

回答

在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行。因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行。必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情。如果你还没看过的话,我建议你看看Eqbal Quran的文章《Ruby中的并发和并行》。 在本文中,我们将会写一个小的Python脚本,用于下载Imgur上最热门的图片。我们将会从一个按顺序下载图片的版本开始做起,即一个一个地下载。在那之前,你得注册一个Imgur上的应用。如果你还没有Imgur账户,请先注册一个。 本文中的脚本在Python3.4.2中测试通过。稍微改一下,应该也能在Python2中运行——urllib是两个版本中区别最大的部分。 1、开始动手让我们从创建一个叫“download.py”的Python模块开始。这个文件包含了获取图片列表以及下载这些图片所需的所有函数。我们将这些功能分成三个单独的函数: get_links download_link setup_download_dir 第三个函数,“setup_download_dir”,用于创建下载的目标目录(如果不存在的话)。 Imgur的API要求HTTP请求能支持带有client ID的“Authorization”头部。你可以从你注册的Imgur应用的面板上找到这个client ID,而响应会以JSON进行编码。我们可以使用Python的标准JSON库去解码。下载图片更简单,你只需要根据它们的URL获取图片,然后写入到一个文件即可。 代码如下: import jsonimport loggingimport osfrom pathlib import Pathfrom urllib.request import urlopen, Request logger = logging.getLogger(__name__) def get_links(client_id): headers = {'Authorization': 'Client-ID {}'.format(client_id)} req = Request('https://api.imgur.com/3/gallery/', headers=headers, method='GET') with urlopen(req) as resp: data = json.loads(resp.readall().decode('utf-8')) return map(lambda item: item['link'], data['data']) def download_link(directory, link): logger.info('Downloading %s', link) download_path = directory / os.path.basename(link) with urlopen(link) as image, download_path.open('wb') as f: f.write(image.readall()) def setup_download_dir(): download_dir = Path('images') if not download_dir.exists(): download_dir.mkdir() return download_dir接下来,你需要写一个模块,利用这些函数去逐个下载图片。我们给它命名为“single.py”。它包含了我们最原始版本的Imgur图片下载器的主要函数。这个模块将会通过环境变量“IMGUR_CLIENT_ID”去获取Imgur的client ID。它将会调用“setup_download_dir”去创建下载目录。最后,使用get_links函数去获取图片的列表,过滤掉所有的GIF和专辑URL,然后用“download_link”去将图片下载并保存在磁盘中。下面是“single.py”的代码: import loggingimport osfrom time import time from download import setup_download_dir, get_links, download_link logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')logging.getLogger('requests').setLevel(logging.CRITICAL)logger = logging.getLogger(__name__) def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] for link in links: download_link(download_dir, link) print('Took {}s'.format(time() - ts)) if name == '__main__': main()注:为了测试方便,上面两段代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from time import sleep, timeimport sys, threading reload(sys)sys.setdefaultencoding('utf-8') def getNums(N): return xrange(N) def processNum(num): num_add = num + 1 sleep(1) print str(threading.current_thread()) + ": " + str(num) + " → " + str(num_add) if name == "__main__": t1 = time() for i in getNums(3): processNum(i) print "cost time is: {:.2f}s".format(time() - t1) 结果: <_MainThread(MainThread, started 4436)>: 0 → 1<_MainThread(MainThread, started 4436)>: 1 → 2<_MainThread(MainThread, started 4436)>: 2 → 3cost time is: 3.00s在我的笔记本上,这个脚本花了19.4秒去下载91张图片。请注意这些数字在不同的网络上也会有所不同。19.4秒并不是非常的长,但是如果我们要下载更多的图片怎么办呢?或许是900张而不是90张。平均下载一张图片要0.2秒,900张的话大概需要3分钟。那么9000张图片将会花掉30分钟。好消息是使用了并发或者并行后,我们可以将这个速度显著地提高。 接下来的代码示例将只会显示导入特有模块和新模块的import语句。所有相关的Python脚本都可以在这方便地找到this GitHub repository。 2、使用线程线程是最出名的实现并发和并行的方式之一。操作系统一般提供了线程的特性。线程比进程要小,而且共享同一块内存空间。 在这里,我们将写一个替代“single.py”的新模块。它将创建一个有八个线程的池,加上主线程的话总共就是九个线程。之所以是八个线程,是因为我的电脑有8个CPU内核,而一个工作线程对应一个内核看起来还不错。在实践中,线程的数量是仔细考究的,需要考虑到其他的因素,比如在同一台机器上跑的的其他应用和服务。 下面的脚本几乎跟之前的一样,除了我们现在有个新的类,DownloadWorker,一个Thread类的子类。运行无限循环的run方法已经被重写。在每次迭代时,它调用“self.queue.get()”试图从一个线程安全的队列里获取一个URL。它将会一直堵塞,直到队列中出现一个要处理元素。一旦工作线程从队列中得到一个元素,它将会调用之前脚本中用来下载图片到目录中所用到的“download_link”方法。下载完成之后,工作线程向队列发送任务完成的信号。这非常重要,因为队列一直在跟踪队列中的任务数。如果工作线程没有发出任务完成的信号,“queue.join()”的调用将会令整个主线程都在阻塞状态。 from queue import Queuefrom threading import Thread class DownloadWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: # Get the work from the queue and expand the tuple # 从队列中获取任务并扩展tuple directory, link = self.queue.get() download_link(directory, link) self.queue.task_done() def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] # Create a queue to communicate with the worker threads queue = Queue() # Create 8 worker threads # 创建八个工作线程 for x in range(8): worker = DownloadWorker(queue) # Setting daemon to True will let the main thread exit even though the workers are blocking # 将daemon设置为True将会使主线程退出,即使worker都阻塞了 worker.daemon = True worker.start() # Put the tasks into the queue as a tuple # 将任务以tuple的形式放入队列中 for link in links: logger.info('Queueing {}'.format(link)) queue.put((download_dir, link)) # Causes the main thread to wait for the queue to finish processing all the tasks # 让主线程等待队列完成所有的任务 queue.join() print('Took {}'.format(time() - ts))注:为了测试方便,上面的代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from Queue import Queuefrom threading import Threadfrom single import *import sys reload(sys)sys.setdefaultencoding('utf-8') class ProcessWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: # Get the work from the queue num = self.queue.get() processNum(num) self.queue.task_done() def main(): ts = time() nums = getNums(4) # Create a queue to communicate with the worker threads queue = Queue() # Create 4 worker threads # 创建四个工作线程 for x in range(4): worker = ProcessWorker(queue) # Setting daemon to True will let the main thread exit even though the workers are blocking # 将daemon设置为True将会使主线程退出,即使worker都阻塞了 worker.daemon = True worker.start() # Put the tasks into the queue for num in nums: queue.put(num) # Causes the main thread to wait for the queue to finish processing all the tasks # 让主线程等待队列完成所有的任务 queue.join() print("cost time is: {:.2f}s".format(time() - ts)) if name == "__main__": main() 结果: : 3 → 4: 2 → 3: 1 → 2 : 0 → 1cost time is: 1.01s在同一个机器上运行这个脚本,下载时间变成了4.1秒!即比之前的例子快4.7倍。虽然这快了很多,但还是要提一下,由于GIL的缘故,在这个进程中同一时间只有一个线程在运行。因此,这段代码是并发的但不是并行的。而它仍然变快的原因是这是一个IO密集型的任务。进程下载图片时根本毫不费力,而主要的时间都花在了等待网络上。这就是为什么线程可以提供很大的速度提升。每当线程中的一个准备工作时,进程可以不断转换线程。使用Python或其他有GIL的解释型语言中的线程模块实际上会降低性能。如果你的代码执行的是CPU密集型的任务,例如解压gzip文件,使用线程模块将会导致执行时间变长。对于CPU密集型任务和真正的并行执行,我们可以使用多进程(multiprocessing)模块。 官方的Python实现——CPython——带有GIL,但不是所有的Python实现都是这样的。比如,IronPython,使用.NET框架实现的Python就没有GIL,基于Java实现的Jython也同样没有。你可以点这查看现有的Python实现。 3、生成多进程多进程模块比线程模块更易使用,因为我们不需要像线程示例那样新增一个类。我们唯一需要做的改变在主函数中。 为了使用多进程,我们得建立一个多进程池。通过它提供的map方法,我们把URL列表传给池,然后8个新进程就会生成,它们将并行地去下载图片。这就是真正的并行,不过这是有代价的。整个脚本的内存将会被拷贝到各个子进程中。在我们的例子中这不算什么,但是在大型程序中它很容易导致严重的问题。 from functools import partialfrom multiprocessing.pool import Pool def main(): ts = time() client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] download = partial(download_link, download_dir) with Pool(8) as p: p.map(download, links) print('Took {}s'.format(time() - ts))注:为了测试方便,上面的代码可以用如下代码替代演示: coding=utf-8 测试utf-8编码 from functools import partialfrom multiprocessing.pool import Poolfrom single import *from time import time import sys reload(sys)sys.setdefaultencoding('utf-8') def main(): ts = time() nums = getNums(4) p = Pool(4) p.map(processNum, nums) print("cost time is: {:.2f}s".format(time() - ts)) if name == "__main__": main() 结果: <_MainThread(MainThread, started 6188)>: 0 → 1<_MainThread(MainThread, started 3584)>: 1 → 2<_MainThread(MainThread, started 2572)>: 3 → 4<_MainThread(MainThread, started 4692)>: 2 → 3 cost time is: 1.21s4、分布式任务你已经知道了线程和多进程模块可以给你自己的电脑跑脚本时提供很大的帮助,那么在你想要在不同的机器上执行任务,或者在你需要扩大规模而超过一台机器的的能力范围时,你该怎么办呢?一个很好的使用案例是网络应用的长时间后台任务。如果你有一些很耗时的任务,你不会希望在同一台机器上占用一些其他的应用代码所需要的子进程或线程。这将会使你的应用的性能下降,影响到你的用户们。如果能在另外一台甚至很多台其他的机器上跑这些任务就好了。 Python库RQ非常适用于这类任务。它是一个简单却很强大的库。首先将一个函数和它的参数放入队列中。它将函数调用的表示序列化(pickle),然后将这些表示添加到一个Redis列表中。任务进入队列只是第一步,什么都还没有做。我们至少还需要一个能去监听任务队列的worker(工作线程)。 第一步是在你的电脑上安装和使用Redis服务器,或是拥有一台能正常的使用的Redis服务器的使用权。接着,对于现有的代码只需要一些小小的改动。先创建一个RQ队列的实例并通过redis-py 库传给一台Redis服务器。然后,我们执行“q.enqueue(download_link, download_dir, link)”,而不只是调用“download_link” 。enqueue方法的第一个参数是一个函数,当任务真正执行时,其他的参数或关键字参数将会传给该函数。 最后一步是启动一些worker。RQ提供了方便的脚本,可以在默认队列上运行起worker。只要在终端窗口中执行“rqworker”,就可以开始监听默认队列了。请确认你当前的工作目录与脚本所在的是同一个。如果你想监听别的队列,你可以执行“rqworker queue_name”,然后将会开始执行名为queue_name的队列。RQ的一个很好的点就是,只要你可以连接到Redis,你就可以在任意数量上的机器上跑起任意数量的worker;因此,它可以让你的应用扩展性得到提升。下面是RQ版本的代码: from redis import Redisfrom rq import Queue def main(): client_id = os.getenv('IMGUR_CLIENT_ID') if not client_id: raise Exception("Couldn't find IMGUR_CLIENT_ID environment variable!") download_dir = setup_download_dir() links = [l for l in get_links(client_id) if l.endswith('.jpg')] q = Queue(connection=Redis(host='localhost', port=6379)) for link in links: q.enqueue(download_link, download_dir, link) 然而RQ并不是Python任务队列的唯一解决方案。RQ确实易用并且能在简单的案例中起到很大的作用,但是如果有更高级的需求,我们可以使用其他的解决方案(例如 Celery)。 5、总结如果你的代码是IO密集型的,线程和多进程可以帮到你。多进程比线程更易用,但是消耗更多的内存。如果你的代码是CPU密集型的,多进程就明显是更好的选择——特别是所使用的机器是多核或多CPU的。对于网络应用,在你需要扩展到多台机器上执行任务,RQ是更好的选择。 6、注:关于并发、并行区别与联系并发是指,程序在运行的过程中存在多于一个的执行上下文。这些执行上下文一般对应着不同的调用栈。 在单处理器上,并发程序虽然有多个上下文运行环境,但某一个时刻只有一个任务在运行。 但在多处理器上,因为有了多个执行单元,就可以同时有数个任务在跑。 这种物理上同一时刻有多个任务同时运行的方式就是并行。 和并发相比,并行更加强调多个任务同时在运行。 而且并行还有一个层次问题,比如是指令间的并行还是任务间的并行。
xuning715 2019-12-02 01:10:10 0 浏览量 回答数 0

回答

遇到这种问题,我的回答总是一样的: 别瞎 JB 折腾了,在后台自己封装一次,然后在同一个域名之下调用吧! ######少了一个callback参数,并且服务返回的内容必须是callback包的###### 看下我的这个例子,我当初模仿京东和淘宝做单点登录,跨域问题处理 <script> var success_count = 0; var error_count = 0; $.ajax({ type: "get", dataType: "jsonp", url: "http://sso:8080/getAllDomain?callback=?", crossDomain: true, success: function (domains) { if (domains) { $.each(domains, function () { $.ajax({ type: "get", dataType: "jsonp", url: this, crossDomain: true, success: function (data) { success_count++; console.log("success"); }, error: function () { error_count++; } }); }) } } }); </script> 这是后端 @RequestMapping("getExitAllDomain") public void getExitAllDomain(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) { List<String> allDomain = new ArrayList<String>(); allDomain.add("http://sso:8080/delCookie?t=a:8080&callback=?"); allDomain.add("http://sso:8080/delCookie?t=b:8080&callback=?"); allDomain.add("http://sso:8080/delCookie?t=c:8080&callback=?"); allDomain.add("http://sso:8080/delCookie?t=d:8080&callback=?"); PrintWriter out = null; try { out = httpServletResponse.getWriter(); } catch (IOException e) { e.printStackTrace(); } String callback = httpServletRequest.getParameter("callback"); out.println(callback + String.format("(%s);", JSON.toJSONString(allDomain))); }  ######如果用jsonp看下服务器返回的是不是回调函数类型,跨域建议使用cors###### 别人说设置jsonp是说在jquery的 ajax方法的时候,你封装的那个不知道...###### 在jQuery的ajax方法下用jsonp,你那个封装方法虽然看起来差不多但是具体里面对跨域的处理不知道写了什么,只能自己另外做处理###### 先研究一下jsonp的实现方法再用###### 可以看我的这篇,https://my.oschina.net/tp123/blog/1506646  希望对你有帮助###### 解决了###### String origin = request.getHeader("Origin"); if(StringUtils.isNotBlank(origin)){ response.setHeader("Access-Control-Allow-Origin", origin); // 允许访问的域 response.setHeader("Access-Control-Allow-Methods", "POST,GET");// 允许GET、POST的外域请求 response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许请求带cookie到服务器 response.setContentType("application/json; charset=utf-8"); // 设定JSON格式标准输出、及编码 }
爱吃鱼的程序员 2020-05-31 13:06:55 0 浏览量 回答数 0

问题

奇怪的SQL连接问题

我有两个应用程序,一个是标准的ASP.NET MVC C#4.5,另一个是标准的C#4.5 Windows应用程序。 它们都使用完全相同的连接字符串连接到同一SQL Server&#...
LiuWH 2020-01-03 10:56:35 2 浏览量 回答数 1

问题

阿里云Centos5.4(32位)系统优化教程

阿里云Centos 5.4 (32位)系统优化教程 本文是针对阿里云Centos 5.4(32位)系统的优化专门写的,如果是Centos 5.7(6...
ap6779g4h 2019-12-01 20:21:47 29336 浏览量 回答数 17

问题

使用SeasLog打造PHP项目中的高性能日志组件(一) 400 请求报错 

                                                                                                                        ...
kun坤 2020-05-30 16:12:25 0 浏览量 回答数 1

问题

分析型数据库发展历史/Release Note是什么?

版本变更历史(Release Note) V2.3.4(2017-09-12) 变更 Cache Table配置项类型cacheTableRowlimit;变更 MasterConfig中mqNetworkPart...
nicenelly 2019-12-01 21:24:52 1080 浏览量 回答数 0

问题

分析型数据库发展历史/Release Note是什么?

版本变更历史(Release Note) V2.3.4(2017-09-12) 变更 Cache Table配置项类型cacheTableRowlimit;变更 MasterConfig中mqNetworkPart...
nicenelly 2019-12-01 21:08:38 1273 浏览量 回答数 0

问题

对症下药:Tomcat停机过程分析与线程处理方法

工作中经常遇到因为Tomcat shutdown时自身创建的线程没有及时停止而引起的各种莫名其妙的报错,这篇文章将通过对Tomcat停机过程的梳理,讨论产生这些错误的原因,同时提出了两个可行的解决办...
驻云科技 2019-12-01 21:36:46 4001 浏览量 回答数 0

回答

一、 Afinal官方介绍:Afinal是一个Android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。详情请通过以下网址查看。Afinal 是一个android的sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题。Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。项目地址:https://github.com/yangfuhai/afinal功能:一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivity,我们可以通过注解的方式进行绑定ui和事件。通过finalBitmap,我们可以方便的加载bitmap图片,而无需考虑oom等问题。通过finalDB模块,我们一行代码就可以对android的sqlite数据库进行增删改查。通过FinalHttp模块,我们可以以ajax形式请求http数据。优点:功能比较全面,文档完善,代码效率比较高。缺点:没有项目demo,框架的时间比较久,代码冗余比较多(这也是无可避免的),文档比较老跟不上代码更新进度。(这个评价是其他高人评的,他自己也有写了框架。我个人觉得以前Afinal算是经典了 用的人多)。二、 xUtilsGit地址:https://github.com/wyouflf/xUtilsxUtils:可以说是Afinal的升级版。xUtils 包含了很多实用的android工具。xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响...xUitls 最低兼容android 2.2 (api level 8)三、 ThinkAndroid项目地址:https://github.com/white-cat/ThinkAndroid官方介绍:ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent的http模块,具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能,在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类,如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具优点:功能看起来比较完善。个人觉得名字起的好。缺点:从2013年就停止维护了,没有项目文档。四、 LoonAndroid官方介绍:如果你想看ui方面的东西,这里没有,想要看牛逼的效果这里也没有。这只是纯实现功能的框架,它的目标是节省代码量,降低耦合,让代码层次看起来更清晰。整个框架一部分是网上的,一部分是我改的,为了适应我的编码习惯,还有一部分像orm完全是网上的组件。在此感谢那些朋友们。 整个框架式的初衷是为了偷懒,之前都是一个功能一个jar,做项目的时候拉进去,这样对于我来说依然还是比较麻烦。最后就导致我把所有的jar做成了一个工具集合包。 有很多框架都含有这个工具集合里的功能,这些不一定都好用,因为这是根据我个人使用喜欢来实现的,如果你们有自己的想法,可以自己把架包解压了以后,源码拉出来改动下。 目前很多框架都用到了注解,除了androidannotations没有入侵我们应用的代码以外,其他的基本上都有,要么是必须继承框架里面的activity,要么是必须在activity的oncreat里面调用某个方法。 整个框架式不同于androidannotations,Roboguice等ioc框架,这是一个类似spring的实现方式。在整应用的生命周期中找到切入点,然后对activity的生命周期进行拦截,然后插入自己的功能。开源地址:https://github.com/gdpancheng/LoonAndroid功能:1自动注入框架(只需要继承框架内的application既可)2图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性)3网络请求模块(继承了基本上现在所有的http请求)4 eventbus(集成一个开源的框架)5验证框架(集成开源框架)6 json解析(支持解析成集合或者对象)7 数据库(不知道是哪位写的 忘记了)8 多线程断点下载(自动判断是否支持多线程,判断是否是重定向)9 自动更新模块10 一系列工具类有点:功能多缺点:文档方面五、 KJFrameForAndroid项目地址:https://github.com/kymjs/KJFrameForAndroid官方介绍:KJFrameForAndroid 又叫KJLibrary,是一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用;KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。我们提倡用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。功能:一个android的orm 和 ioc 框架。同时封装了android中的Bitmap与Http操作的框架,使其更加简单易用; KJFrameForAndroid开发框架的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全的开发APP。总共分为五大模块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。优点:功能比较全面,代码效率很高,文档完善,有项目demo,出来的比较晚借鉴了很多大型框架经验。缺点:项目文档是html页面,查看起来很不方便,项目交流平台没多少人说话(难道大神都是不说话的?)(这两个评价是KJFrameForAndroid的作者对自己的评价,个人觉得作者是个天才。他的评价可能刚写完网上发布后写的。我在给他更新评价。因为现在已经过去了几个月一直在时不时更新。功能很全,项目文档也很全面,而且代码里注释最多 这方面这个很难得。交流平台人很多挺热闹,作者希望更热闹这样框架越来越完善。对于初学者希望看到Demo更完善)六、 dhroid官方介绍:dhroid 是基于android 平台, 极速开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展.使你更快,更好的开发商业级别应用开源地址: http://git.oschina.net/tengzhinei/dhroid功能:1.Ioc容器: (用过spring的都知道)视图注入,对象注入,接口注入,解决类依赖关系2.Eventbus: android平台事件总线框架,独创延时事件,事件管理轻松3.Dhnet: 网络http请求的解决方案,使用简单,减少代码,自带多种网络访问缓存策略4.adapter模块: 数据绑定轻松,不用写多余的adapter,天生网络支持(一行代码搞定加载,刷新问题)5.DhDb: android中sqlite的最轻量orm框架(增删改查轻松搞定)6.Perference: android自带Perference 升级版,让你的Perference更强大,更方便工具集合 JSONUtil(安全处理json),ViewUtil(数据绑定更快) ThreadWorker(异步任务工具)...优点:功能全面,有demo,作者也是为公司开发的框架。缺点:文档方面现在不是很好,就eoe上的那些。七、 SmartAndroid项目地址:http://www.aplesson.com/smartAndroid/demos官方介绍:SmartAndroid是一套给 Android开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 SmartAndroid可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。功能:SmartAndroid 拥有全范围的类库,可以完成大多数通常需要的APP开发任务,包括: 异步网络操作相关所有功能、强大的图片处理操作、轻量级ORM数据库Sqlite库、zip操作 、动画特效、Html等解析采集、事件总线EventBus/Otto、Gson(Json)、AQuery、主流所有UI控件(例如:ActionbarSherlock,SlidingMenu,BottomView,Actionbar,DragListView等10多种UI库)等。优点:功能非常全,超出你索要、文档完善(作者很全面,官方网站是web响应式网站,框架里功能有UI各种特效应该最全了,一直更新中)缺点:jar包大点?(功能多不可避免,不是问题),在线文档(随响应式的手机访问也方便,但是网速慢就不好了,页面打开不是很流畅)八、 andBase官方介绍:andbase是为Android开发者量身打造的一款开源类库产品开源地址:https://code.jd.com/zhaoqp2010_m/andbase功能:1.andbase中包含了大量的开发常用手段。如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了代码的维护性与开发高效性,能很好的规避由于开发疏忽而导致常犯的错误。2.andbase封装了大量的常用控件。如list分页,下拉刷新,图片轮播,表格,多线程下载器,侧边栏,图片上传,轮子选择,图表,Tab滑动,日历选择器等。3.强大的AbActivity,您没有理由不继承它。继承它你能够获得一个简单强大可设置的操作栏,以及一系列的简单调用,如弹出框,提示框,进度框,副操作栏等。4.提供效率较高图片缓存管理策略,使内存大幅度节省,利用率提高,效率提高。程序中要管理大量的图片资源,andbase提供简单的方法,几步完成下载与显示,并支持缩放,裁剪,缓存功能。5.封装了大量常见工具类。包括日期,字符,文件,图片等各种处理函数,多而全。6.用andbase大量减少handler的使用,而采用回调函数,代码更整洁。handler会产生大量代码,并且不好维护,andbase对handler进行了封装。7.简单轻量支持注解自动建表的ORM框架(支持一/多对多的关联操作)。写sql,建表,工作量大,andbase提供更傻瓜异步增删改查工具类。8.异步请求http框架,网络请求标准化,支持文件上传下载,get,post,进度显示。包含了异步与http请求的工具类,实用。9.热情的支持群体。优点:功能很全,demo做的好 、API文档完善、接近完美缺点:希望文档更详细些。九、 AndroidAnnotations项目地址:https://github.com/excilys/androidannotations功能:完全注解框架,一切皆为注解:声明控件,绑定控件,设置监听,setcontentview,长按事件,异步线程,全部通过注解实现。优点:完全的注解,使开发起来更加便利,程序员写的代码也更少。缺点:文档是全英文的加上功能比较少没有具体研究,由于一切都是注解,感觉效率不高,不过根据官方介绍说并不是使用的反射加载,所以效率比一般注解高很多。十、 volley项目地址: https://github.com/smanikandan14/Volley-demo功能:Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮异步加载网络图片、网络数据优点:Google官方推荐,请看去年的开发者大会介绍。缺点:功能比较少,只有网络数据加载和网络图片加载十一、 android-async-http项目地址:https://github.com/loopj/android-async-http文档介绍:http://loopj.com/android-async-http/ (1) 在匿名回调中处理请求结果 (2) 在UI线程外进行http请求 (3) 文件断点上传 (4) 智能重试 (5) 默认gzip压缩 (6) 支持解析成Json格式 (7) 可将Cookies持久化到SharedPreferences 有点:很简单很实用缺点:功能比较少, (只是针对的功能不是什么缺点)最后来个总结吧: 以上的开发框架网上都可以下载源码,也有demo实例的。当然我没分析和对比框架的效率性能,但是都非常实用,其作者大部分是个人,都是些牛人或天才。你可以直接使用,也可以把有用跳出来用,至少有很多使用工具。如果有发现Bug,作者希望把bug交给他。 Afinal 和 xUtils简单实用但是demo和更新的问题。 KJFrameForAndroid 算是新出的,功能也多,效率也应该好,代码也注释多 用起来也很方便。Dhroid 作者自己公司的框架,也可以直接请教。SmartAndroid 强劲的框架功能俱全。andBase 出来早各个方面算是完整的吧。转自:http://blog.csdn.net/buddyuu/article/details/40503471
元芳啊 2019-12-02 00:55:54 0 浏览量 回答数 0

回答

做网页时,我们通常需要考虑到不同电脑屏幕尺寸,以及不同手机屏幕大小等问题,解决样式发生改变的情况,那么如何解决呢?现在主要是采用自适应来解决高度,宽度的,以及图片自适应问题,下面就PC端和移动端来总结一下,通常进行自适应高度和宽度,图片时,一般与页面的布局存在关系。 1、最小尺寸分辨率1024*768(传统17寸显示器),则可以采用940px、960px、或者常用的980px作为最小宽度 2、1024768之后稍大的分辨率就是1280768了,则可以采用1200px或者1220px作为稍大的网页宽度 3、支持css3、html5的高级浏览器可以利用CSS3 Media Queries让网页在不同分辨率下自动调节布局标签 4、不支持css3、html5的脑残浏览器特别是<=ie8系列则需要用js以及resize事件来控制html的布局标签宽度了 5、宽度自适应需要对每个显示模块进行不同宽度的计算,在做html布局时需要大量的计算与适配。 6、宽度自适应为不同宽度显示器写布局元素时常用的css 下面我们看下,如何用js和css来自适应屏幕的大小。 一:了解高度和宽度的基础 下面用图片来说明: 网页可见区域高宽为:document.body.clientHeight||document.body.clientWidth 网页正文的区域高宽为:document.body.scrollHeight||document.body.scrollWidth(包括滚轮的长度) 网页被卷去的上左区域:document.body.scrollTop||document.body.scrollLeft 二: css自适应高度 1.两栏布局,左边固定,右边宽度自适应 方法一: //html部分 左边 正文 //css部分 *{margin:0;padding:0} #left{float:left;width:200px;background:red;} #bodyText{margin-left:200px;background:yellow; 方法二: //html部分 左边 正文 //css部分 #left{float:left;width:200px;background:red;margin-right:-100%;} #body{width:100%;float:left;} #bodyText{margin-left:200px;background:yellow;} 2.三栏布局,两边定宽,中间自适应宽度 方法一: <div id="left">左边</div>----注意和div的位置有关系 <div id="right">右边</div> <div id="center">中间</div> //css部分 #left{width:200px;background:red;float:left;} #center{width:auto;background:blue;} #right{width:200px;background:yellow;float:right;} 方法二: html部分: <div id="body"> <div id="center">中间</div> </div> <div id="left">左边</div> <div id="right">右边</div> css部分: #body{width:100%;float:left;} //设置浮动和width:100% #body #center{background:red;margin-left:200px;margin-right:300px;} //margin-left:100%的使用方法 #left{width:200px;background:yellow;margin-left:-100%;float:left} #right{width:300px;background:blue;margin-left:-300px;float:left} -----如果设置为margin-left:-100%,则会跑到body的左边。 -----如果设置为margin-left:-300px(即right的宽度),则会跑到body的右边 3.关于最小宽度和最大宽度 这里依然结合布局来看,如下面的代码:自适应宽度,从而改变布局。 //html部分 <div id='container'> <div class='one'></div> <div class='two'></div> <div class='three'></div> </div> //css部分 #container{width:100%;} .one{width:20%;background:red;} .one,.two,.three{float:left; height:100px;} .two{width:60%;background:yellow;} .three{width:20%;background:blue;} @media (max-width:800px){--如果浏览器小于800px .one{width:40%;} .two{width:60%} .three{width:100%} } @media (max-width:400px)--如果浏览器宽度小于400px { .one{width:100%} .two{width:100%} .three{width:100%} } 理解什么叫最小宽度和最大宽度,最小宽度指为元素设置的最小宽度,到达最小宽度后,缩放文本不会起到任何作用 最大宽度是所有元素所能达到的一个上限,不能再继续往上增加。 三: css处理自适应高度 //html部分代码 <div id="fit"></div> //css代码 html,body{margin:0;height:100%;} #fit{width:200px;background:yellow;height:100%;border:1px solid red;} --这里同时给html和body加样式,是为了兼容各大浏览器。 IE 处于混杂模式时,body以窗口为高度参照,body设置为100%就可以使得页面和窗口一样高,body里面的嵌套div也可以扩展到窗口高度, 这样的话可以使布局适应浏览器窗口大小。窗体 》body》div (html ,body {overflow:scroll} 一层滚动条) 但是当处于标准模式时,body以html标签为高度参照,html标签才以窗口为参照,所以仅仅body 100%,并不能使它的子div100% 占据整个屏幕 还要使得 html 100%使得 html获得窗口大小才行。窗体》html》body》div (html ,body {overflow:scroll} 两层滚动条 ,html的滚动条从来不会用到) 父级随子级高度变化而自适应变化与子级随父级高度变化而变化 <div id="fj"> 我是父级 <div id="zj1">我是子级1</div> <div id="zj2">我是子级2</div> </div> //css部分 #fj{border:4px solid red;} #zj1{border:2px solid yellow;} #zj2{border:2px solid blue;}----这种情况下,父级高度随着子级div的高度自适应的改变 如果子div使用了float属性,此时已经脱离标准流,父div不会随内容的高度变化而变化,解决的办法是在浮动的div下面,加一个空div,设置clear属性both <div id="fj"> 我是父级 <div id="zj1">我是子级11111111111111111111111111</div> <div id="zj2">我是子级222222222222222222222222222222222222222222 222222222222222222222222222</div> <div id="clear" style="clear:both"></div>------如果去掉这句话,则父级div高度,不会随着子级的高度变化而变化 </div> //css部分 #fj{border:4px solid black;} #zj1{border:2px solid yellow;float:left} #zj2{border:2px solid blue;float:left} 高度的自适应的方法还有很多,这里不再列举。像height:auto等等。 四:js处理高度和宽度自适应问题 <div id="div1" >222222222222222222222</div> //js部分 function setHeight(obj) { var temHeight=null; //FF if(window.innerHeight) { temHeight=window.innerHeight;//包括页面高度和滚动条高度 } else { temHeight=document.body&&document.body.clientHeight; } if(temHeight>document.body.clientHeight)//页面高度 { oDiv.style.height=temHeight+"px"; } else { oDiv.style.height=document.body.clientHeight+"px"; } } window.onload=function() { var oDiv=document.getElementById("div1"); getHeight(oDiv); } 宽度自适应代码: function setWidth(obj) { var screenWidth = window.screen.width; var width; var imgURL ; if (screenWidth >= 1440) { width = "1400px"; imgURL = "1400.png";//设置不同分辨率下的图片 } else if (1024 < screenWidth && screenWidth < 1440) { width = "1200px"; imgURL = "1200.png"; } else { width = "980px"; imgURL = "980.png"; } obj.style.width=width ; obj.style.backgroundImage="url(" + imgURL + ")"; }) 五:移动端的自适应高度和宽度 移动端的相对要简单些,首先,在网页代码的头部,加入一行viewport标签。 <meta name=”viewport” content=”width=device-width, initial-scale=1″ /> viewport是网页默认的宽度和高度,上面的意思表示,网页的宽度默认等于设备屏幕的宽度,原始缩放比例为1,即网页初始大小占屏幕面积的100%。 1:由于网页会根据屏幕宽度调整布局,所以不能使用绝对宽度的布局,也不能使用具有绝对宽度的元素。这一条非常重要。具体说,CSS代码不能指定像素宽度:width:xxx px;只能指定百分比宽度:width: xx%;或者width:auto; 2:一般使用em,尽量少使用px字体 3:使用流动布局 4:自适应网页设计”的核心,就是CSS3引入的media query模块。下载地址: http://download.csdn.net/download/song_121292057/8031781 自动探测屏幕宽度,然后加载相应的CSS文件。 <link rel="stylesheet" type="text/css" media="screen and (max-device-width: 400px)" href="style.css" /> -------当屏幕小于400时,就加载style.css这个文件 5:除了用html标签加载CSS文件,还可以在现有CSS文件中加载。 @import url("style2.css") screen and (max-device-width: 800px);//当小于800px屏幕时,就加载style2.css文件 6:图片的自动缩放,比较简单。只要一行CSS代码:img{ max-width: 100%;}建议根据不同的屏幕分辨率,加载不同大小像素的图片。 移动端的自适应,大体上差不多就这么多,主要核心是利用mediaquery,根据不同的屏幕大小,实现不同的布局。代码可看上面的列子。这里不再重复写。
问问小秘 2020-05-12 18:08:22 0 浏览量 回答数 0

问题

云服务器 ECS MySQL 忘记 root 密码解决办法是什么

自建 MySQL 数据库如果忘记了用户密码该如何操作,以下分别介绍 Linux 和 Windows 系统下的操作办法: Linux MySQL root 密码忘记了如何操作Windows MySQL root 密...
boxti 2019-12-01 21:57:38 2437 浏览量 回答数 0

回答

原因 1:性能 Go语言的9大优势和3大缺点 Go 极其地快。其性能与 Java 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍。以下是 Go 与 Java 之间的基准比较: Go语言的9大优势和3大缺点 Go语言的9大优势和3大缺点 Go语言的9大优势和3大缺点 Go语言的9大优势和3大缺点 原因 2:语言性能很重要 对很多应用来说,编程语言只是简单充当了其与数据集之间的胶水。语言本身的性能常常无关轻重。 但是 Stream 是一个 API 提供商,服务于世界 500 强以及超过 2 亿的终端用户。数年来我们已经优化了 Cassandra、PostgreSQL、Redis 等等,然而最终抵达了所使用语言的极限。 Python 非常棒,但是其在序列化/去序列化、排序和聚合中表现欠佳。我们经常会遇到这样的问题:Cassandra 用时 1ms 检索了数据,Python 却需要 10ms 将其转化成对象。 原因 3:开发者效率&不要过于创新 看一下绝佳的入门教程《开始学习 Go 语言》(http://howistart.org/posts/go/1/)中的一小段代码: package main type openWeatherMap struct{}func (w openWeatherMap) temperature(city string) (float64, error) { resp, err := http.Get("http://api.openweathermap.org/data/2.5/weather?APPID=YOUR_API_KEY&q=" + city) if err != nil { return 0, err } defer resp.Body.Close() var d struct { Main struct { Kelvin float64 json:"temp" } json:"main" } if err := json.NewDecoder(resp.Body).Decode(&d); err != nil { return 0, err } log.Printf("openWeatherMap: %s: %.2f", city, d.Main.Kelvin) return d.Main.Kelvin, nil} 如果你是一个新手,看到这段代码你并不会感到吃惊。它展示了多种赋值、数据结构、指针、格式化以及内置的 HTTP 库。 当我第一次编程时,我很喜欢使用 Python 的高阶功能。Python 允许你创造性地使用正在编写的代码,比如,你可以: 在代码初始化时,使用 MetaClasses 自行注册类别 置换真假 添加函数到内置函数列表中 通过奇妙的方法重载运算符 毋庸置疑这些代码很有趣,但也使得在读取其他人的工作时,代码变得难以理解。 Go 强迫你坚持打牢基础,这也就为读取任意代码带来了便利,并能很快搞明白当下发生的事情。 注意:当然如何容易还是要取决于你的使用案例。如果你要创建一个基本的 CRUD API,我还是建议你使用 Django + DRF,或者 Rails。 原因 4:并发性&通道 Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。 创建 Goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。你可以借助通道实现 goroutines 之间的通信。Go 运行时间可以表示所有的复杂性。Goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 CPU 内核,并处理并发的 IO——所有不带有复杂的开发。相较于 Python/Java,在一个 goroutine 上运行一个函数需要最小的样板代码。你只需使用关键词「go」添加函数调用: package main import ( "fmt" "time")func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) }}func main() { go say("world") say("hello")} Go 的并发性方法非常容易上手,相较于 Node 也很有趣;在 Node 中,开发者必须密切关注异步代码的处理。 并发性的另一个优质特性是竞赛检测器,这使其很容易弄清楚异步代码中是否存在竞态条件。下面是一些上手 Go 和通道的很好的资源: https://gobyexample.com/channels https://tour.golang.org/concurrency/2 http://guzalexander.com/2013/12/06/golang-channels-tutorial.html https://www.golang-book.com/books/intro/10 https://www.goinggo.net/2014/02/the-nature-of-channels-in-go.html 原因 5:快速的编译时间 当前我们使用 Go 编写的最大微服务的编译时间只需 6 秒。相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。我热爱击剑,但是当我依然记得代码应该做什么之时,事情已经完成就更好了。 Go语言的9大优势和3大缺点 Go 之前的代码编译 原因 6:打造团队的能力 首先,最明显的一点是:Go 的开发者远没有 C++和 Java 等旧语言多。据知,有 38% 的开发者了解 Java,19.3% 的开发者了解 C++,只有 4.6% 的开发者知道 Go。GitHub 数据表明了相似的趋势:相较于 Erlang、Scala 和 Elixir,Go 更为流行,但是相较于 Java 和 C++ 就不是了。 幸运的是 Go 非常简单,且易于学习。它只提供了基本功能而没有多余。Go 引入的新概念是「defer」声明,以及内置的带有 goroutines 和通道的并发性管理。正是由于 Go 的简单性,任何的 Python、Elixir、C++、Scala 或者 Java 开发者皆可在一月内组建成一个高效的 Go 团队。 原因 7:强大的生态系统 对我们这么大小的团队(大约 20 人)而言,生态系统很重要。如果你需要重做每块功能,那就无法为客户创造收益了。Go 有着强大的工具支持,面向 Redis、RabbitMQ、PostgreSQL、Template parsing、Task scheduling、Expression parsing 和 RocksDB 的稳定的库。 Go 的生态系统相比于 Rust、Elixir 这样的语言有很大的优势。当然,它又略逊于 Java、Python 或 Node 这样的语言,但它很稳定,而且你会发现在很多基础需求上,已经有高质量的文件包可用了。 原因 8:GOFMT,强制代码格式 Gofmt 是一种强大的命令行功能,内建在 Go 的编译器中来规定代码的格式。从功能上看,它类似于 Python 的 autopep8。格式一致很重要,但实际的格式标准并不总是非常重要。Gofmt 用一种官方的形式规格代码,避免了不必要的讨论。 原因 9:gRPC 和 Protocol Buffers Go 语言对 protocol buffers 和 gRPC 有一流的支持。这两个工具能一起友好地工作以构建需要通过 RPC 进行通信的微服务器(microservices)。我们只需要写一个清单(manifest)就能定义 RPC 调用发生的情况和参数,然后从该清单将自动生成服务器和客户端代码。这样产生代码不仅快速,同时网络占用也非常少。
游客2q7uranxketok 2021-02-07 20:07:03 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 1. 各型号主机的标准流量。 产品名称 流量标准值(GB) 共享虚拟主机普惠版 10 云虚拟主机基础版 20 云虚拟主机高级版 30 虚拟主机共享经济版 20 X享主机-X3 8 X享主机-X5 15 M享主机-M1 10 M享主机-M2 20 M享主机-M3 30 M享主机-M5 40 G享主机-G1 50 G享主机-G5 80 G享主机-G10 100 L享主机-L1 80 L享主机-L5 100 J享主机-J1 50 J享主机-J2 80 Ⅲ型空间 30 Ⅲ型.net 30 Ⅳ型空间 30 V型空间 50 VI型空间 100 III型JAVA 30 G享主机-G1-L 30   限制流量只是对个别超大流量用户的限制,是为了更好的为客户服务,保证服务器的稳定运行。 2.用户站点流量的计算公式。总流量=访问流量+下载流量= Page view 值 x 页面大小+下载文件大小 x 下载次数。  PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之合。(例如:该网站一天有100个访问者,每个访问者浏览的页面数量平均为5页,则每天的PV是100×5)。 Hits值:是指对每个页面元素的请求数量。(一个页面中任何一个图片或者flash文件都算是一个页面元素)。 3.为什么控制流量? 由于虚拟主机是多个用户的网站共享一台物理服务器资源。如果一个网站流量太大,不仅严重占用网络带宽资源,而且还加重了整台服务器负荷,影响到其它用户。所以,为了保证服务器的正常工作,我们需要对虚拟主机的流量进行控制。 4.网站出现流量超标后如何处理。如果网站出现流量超标情况,建议通过主机管理控制台的访问统计报告分析超流量原因,并根据原因做有针对性的操作。超流量的类型可以分为以下几种情况: 正常流量: 如果您的网站访问量很大,就会产生较多的流量,当流量不足时建议您及时到用户中心购买 云虚拟主机流量 或者升级到独享虚拟主机,独享虚机主机不限制流量。 异常流量原因分析: 网站被盗链:如果您的网站在线人数不是很多,那么就应该检查您站点内的内容,是否有图片、FLASH、音乐、下载文件、电影等比较引人注目的文件被别人盗链使用。 建议解决方案:如果发现可疑的被人盗链接的文件,请修改对应的网页文件,禁止盗用 IP 访问您的网站。或者彻底删除不必要的大文件。 开源建站软件漏洞:一般开源的建站软件如果存在漏洞,很容易被黑客利用发起攻击,导致网站流量过大。目前已经发现织梦 CMS(即 dede)存在严重漏洞。  网站包含音频,视频文件:如果您网站提供数据下载(如:.mp3,.rar,.zip.exe等)或者是您的网站提供视频、音乐等文件的播放或下载(如:背景音乐,宣传广告,FLASH 等),因为此类文件很大,会耗费大量流量。 建议解决方案:删除不必要的大文件,如果因业务需要不能删除,建议升级到独享虚拟主机,独享虚拟主机不限制流量。 网站做过搜索引擎推广:如果您在某些搜索引擎上做过某些推广或宣传,搜索引擎会大量访问您的网站,从而造成大流量,请您做出相应限制或升级主机。 建议解决方案:修改 Robots 文件,限制搜索引擎可以访问的资源,但这可能会影响您的网站推广效果,或者升级到独享虚机主机。 Robots文件修改方法:请在搜索引擎中搜索:Robots 文件生成工具,设置搜索引擎不支持访问的内容,以减少流量消耗。   5.如何了解主机流量使用情况。 阿里云会在您的主机流量耗用达到50%时向您发送邮件提醒,达到80%时向您发送邮件和短信提醒。若您的流量已经全部耗用完毕,我们会关停您的站点,同时发送邮件和短信通知。建议您在主机管理控制台中绑定自己的常用手机和邮箱,并及时查看,避免因为流量耗尽影响您网站的运行。 6.主机超流量被关停后开通时间。 主机标准流量指的是每月的流量,在每个月初都会有新的可用流量。如果您的主机本月因超流量被关停,下月1号您的主机会自动开通,并获得新的流量。   7.为什么使用第三方流量统计工具统计的流量比主机管理控制台里面统计的流量小。 我们的流量统计工具是基于网站访问日志统计的,统计了包括网站访问和搜索引擎两种形式的访问流量,是最全面的。目前市场上有很多种流量统计工具,比如CNZZ,是在网页中植入js统计代码,这类工具只能统计植入js脚本的网页产生的流量,不能统计未植入js的网页流量及音频,视频文件的流量,也不能统计搜索引擎的流量,所以会小很多。另外还有一些统计工具,比如web log explorer默认只统计网页类型的流量,不统计rar,zip,mp3类型文件。默认只统计网站访问流量,不统计搜索引擎流量。   8.之前没有申请访问统计报告,如何查超流量的原因。 建议您在主机管理控制台申请访问统计报告,申请后24小时可以查看申请日之后的流量报告。如果您想看申请日期之前的流量分析,请在主机管理控制台下载网站日志到您的电脑,查看您的访问记录。如果您看不懂日志文件,可以借助第三方的日志分析工具分析,比如 Awstats、Expert 等。 **
2019-12-01 23:21:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 1. 各型号主机的标准流量。 产品名称 流量标准值(GB) 共享虚拟主机普惠版 10 云虚拟主机基础版 20 云虚拟主机高级版 30 虚拟主机共享经济版 20 X享主机-X3 8 X享主机-X5 15 M享主机-M1 10 M享主机-M2 20 M享主机-M3 30 M享主机-M5 40 G享主机-G1 50 G享主机-G5 80 G享主机-G10 100 L享主机-L1 80 L享主机-L5 100 J享主机-J1 50 J享主机-J2 80 Ⅲ型空间 30 Ⅲ型.net 30 Ⅳ型空间 30 V型空间 50 VI型空间 100 III型JAVA 30 G享主机-G1-L 30   限制流量只是对个别超大流量用户的限制,是为了更好的为客户服务,保证服务器的稳定运行。 2.用户站点流量的计算公式。总流量=访问流量+下载流量= Page view 值 x 页面大小+下载文件大小 x 下载次数。  PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之合。(例如:该网站一天有100个访问者,每个访问者浏览的页面数量平均为5页,则每天的PV是100×5)。 Hits值:是指对每个页面元素的请求数量。(一个页面中任何一个图片或者flash文件都算是一个页面元素)。 3.为什么控制流量? 由于虚拟主机是多个用户的网站共享一台物理服务器资源。如果一个网站流量太大,不仅严重占用网络带宽资源,而且还加重了整台服务器负荷,影响到其它用户。所以,为了保证服务器的正常工作,我们需要对虚拟主机的流量进行控制。 4.网站出现流量超标后如何处理。如果网站出现流量超标情况,建议通过主机管理控制台的访问统计报告分析超流量原因,并根据原因做有针对性的操作。超流量的类型可以分为以下几种情况: 正常流量: 如果您的网站访问量很大,就会产生较多的流量,当流量不足时建议您及时到用户中心购买 云虚拟主机流量 或者升级到独享虚拟主机,独享虚机主机不限制流量。 异常流量原因分析: 网站被盗链:如果您的网站在线人数不是很多,那么就应该检查您站点内的内容,是否有图片、FLASH、音乐、下载文件、电影等比较引人注目的文件被别人盗链使用。 建议解决方案:如果发现可疑的被人盗链接的文件,请修改对应的网页文件,禁止盗用 IP 访问您的网站。或者彻底删除不必要的大文件。 开源建站软件漏洞:一般开源的建站软件如果存在漏洞,很容易被黑客利用发起攻击,导致网站流量过大。目前已经发现织梦 CMS(即 dede)存在严重漏洞。  网站包含音频,视频文件:如果您网站提供数据下载(如:.mp3,.rar,.zip.exe等)或者是您的网站提供视频、音乐等文件的播放或下载(如:背景音乐,宣传广告,FLASH 等),因为此类文件很大,会耗费大量流量。 建议解决方案:删除不必要的大文件,如果因业务需要不能删除,建议升级到独享虚拟主机,独享虚拟主机不限制流量。 网站做过搜索引擎推广:如果您在某些搜索引擎上做过某些推广或宣传,搜索引擎会大量访问您的网站,从而造成大流量,请您做出相应限制或升级主机。 建议解决方案:修改 Robots 文件,限制搜索引擎可以访问的资源,但这可能会影响您的网站推广效果,或者升级到独享虚机主机。 Robots文件修改方法:请在搜索引擎中搜索:Robots 文件生成工具,设置搜索引擎不支持访问的内容,以减少流量消耗。   5.如何了解主机流量使用情况。 阿里云会在您的主机流量耗用达到50%时向您发送邮件提醒,达到80%时向您发送邮件和短信提醒。若您的流量已经全部耗用完毕,我们会关停您的站点,同时发送邮件和短信通知。建议您在主机管理控制台中绑定自己的常用手机和邮箱,并及时查看,避免因为流量耗尽影响您网站的运行。 6.主机超流量被关停后开通时间。 主机标准流量指的是每月的流量,在每个月初都会有新的可用流量。如果您的主机本月因超流量被关停,下月1号您的主机会自动开通,并获得新的流量。   7.为什么使用第三方流量统计工具统计的流量比主机管理控制台里面统计的流量小。 我们的流量统计工具是基于网站访问日志统计的,统计了包括网站访问和搜索引擎两种形式的访问流量,是最全面的。目前市场上有很多种流量统计工具,比如CNZZ,是在网页中植入js统计代码,这类工具只能统计植入js脚本的网页产生的流量,不能统计未植入js的网页流量及音频,视频文件的流量,也不能统计搜索引擎的流量,所以会小很多。另外还有一些统计工具,比如web log explorer默认只统计网页类型的流量,不统计rar,zip,mp3类型文件。默认只统计网站访问流量,不统计搜索引擎流量。   8.之前没有申请访问统计报告,如何查超流量的原因。 建议您在主机管理控制台申请访问统计报告,申请后24小时可以查看申请日之后的流量报告。如果您想看申请日期之前的流量分析,请在主机管理控制台下载网站日志到您的电脑,查看您的访问记录。如果您看不懂日志文件,可以借助第三方的日志分析工具分析,比如 Awstats、Expert 等。 **
2019-12-01 23:21:09 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 1. 各型号主机的标准流量。 产品名称 流量标准值(GB) 共享虚拟主机普惠版 10 云虚拟主机基础版 20 云虚拟主机高级版 30 虚拟主机共享经济版 20 X享主机-X3 8 X享主机-X5 15 M享主机-M1 10 M享主机-M2 20 M享主机-M3 30 M享主机-M5 40 G享主机-G1 50 G享主机-G5 80 G享主机-G10 100 L享主机-L1 80 L享主机-L5 100 J享主机-J1 50 J享主机-J2 80 Ⅲ型空间 30 Ⅲ型.net 30 Ⅳ型空间 30 V型空间 50 VI型空间 100 III型JAVA 30 G享主机-G1-L 30   限制流量只是对个别超大流量用户的限制,是为了更好的为客户服务,保证服务器的稳定运行。 2.用户站点流量的计算公式。总流量=访问流量+下载流量= Page view 值 x 页面大小+下载文件大小 x 下载次数。  PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之合。(例如:该网站一天有100个访问者,每个访问者浏览的页面数量平均为5页,则每天的PV是100×5)。 Hits值:是指对每个页面元素的请求数量。(一个页面中任何一个图片或者flash文件都算是一个页面元素)。 3.为什么控制流量? 由于虚拟主机是多个用户的网站共享一台物理服务器资源。如果一个网站流量太大,不仅严重占用网络带宽资源,而且还加重了整台服务器负荷,影响到其它用户。所以,为了保证服务器的正常工作,我们需要对虚拟主机的流量进行控制。 4.网站出现流量超标后如何处理。如果网站出现流量超标情况,建议通过主机管理控制台的访问统计报告分析超流量原因,并根据原因做有针对性的操作。超流量的类型可以分为以下几种情况: 正常流量: 如果您的网站访问量很大,就会产生较多的流量,当流量不足时建议您及时到用户中心购买 云虚拟主机流量 或者升级到独享虚拟主机,独享虚机主机不限制流量。 异常流量原因分析: 网站被盗链:如果您的网站在线人数不是很多,那么就应该检查您站点内的内容,是否有图片、FLASH、音乐、下载文件、电影等比较引人注目的文件被别人盗链使用。 建议解决方案:如果发现可疑的被人盗链接的文件,请修改对应的网页文件,禁止盗用 IP 访问您的网站。或者彻底删除不必要的大文件。 开源建站软件漏洞:一般开源的建站软件如果存在漏洞,很容易被黑客利用发起攻击,导致网站流量过大。目前已经发现织梦 CMS(即 dede)存在严重漏洞。  网站包含音频,视频文件:如果您网站提供数据下载(如:.mp3,.rar,.zip.exe等)或者是您的网站提供视频、音乐等文件的播放或下载(如:背景音乐,宣传广告,FLASH 等),因为此类文件很大,会耗费大量流量。 建议解决方案:删除不必要的大文件,如果因业务需要不能删除,建议升级到独享虚拟主机,独享虚拟主机不限制流量。 网站做过搜索引擎推广:如果您在某些搜索引擎上做过某些推广或宣传,搜索引擎会大量访问您的网站,从而造成大流量,请您做出相应限制或升级主机。 建议解决方案:修改 Robots 文件,限制搜索引擎可以访问的资源,但这可能会影响您的网站推广效果,或者升级到独享虚机主机。 Robots文件修改方法:请在搜索引擎中搜索:Robots 文件生成工具,设置搜索引擎不支持访问的内容,以减少流量消耗。   5.如何了解主机流量使用情况。 阿里云会在您的主机流量耗用达到50%时向您发送邮件提醒,达到80%时向您发送邮件和短信提醒。若您的流量已经全部耗用完毕,我们会关停您的站点,同时发送邮件和短信通知。建议您在主机管理控制台中绑定自己的常用手机和邮箱,并及时查看,避免因为流量耗尽影响您网站的运行。 6.主机超流量被关停后开通时间。 主机标准流量指的是每月的流量,在每个月初都会有新的可用流量。如果您的主机本月因超流量被关停,下月1号您的主机会自动开通,并获得新的流量。   7.为什么使用第三方流量统计工具统计的流量比主机管理控制台里面统计的流量小。 我们的流量统计工具是基于网站访问日志统计的,统计了包括网站访问和搜索引擎两种形式的访问流量,是最全面的。目前市场上有很多种流量统计工具,比如CNZZ,是在网页中植入js统计代码,这类工具只能统计植入js脚本的网页产生的流量,不能统计未植入js的网页流量及音频,视频文件的流量,也不能统计搜索引擎的流量,所以会小很多。另外还有一些统计工具,比如web log explorer默认只统计网页类型的流量,不统计rar,zip,mp3类型文件。默认只统计网站访问流量,不统计搜索引擎流量。   8.之前没有申请访问统计报告,如何查超流量的原因。 建议您在主机管理控制台申请访问统计报告,申请后24小时可以查看申请日之后的流量报告。如果您想看申请日期之前的流量分析,请在主机管理控制台下载网站日志到您的电脑,查看您的访问记录。如果您看不懂日志文件,可以借助第三方的日志分析工具分析,比如 Awstats、Expert 等。 **
2019-12-01 23:21:10 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 1. 各型号主机的标准流量。 产品名称 流量标准值(GB) 共享虚拟主机普惠版 10 云虚拟主机基础版 20 云虚拟主机高级版 30 虚拟主机共享经济版 20 X享主机-X3 8 X享主机-X5 15 M享主机-M1 10 M享主机-M2 20 M享主机-M3 30 M享主机-M5 40 G享主机-G1 50 G享主机-G5 80 G享主机-G10 100 L享主机-L1 80 L享主机-L5 100 J享主机-J1 50 J享主机-J2 80 Ⅲ型空间 30 Ⅲ型.net 30 Ⅳ型空间 30 V型空间 50 VI型空间 100 III型JAVA 30 G享主机-G1-L 30   限制流量只是对个别超大流量用户的限制,是为了更好的为客户服务,保证服务器的稳定运行。 2.用户站点流量的计算公式。总流量=访问流量+下载流量= Page view 值 x 页面大小+下载文件大小 x 下载次数。  PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之合。(例如:该网站一天有100个访问者,每个访问者浏览的页面数量平均为5页,则每天的PV是100×5)。 Hits值:是指对每个页面元素的请求数量。(一个页面中任何一个图片或者flash文件都算是一个页面元素)。 3.为什么控制流量? 由于虚拟主机是多个用户的网站共享一台物理服务器资源。如果一个网站流量太大,不仅严重占用网络带宽资源,而且还加重了整台服务器负荷,影响到其它用户。所以,为了保证服务器的正常工作,我们需要对虚拟主机的流量进行控制。 4.网站出现流量超标后如何处理。如果网站出现流量超标情况,建议通过主机管理控制台的访问统计报告分析超流量原因,并根据原因做有针对性的操作。超流量的类型可以分为以下几种情况: 正常流量: 如果您的网站访问量很大,就会产生较多的流量,当流量不足时建议您及时到用户中心购买 云虚拟主机流量 或者升级到独享虚拟主机,独享虚机主机不限制流量。 异常流量原因分析: 网站被盗链:如果您的网站在线人数不是很多,那么就应该检查您站点内的内容,是否有图片、FLASH、音乐、下载文件、电影等比较引人注目的文件被别人盗链使用。 建议解决方案:如果发现可疑的被人盗链接的文件,请修改对应的网页文件,禁止盗用 IP 访问您的网站。或者彻底删除不必要的大文件。 开源建站软件漏洞:一般开源的建站软件如果存在漏洞,很容易被黑客利用发起攻击,导致网站流量过大。目前已经发现织梦 CMS(即 dede)存在严重漏洞。  网站包含音频,视频文件:如果您网站提供数据下载(如:.mp3,.rar,.zip.exe等)或者是您的网站提供视频、音乐等文件的播放或下载(如:背景音乐,宣传广告,FLASH 等),因为此类文件很大,会耗费大量流量。 建议解决方案:删除不必要的大文件,如果因业务需要不能删除,建议升级到独享虚拟主机,独享虚拟主机不限制流量。 网站做过搜索引擎推广:如果您在某些搜索引擎上做过某些推广或宣传,搜索引擎会大量访问您的网站,从而造成大流量,请您做出相应限制或升级主机。 建议解决方案:修改 Robots 文件,限制搜索引擎可以访问的资源,但这可能会影响您的网站推广效果,或者升级到独享虚机主机。 Robots文件修改方法:请在搜索引擎中搜索:Robots 文件生成工具,设置搜索引擎不支持访问的内容,以减少流量消耗。   5.如何了解主机流量使用情况。 阿里云会在您的主机流量耗用达到50%时向您发送邮件提醒,达到80%时向您发送邮件和短信提醒。若您的流量已经全部耗用完毕,我们会关停您的站点,同时发送邮件和短信通知。建议您在主机管理控制台中绑定自己的常用手机和邮箱,并及时查看,避免因为流量耗尽影响您网站的运行。 6.主机超流量被关停后开通时间。 主机标准流量指的是每月的流量,在每个月初都会有新的可用流量。如果您的主机本月因超流量被关停,下月1号您的主机会自动开通,并获得新的流量。   7.为什么使用第三方流量统计工具统计的流量比主机管理控制台里面统计的流量小。 我们的流量统计工具是基于网站访问日志统计的,统计了包括网站访问和搜索引擎两种形式的访问流量,是最全面的。目前市场上有很多种流量统计工具,比如CNZZ,是在网页中植入js统计代码,这类工具只能统计植入js脚本的网页产生的流量,不能统计未植入js的网页流量及音频,视频文件的流量,也不能统计搜索引擎的流量,所以会小很多。另外还有一些统计工具,比如web log explorer默认只统计网页类型的流量,不统计rar,zip,mp3类型文件。默认只统计网站访问流量,不统计搜索引擎流量。   8.之前没有申请访问统计报告,如何查超流量的原因。 建议您在主机管理控制台申请访问统计报告,申请后24小时可以查看申请日之后的流量报告。如果您想看申请日期之前的流量分析,请在主机管理控制台下载网站日志到您的电脑,查看您的访问记录。如果您看不懂日志文件,可以借助第三方的日志分析工具分析,比如 Awstats、Expert 等。 **
2019-12-01 23:21:09 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 1. 各型号主机的标准流量。 产品名称 流量标准值(GB) 共享虚拟主机普惠版 10 云虚拟主机基础版 20 云虚拟主机高级版 30 虚拟主机共享经济版 20 X享主机-X3 8 X享主机-X5 15 M享主机-M1 10 M享主机-M2 20 M享主机-M3 30 M享主机-M5 40 G享主机-G1 50 G享主机-G5 80 G享主机-G10 100 L享主机-L1 80 L享主机-L5 100 J享主机-J1 50 J享主机-J2 80 Ⅲ型空间 30 Ⅲ型.net 30 Ⅳ型空间 30 V型空间 50 VI型空间 100 III型JAVA 30 G享主机-G1-L 30   限制流量只是对个别超大流量用户的限制,是为了更好的为客户服务,保证服务器的稳定运行。 2.用户站点流量的计算公式。总流量=访问流量+下载流量= Page view 值 x 页面大小+下载文件大小 x 下载次数。  PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之合。(例如:该网站一天有100个访问者,每个访问者浏览的页面数量平均为5页,则每天的PV是100×5)。 Hits值:是指对每个页面元素的请求数量。(一个页面中任何一个图片或者flash文件都算是一个页面元素)。 3.为什么控制流量? 由于虚拟主机是多个用户的网站共享一台物理服务器资源。如果一个网站流量太大,不仅严重占用网络带宽资源,而且还加重了整台服务器负荷,影响到其它用户。所以,为了保证服务器的正常工作,我们需要对虚拟主机的流量进行控制。 4.网站出现流量超标后如何处理。如果网站出现流量超标情况,建议通过主机管理控制台的访问统计报告分析超流量原因,并根据原因做有针对性的操作。超流量的类型可以分为以下几种情况: 正常流量: 如果您的网站访问量很大,就会产生较多的流量,当流量不足时建议您及时到用户中心购买 云虚拟主机流量 或者升级到独享虚拟主机,独享虚机主机不限制流量。 异常流量原因分析: 网站被盗链:如果您的网站在线人数不是很多,那么就应该检查您站点内的内容,是否有图片、FLASH、音乐、下载文件、电影等比较引人注目的文件被别人盗链使用。 建议解决方案:如果发现可疑的被人盗链接的文件,请修改对应的网页文件,禁止盗用 IP 访问您的网站。或者彻底删除不必要的大文件。 开源建站软件漏洞:一般开源的建站软件如果存在漏洞,很容易被黑客利用发起攻击,导致网站流量过大。目前已经发现织梦 CMS(即 dede)存在严重漏洞。  网站包含音频,视频文件:如果您网站提供数据下载(如:.mp3,.rar,.zip.exe等)或者是您的网站提供视频、音乐等文件的播放或下载(如:背景音乐,宣传广告,FLASH 等),因为此类文件很大,会耗费大量流量。 建议解决方案:删除不必要的大文件,如果因业务需要不能删除,建议升级到独享虚拟主机,独享虚拟主机不限制流量。 网站做过搜索引擎推广:如果您在某些搜索引擎上做过某些推广或宣传,搜索引擎会大量访问您的网站,从而造成大流量,请您做出相应限制或升级主机。 建议解决方案:修改 Robots 文件,限制搜索引擎可以访问的资源,但这可能会影响您的网站推广效果,或者升级到独享虚机主机。 Robots文件修改方法:请在搜索引擎中搜索:Robots 文件生成工具,设置搜索引擎不支持访问的内容,以减少流量消耗。   5.如何了解主机流量使用情况。 阿里云会在您的主机流量耗用达到50%时向您发送邮件提醒,达到80%时向您发送邮件和短信提醒。若您的流量已经全部耗用完毕,我们会关停您的站点,同时发送邮件和短信通知。建议您在主机管理控制台中绑定自己的常用手机和邮箱,并及时查看,避免因为流量耗尽影响您网站的运行。 6.主机超流量被关停后开通时间。 主机标准流量指的是每月的流量,在每个月初都会有新的可用流量。如果您的主机本月因超流量被关停,下月1号您的主机会自动开通,并获得新的流量。   7.为什么使用第三方流量统计工具统计的流量比主机管理控制台里面统计的流量小。 我们的流量统计工具是基于网站访问日志统计的,统计了包括网站访问和搜索引擎两种形式的访问流量,是最全面的。目前市场上有很多种流量统计工具,比如CNZZ,是在网页中植入js统计代码,这类工具只能统计植入js脚本的网页产生的流量,不能统计未植入js的网页流量及音频,视频文件的流量,也不能统计搜索引擎的流量,所以会小很多。另外还有一些统计工具,比如web log explorer默认只统计网页类型的流量,不统计rar,zip,mp3类型文件。默认只统计网站访问流量,不统计搜索引擎流量。   8.之前没有申请访问统计报告,如何查超流量的原因。 建议您在主机管理控制台申请访问统计报告,申请后24小时可以查看申请日之后的流量报告。如果您想看申请日期之前的流量分析,请在主机管理控制台下载网站日志到您的电脑,查看您的访问记录。如果您看不懂日志文件,可以借助第三方的日志分析工具分析,比如 Awstats、Expert 等。 **
2019-12-01 23:21:07 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务