• 关于

    字符函数是啥

    的搜索结果

回答

在 Python 3 里,字符串类型名为 str。它就是用来表示字符串的,真正的字符串,比如你现在看到的这串字符。不应当用来表示任何其它的数据。其内部表示你不需要关心,只需要知道它使用的是 Unicode 就好。Python 3 有另一与字符串相关的类型叫 bytes。顾名思义,它是字节串,即一堆字节。一堆字节是啥呢?Python 也不知道;你得告诉它。比如你知道它是一段 UTF-8 编码的中文,那么用 .decode('utf-8') 解释之后就得到了一个字符串。如果它是一个特定的结构体,你可以使用 struct 模块来进行解析。等等。C 里的 char 是啥呢?其实就是以 '0' 表示结束的一堆字节,而这个结尾表示还只对 str 系列函数有效。当然通常 char* 是用来表示(已编码的)字符串的,但是也经常被用来放其它数据结构。所以,Python 3 里的 bytes 类型基本对应于 C 的 char*,只不过 bytes 里包含 '0' 完全不会造成问题。

a123456678 2019-12-02 02:40:24 0 浏览量 回答数 0

问题

”argv的第一个元素指向一个空字符串“是什么意思?

a123456678 2019-12-01 19:50:54 750 浏览量 回答数 1

回答

确实跟缓冲区有关, getch每次调用,从标准输入缓冲区中读入1个字符,但如果缓冲区中没有数据,则会阻塞程序,等待直到缓冲区里有数据。 那么什么时候有数据呢? -- 当你按回车的时候,之前键入的所有字符,包含回车自身,一并被送入输入缓冲区 所以,当缓冲区为空时,无论你输入多少个字符,只要不按回车,getch()函数会一直等在那里。 第一个程序,输入asxsas回车后,getch()获取到第一个字符a,之后的字符还在缓冲区内,当程序退出时,缓冲区销毁,里面的数据也随之消失。 第二个程序可以自己体会下。 第三个程序,翻译一下 每当( (从缓冲区读一个字符) 不等于 '#' ) 执行 { 啥也不干,继续循环 }只有当读到#的时候,才因不满足循环条件而跳出,继续执行下面的putchar,当然 此时打印出的就是 # getchar返回int类型这个是API里定义的规范,但是你可以将它赋值给一个char类型的变量,这里会自动做int -> char的隐式类型转换,这个转换,会丢失高位字节,但是对于getch()返回的数据来说,他的范围是0-127,高位字节永远都是0,丢了也无所谓

a123456678 2019-12-02 02:39:10 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

strlen()、strcpy()在C语言中均在string.h中声明,在C++中使用时要加上前缀c去掉.h就好了。 #include<cstring>回复 @周耀1994:Warning已经很明确的告诉你了,是字符串的转换的问题。那个警告是为什么???求指教!!谢谢了!!问题解决了strlen和strcpy这两个函数的头文件是 cstring,你加上试试。 回复 @周耀1994:怎么解决的啊谢谢!问题解决了你这<title>不利于SEO,先把ununtu改回ubuntu再说.不好意思因该是ubuntu打错了ununtu是啥?不好意思是应该是ubuntu 引用来自“SErHo”的答案 strlen和strcpy这两个函数的头文件是 cstring,你加上试试。 谢谢!! 警告的问题: 把char*name1,char*stu_no1改为constchar*name1,constchar*stu_no1试试

爱吃鱼的程序员 2020-06-22 19:40:56 0 浏览量 回答数 0

问题

C中局部变量指针问题

a123456678 2019-12-01 19:45:40 942 浏览量 回答数 1

回答

JavaScript (ECMAScript) :JavaScript 是脚本语言。JavaScript和ECMAScript通常被人用来表达相同的含义,但是JavaScript并不是这么一点含义,它是由ECMAScript 核心. DOM 文档对象模型. BOM 浏览器对象模型 这三部分组成。浏览器会在读取代码时,逐行地执行脚本代码。而对于传统编程来说,会在执行前对所有代码进行编译。 组成部分包括语法,类型,语句,关键字,保留字,操作符,对象。 其中,文档对象模型(DOM , Document Object Model)是针对XML但是经过拓展用于HTML的应用程序编程接口。DOM把整个页面映射为一个多层节点结构,开发人员借助DOM Api对节点进行操作。可以通过浏览器F12进入开发者模式,查看层级关系。当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM 模型被构造为对象的树。通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。 功能大致上: · JavaScript 能够改变页面中的所有 HTML 元素 · JavaScript 能够改变页面中的所有 HTML 属性 · JavaScript 能够改变页面中的所有 CSS 样式 · JavaScript 能够对页面中的所有事件做出反应 同时,浏览器对象模型(Browser Object Model)使用BOM控制浏览器显示页面意外的部分。 javaScript脚本加载方式 1 通过在网页中加入标记JavaScript的开始和结束,将JavaScript代码放到之间 2 也可以引入一个外部的JavaScript文件,这个JavaScript文件一般以.js作为扩展名 3 原则上,放在之间。但视情况可以放在网页的任何部分 4 一个页面可以有几个,不同部分的方法和变量,可以共享。 javaScript语句开发 (1)对大小写敏感 (2)自动忽略多余的空格 (3)在文本字符串中使用反斜杠对代码行进行换行 (4)单行注释(//)多行注释(/* */) JavaScript 是一个程序语言。语法规则定义了语言结构。 JavaScript 字面量 在编程语言中,一般固定值称为字面量,如 3.14。 数字(Number)字面量 可以是整数或者是小数,或者是科学计数(e)。 字符串(String)字面量 可以使用单引号或双引号: 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, 10] 对象(Object)字面量 定义一个对象: {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"} 函数(Function)字面量 定义一个函数: function myFunction(a, b) { return a * b;} **JavaScript 变量 ** 在编程语言中,变量用于存储数据值。 JavaScript 使用关键字 var 来定义变量, 使用等号来为变量赋值: var x, length x = 5 length = 6 JavaScript 操作符 JavaScript使用 算术运算符 来计算值: (5 + 6) * 10 JavaScript使用赋值运算符给变量赋值: x = 5 y = 6 z = (x + y) * 10 JavaScript语言有多种类型的运算符: JavaScript 语句 在 HTML 中,JavaScript 语句向浏览器发出的命令。 语句是用分号分隔: x = 5 + 6; y = x * 10; JavaScript 关键字 JavaScript 关键字用于标识要执行的操作。 和其他任何编程语言一样,JavaScript 保留了一些关键字为自己所用。 var 关键字告诉浏览器创建一个新的变量: var x = 5 + 6; var y = x * 10; JavaScript 同样保留了一些关键字,这些关键字在当前的语言版本中并没有使用,但在以后 JavaScript 扩展中会用到。 以下是 JavaScript 中最重要的保留字(按字母顺序): JavaScript 注释 不是所有的 JavaScript 语句都是"命令"。双斜杠 // 后的内容将会被浏览器忽略: // 我不会执行 JavaScript 数据类型 JavaScript 有多种数据类型:数字,字符串,数组,对象等等: var length = 16; // Number 通过数字字面量赋值 var points = x * 10; // Number 通过表达式字面量赋值 var lastName = "Johnson"; // String 通过字符串字面量赋值 var cars = ["Saab", "Volvo", "BMW"]; // Array 通过数组字面量赋值 var person = {firstName:"John", lastName:"Doe"}; // Object 通过对象字面量赋值 数据类型的概念 编程语言中,数据类型是一个非常重要的内容。 为了可以操作变量,了解数据类型的概念非常重要。 如果没有使用数据类型,以下实例将无法执行: 16 + "Volvo" 16 加上 "Volvo" 是如何计算呢? 以上会产生一个错误还是输出以下结果呢? "16Volvo" 你可以在浏览器尝试执行以上代码查看效果。 在接下来的章节中你将学到更多关于数据类型的知识。 JavaScript 函数 JavaScript 语句可以写在函数内,函数可以重复引用: 引用一个函数 = 调用函数(执行函数内的语句)。 function myFunction(a, b) { return a * b; // 返回 a 乘以 b 的结果 } JavaScript 字母大小写 JavaScript 对大小写是敏感的。 当编写 JavaScript 语句时,请留意是否关闭大小写切换键。 函数 getElementById 与 getElementbyID 是不同的。 同样,变量 myVariable 与 MyVariable 也是不同的。 JavaScript 字符集 JavaScript 使用 Unicode 字符集。 Unicode 覆盖了所有的字符,包含标点等字符。 三 推荐学习网站 JS具体的语法内容还有很多,可以参考官方API或者学习网站完成掌握,简单易学,推荐网站 菜鸟教程:https://www.runoob.com/js/js-tutorial.html w3cschool:https://www.w3school.com.cn/js/index.asp 四 推荐学习书籍 引用自 https://www.cnblogs.com/xhqq/p/7561384.html 个人觉得不错的,没事可以翻翻的。书籍如下: 《javascript设计模式》,张容铭写的,可能不太适合零基础的,是非常不错的进阶书籍。 《javascript面向对象编程指南》,风格轻松易懂,比较适合初学者,原型那块儿讲得透彻,12种继承方式呢。 《js权威指南》、《js高级程序设计》,这两本书经典是经典,但是太厚,适合把其中任意一章都当成一本书来读。洋洋洒洒,很难一口气看完。比较适合当做参考书。 《你不知道的javascript》狙击js核心细节,闭包、原型、this讲得都还清楚。 《js设计模式与开发实践》js设计模式也是要学的,此书把js的设计模式讲得非常清晰,一点不晦涩,看起来没多少难度。 《正则指引》,分析源码时,如果正则表达式不懂,没法进行下去的。此书相对来说讲得比较清晰。 《基于MVC的JavaScript Web富应用开发》,看完后,基本能写出自己的mvc框架了。是本好书。 《javascript函数式编程》,js是一门函数式语言,此书是函数式编程一个入门,函数是一等公民那是非常重要的。 《js忍者秘籍》,jq作者写的,没有传说中的那么难读,话说就算你看完并理解所有知识点,也不会达到世界高手级别的。因为你还没有做到随心所欲。 《javascript框架设计》,如果初看此书,会觉得此书有罗列代码之嫌。在我看来,此书讲究的是框架的全局观。以上书籍是我认为是成就高手之路上必须看的,也需要反复看。 css相关的书籍,说实话我看得比较少,总共有六七本吧。有两本必须推荐一下: 《css权威指南》,css基础知识点那是讲得非常清楚的。什么层叠优先级、line-height啥的。不是随便一本书都敢叫“权威指南”的。 《css揭秘》,此书我也是不断的看,此书才不屑于全面讲css3各属性呢。css规范文档能讲的,它只会讲你最不在意的。此书解决的47问题,解决思路和解决方案同等重要,很有启发性。以上各书你都可以不买,至少买本此书吧

问问小秘 2020-03-03 09:32:57 0 浏览量 回答数 0

回答

Python 用POP接收邮件一、简介  POP(Post Office Protocal)最长用的POP版本是POP3,因此本文是以POP3为主。POP3非常简单,可以用来从邮件服务器上下载邮件,然后删除这些邮件。功能非常有限,后面讲解的IMAP完胜它,不过作为入门级的,还是有必要介绍一下,也对学习SMTP有帮助。  Python提供了poplib模块,它提供了使用POP的便利接口。二、实例  由于pop3功能较IMAP非常有限,而且我最后的程序并没有使用pop3,所以,不详细讲解,下面通过一个例子来说明下较为常见的功能。  这个例子的功能为进入邮箱,查看所有的邮件。首先显示邮件的发件人、主题,查看邮箱主题内容。需要模块import email, poplib, sys连接POP3服务器,登录个人邮箱账户  poplib提供POP3()方法和POP3_SSL()方法连接POP3服务器,区别和SMTP一样。gmail仍然使用POP3_SSL()方式,并返回class POP3实例p = poplib.POP3_SSL('pop.gmail.com')   使用POP3.user(), POP3.pass_()方法来登录个人账户try:p.user(user) p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')现在已经进入个人账户,下一步,利用POP3.list()函数查看邮箱内邮件信息。  关于list()函数的详细说明,请点击这里。list()函数有三个返回值,分别是:response, listings, octetsresponse 应答信息,我测试中出现的结果:      以b开头的字符串是Byte类型,我在实际测试的时候,返回的信息几乎都是Byte类型的。关于此类型及和普通字符串的转化会在后面举例说明。listings 是形如['message_id message_size',...]若干各message-id和message_size构成的list。后面就是通过message_id来检索邮件。我测试中出现的结果:  octets 不是特别清楚啥意思。response, listings, octets = p.list()最重要的就是listings数据  如上面解释的,listings是个list类型的数据,接下来我们取出listings中的message_id,也就是上面的 "1" "2" "3" "4" ...for listing in listings: #每次需要一个listingnumber, size = listing.split() #由于number和size是以空格分隔,所以利用split()函数分开,split()默认以' '为分隔  现在我们就取出了我们需要的message_id,也就是number,注意number需要从Byte类型转化为字符串类型。POP3.top()函数  利用此函数,取出邮件的headers,如下:response, lines, octets = p.top(number , 0)  lines存储内容,下面先转化成Message类型(lines默认为标准字符串类型,仅供说明,以实际代码为准)message = email.message_from_string('n'.join(lines))已经生成Message类,可以利用头部信息来查看From, Subject等信息for header in 'From', 'To', 'Subject', 'Date':if header in message: print(header + ':' , message[header])   注意,此时的message[header]可能不会输出我们想看到的内容,有可能出现格式错乱问题,比如中英文的转化,所以还需要特殊来处理。处理方式请继续往下看IMAP部分。取出邮件所有信息  上面的top()函数只取出header信息以及根据参数确定的n行内容,如果用户希望查看邮件所有内容,那利用POP3.retr()函数取出response, lines, octets = p.retr(number)  还是将lines中的内容转换成Message类型:message = email.message_from_string('n'.join(lines))已经有了邮件所有信息,可以通过Message.get_payload()取出邮件正文了。  但是,get_payload()函数并不一定返回邮件正文。以下是官方说明:Return the current payload, which will be a list of Message objects when is_multipart() is True, or a string when is_multipart() is False.   在实际测试中,返回的就是a list of Message objects,这个问题困扰我很长时间,最终还是解决了,通过以下方法:复制代码maintype = message.get_content_maintype()if maintype == 'multipart':for part in message.get_payload(): if part.get_content_maintype() == 'text': mail_content = part.get_payload(decode=True).strip()elif maintype == 'text':mail_content = e.get_payload(decode=True).strip() 复制代码此时,mail_content就是邮件正文了.  当然,如果是中文的话,这件事仍未完,还需要将它转化未'gbk',利用如下方式:mail_content = mail_content.decode('gbk')到现在,基本已经大功告成了,能够取出邮箱中所有的邮件,并查看邮件的header内容和邮件正文了^_^三、完整代码:复制代码-- encoding:utf-8 ---- encoding:gbk --import email, getpass, poplib, syshostname = 'pop.gmail.com'user = 'myUserName@gmail.com'passwd = '*'p = poplib.POP3_SSL('pop.gmail.com') #与SMTP一样,登录gmail需要使用POP3_SSL() 方法,返回class POP3实例try:# 使用POP3.user(), POP3.pass_()方法来登录个人账户 p.user(user) p.pass_(passwd)except poplib.error_proto: #可能出现的异常print('login failed')else:response, listings, octets = p.list() for listing in listings: number, size = listing.split() #取出message-id number = bytes.decode(number) size = bytes.decode(size) print('Message', number, '( size is ', size, 'bytes)') print() response, lines, octets = p.top(number , 0) # 继续把Byte类型转化成普通字符串 for i in range(0, len(lines)): lines[i] = bytes.decode(lines[i]) #利用email库函数转化成Message类型邮件 message = email.message_from_string('\n'.join(lines)) # 输出From, To, Subject, Date头部及其信息 for header in 'From', 'To', 'Subject', 'Date': if header in message: print(header + ':' , message[header]) #与用户交互是否想查看邮件内容 print('Read this message [ny]') answer = input() if answer.lower().startswith('y'): response, lines, octets = p.retr(number) #检索message并返回 for i in range(0, len(lines)): lines[i] = bytes.decode(lines[i]) message = email.message_from_string('\n'.join(lines)) print('-' * 72) maintype = message.get_content_maintype() if maintype == 'multipart': for part in message.get_payload(): if part.get_content_maintype() == 'text': mail_content = part.get_payload(decode=True).strip() elif maintype == 'text': mail_content = e.get_payload(decode=True).strip() try: mail_content = mail_content.decode('gbk') except UnicodeDecodeError: print('Decoding to gbk error') sys.exit(1) print(mail_content) print() print('Delete this message? [ny]') answer = input() if answer.lower().startswith('y'): p.dele(number) print('Deleted')finally:print('log out') p.quit()

xuning715 2019-12-02 01:10:36 0 浏览量 回答数 0

问题

【今日算法】4月24日-如何寻找最长回文子串

游客ih62co2qqq5ww 2020-04-24 22:54:34 0 浏览量 回答数 0

回答

首先,我要说没必要来实现选择器这种轮子,虽然我不反对造轮子,但选择器这种轮子已经非常成熟了,而且现代浏览器已经内置了选择器。不过如果你坚持还是要继续的话,我可以简单探讨下。顺便说一下,jquery的选择器用的是sizzle,它以前用的是自己写的,不过后来大概也觉得这个轮子没啥意思。。。第一步,解析首先要把你的查询字符串解析成查询链,这个过程简单但是繁杂,因为除了常见的css选择器,还有各种伪类。我们就拿最简单的一个查询来举例子把,我把我们的选择器叫做XX('#header .nav ul');这段代码经过我们的解析后会变成类似这样的结构[{type: 'id', value: 'header'}, {type: 'class', value: 'nav'}, {type: 'tag', value: 'ul'}]OK,这样一个简单的查询链就出来了,理论上我们按照这个顺序一步一步就可以得到期望的结果了。第二步,查询注意,如果你没有用querySelector这个函数,那么基本上就是利用 getElementById, getElementsByName, getElementsByTagName, getElementsByClassName 这几个函数来实现了我们可以把上面查询链的type给映射到具体的操作,类似var handlers = {'id' : function (el, value) { return el.getElementById(value); }, ...};最后,我们遍历这条查询链,根据每个节点的type来查询value,然后把每个节点结果作为下一个查询的el,依此类推注意,以上只是做一个选择器的基本原理,实际情况要复杂的多

a123456678 2019-12-02 02:22:49 0 浏览量 回答数 0

问题

【今日算法】5月18日-编辑距离

游客ih62co2qqq5ww 2020-05-19 07:57:13 5 浏览量 回答数 1

回答

奶奶个腿,问题终于解决了。不是脚本的问题,不过这个脚本在ie7以上也不老正常的。是数据库被人注入过,在替换后的{$TemplateName$}的文本里出现了<eval request("ice")%>字样,造成脚本读不到相应的node。谢谢各位相助 ######没见过这样的文件   文件全文是什么样子的呢?######全文太长,都是html,主要的目的就是点击链接,执行这个函数读取xml节点的数据显示在文本框中######没文档吗? ?######回复 @blindcat : 很同情你######没有,嘛都没有。都搞不懂为啥乱七八糟啥玩意都写在一个页面里######selectSingleNode是IE下的特有用法   【http://www.w3school.com.cn/xmldom/met_node_selectsinglenode.asp】 http://shaolong.me/k  ######刚查了下XPATH的查找语法://Template表示的是所有Template节点。从代码来看你想取得的是TemplateName等的类似节点。如果sTagName被alert出来是TemplateName,那么感觉应该写成 "//Template" + "/" +  sTagName 。 你试试看行不行。######一样的结果 //就是忽略了路径,后面是拼的一个字符串######我测试了很久,用了类似的取值方式,发现可能你alert的不对. 你用xmlTemplate.selectSingleNode("//"),里面确定的应该是唯一的节点。假设为noded3,而根据语法<b>3</b>像这样在中间的值也是作为一个节点所以应该nodeValue,alert(nodes3.childNodes[0].nodeValue);我在本地自己写了一个测试程序是可以取到其中的值的。######我写的代码放在博客里了http://my.oschina.net/luckyone/blog/127340。你可以拿去跑跑看。

kun坤 2020-06-07 20:26:28 0 浏览量 回答数 0

回答

多线程 Java多线程三大特性是啥? https://developer.aliyun.com/ask/282728 Java如何解决多线程之间线程安全问题? https://developer.aliyun.com/ask/282730Java为什么使用线程同步或使用锁能解决线程安全问题呢? https://developer.aliyun.com/ask/282731Java中多线程之间同步是什么? https://developer.aliyun.com/ask/282732Java 计数器 CountDownLatch有啥作用? https://developer.aliyun.com/ask/282733Java 屏障 CyclicBarrier有啥作用? https://developer.aliyun.com/ask/282734Java 计数信号量 Semaphore有啥作用? https://developer.aliyun.com/ask/282735Java在并发队列上JDK提供了你哪些实现? https://developer.aliyun.com/ask/282736Java阻塞队列与非阻塞队列的区别在哪? https://developer.aliyun.com/ask/282737Java并发队列ConcurrentLinkedQueue如何使用? https://developer.aliyun.com/ask/282729Java并发队列ArrayBlockingQueue如何使用? https://developer.aliyun.com/ask/282738Java并发队列LinkedBlockingQueue如何使用? https://developer.aliyun.com/ask/282739Java并发队列PriorityBlockingQueue如何使用? https://developer.aliyun.com/ask/282740Java并发队列SynchronousQueue如何使用? https://developer.aliyun.com/ask/282741Java如何使用BlockingQueue模拟生产者与消费者? https://developer.aliyun.com/ask/282742Java线程池有哪些创建方式? https://developer.aliyun.com/ask/282743Java线程池原理是啥? https://developer.aliyun.com/ask/282744Java如何自定义线程线程池? https://developer.aliyun.com/ask/282745Java如何合理配置线程池? https://developer.aliyun.com/ask/282746 SpringBoot - Java中一个典型的SpringBoot应用长什么样子呢? https://developer.aliyun.com/ask/282747Java @SpringBootApplication应该如何理解? https://developer.aliyun.com/ask/282748Java @Configuration应该如何理解? https://developer.aliyun.com/ask/282749Java @EnableAutoConfiguration应该如何理解? https://developer.aliyun.com/ask/282750Java @ComponentScan应该如何理解? https://developer.aliyun.com/ask/282751Java Spring Application执行流程有哪些? https://developer.aliyun.com/ask/282752Java SpringBoot应用如何添加自定义的ApplicationListener? https://developer.aliyun.com/ask/282753Java SpringBoot如何实现基于条件的自动配置? https://developer.aliyun.com/ask/282754Java SpringBoot如何调整自动配置的顺序? https://developer.aliyun.com/ask/282755Java SpringBoot对开发者有哪些影响? https://developer.aliyun.com/ask/282756对SpringBoot的行为进行干预的配置方式有哪些? https://developer.aliyun.com/ask/282757 正则表达式 Java 正则表达式是什么? https://developer.aliyun.com/ask/282759 Java正则表达式的语法组成部分有哪些? https://developer.aliyun.com/ask/282760Java正则表达式单个字符如何使用? https://developer.aliyun.com/ask/282761Java正则表达式字符组如何使用? https://developer.aliyun.com/ask/282762Java正则表达式量词如何使用? https://developer.aliyun.com/ask/282763Java正则表达式分组如何使用? https://developer.aliyun.com/ask/282764Java正则表达式特殊边界匹配如何使用? https://developer.aliyun.com/ask/282765Java正则表达式环视边界匹配如何使用? https://developer.aliyun.com/ask/282766Java中如何表示正则表达式? https://developer.aliyun.com/ask/282767Java中如何进行正则表达式切分? https://developer.aliyun.com/ask/282768Java中如何进行正则表达式验证? https://developer.aliyun.com/ask/282769Java中如何进行正则表达式查找? https://developer.aliyun.com/ask/282770Java中如何进行正则表达式替换? https://developer.aliyun.com/ask/282771 JDK8特性 Java8 Lambda表达式是什么? https://developer.aliyun.com/ask/282772 Java8 Lambda表达式语法有哪些? https://developer.aliyun.com/ask/282773Java如何检查是否是函数式接口? https://developer.aliyun.com/ask/282774Java8接口中默认方法是啥? https://developer.aliyun.com/ask/282775Java8接口中允许定义静态方法吗? https://developer.aliyun.com/ask/282776Java8集合之流式操作是啥? https://developer.aliyun.com/ask/282778Java8流式操作中串行和并行的流有啥区别? https://developer.aliyun.com/ask/282777Java8流式操作中中间操作有哪些? https://developer.aliyun.com/ask/282779

问问小秘 2020-06-02 15:05:40 0 浏览量 回答数 0

问题

2.1.4.6字符串处理相关函数

福利达人 2019-12-01 21:58:34 2425 浏览量 回答数 0

回答

奶奶个腿,问题终于解决了。不是脚本的问题,不过这个脚本在ie7以上也不老正常的。是数据库被人注入过,在替换后的{$TemplateName$}的文本里出现了<evalrequest("ice")%>字样,造成脚本读不到相应的node。谢谢各位相助<imgalt=""src="http://www.oschina.net/js/ke/plugins/emoticons/images/83.gif"/>没见过这样的文件 文件全文是什么样子的呢?全文太长,都是html,主要的目的就是点击链接,执行这个函数读取xml节点的数据显示在文本框中没文档吗??回复<aclass='referer'target='_blank'>@blindcat:很同情你没有,嘛都没有。都搞不懂为啥乱七八糟啥玩意都写在一个页面里selectSingleNode是IE下的特有用法  【http://www.w3school.com.cn/xmldom/met_node_selectsinglenode.asp】http://shaolong.me/k 刚查了下XPATH的查找语法://Template表示的是所有Template节点。从代码来看你想取得的是TemplateName等的类似节点。如果sTagName被alert出来是TemplateName,那么感觉应该写成"//Template"+"/"+ <spanstyle="font-family:Consolas,'BitstreamVeraSansMono','CourierNew',Courier,monospace;line-height:14.649999618530273px;background-color:#FFFFFF;">sTagName。你试试看行不行。一样的结果//就是忽略了路径,后面是拼的一个字符串我测试了很久,用了类似的取值方式,发现可能你alert的不对.你用xmlTemplate.selectSingleNode("//"),里面确定的应该是唯一的节点。假设为noded3,而根据语法<b>3</b>像这样在中间的值也是作为一个节点所以应该nodeValue,alert(nodes3.childNodes[0].nodeValue);我在本地自己写了一个测试程序是可以取到其中的值的。我写的代码放在博客里了http://my.oschina.net/luckyone/blog/127340。你可以拿去跑跑看。

爱吃鱼的程序员 2020-06-22 19:47:54 0 浏览量 回答数 0

问题

'*'和'.'组成的符号矩阵假设是一条河,用C语言求过河路线,为什么我的代码总是在求下一步的递归那里break?

a123456678 2019-12-01 19:51:42 1226 浏览量 回答数 1

问题

搜索引擎背后的经典数据结构和算法 6月10日 【今日算法】

游客ih62co2qqq5ww 2020-06-15 07:32:11 0 浏览量 回答数 0

问题

第6篇 指针数组字符串(下):报错

kun坤 2020-06-08 11:01:44 4 浏览量 回答数 1

回答

危险的做法,因为gets是不做边界检查的,能运行可能是越界少运气好。新的C标准已经废弃了这个函数gets()函数是遇到回车键结束的,所以即便你有定义好chara[8]l了也是没用的。为什么学c语言,都喜欢折腾这些通过stdin给入的数据,怎么就不喜欢从文件中读取块后做分析?为了交互?c语言有多少机会写gets,scanf?而且是一个个从键盘里面折腾。至于catxxx|bin这种,块读取,fread指定长度,仍然是高效和逻辑清晰的。fwrite难不难我不知道,反正scanf很简单,输入一个int一行就够。我整个程序就输入一个int,用到毛cmplex。为啥不在程序中改?不用重新编译,而且我就想交互。scanf是歪门邪道的话,世界上所有的语言都包括这个歪门邪道。有一大批人,计算机和非计算机的,学语言就是为了混论文和泡妞,别老拿自己的角度看别人。 @小郭一号新手?我现在还在带新手,fread,fwrite很难吗?没关系,我甚至给出接口,而让他学习lex的使用,做文本词汇解析,有必要知道接口吗?交互,cmp文本对比,有必要肉眼一个个判断吗?这和基础没关系,和自己的目标有关系,学点歪门邪道有屁用,学语言不是为了工程难道是为了混论文,泡妞?回复 @中山野鬼:首先谢谢你们无私的解答,我确实是一个新手,刚上大二,目前只学了C语言,这学期学校正在教授数据结构,可是我对自己的未来还是比较迷茫的,没有目标,不知道正确的努力方向,和正确的学习策略:学什么,如何学等问题。请问您我到底该如何学习,学什么,顺序又是怎么样的?如何才能成为一个真正的大神呢?回复 @小郭一号:首先谢谢你们无私的解答,我确实是一个新手,刚上大二,目前只学了C语言,这学期学校正在教授数据结构,可是我对自己的未来还是比较迷茫的,没有目标,不知道正确的努力方向,和正确的学习策略:学什么,如何学等问题。请问您我到底该如何学习,学什么,顺序又是怎么样的?如何才能成为一个真正的大神呢?回复 @中山野鬼:谈体验要有个对照。新手自己写的程序,如果没有scanf交互,跟有scanf比较,明显后者体验要好。然而输入字符的体验不如鼠标,这就是新手总想写图形界面的原因。别老拿自己的角度看别人。那要看你栈分配了多少哈,输入的东西破坏了栈会崩掉哈 首先,编译器不会报错,因为你运行之前编译器根本不知道你输入啥,你想正常输入他也报错吗?这个属于运行时问题。其次,可以为了交互而使用键盘输入,但是不要折腾,针对这个问题野鬼喷的有一定道理。最后,你这个问题分为gets和栈内存两个部分,本人能力有限无法解释清。

爱吃鱼的程序员 2020-06-14 22:04:52 0 浏览量 回答数 0

回答

结贴:这个问题解决了,在Extjs4.0中已经有此属性的配置了,看下面代码: Ext.Ajax.request( {                     method : 'POST',                     url : fields[i].js,                     async : false,//添加该属性即可同步                     success : function(response, option) {                         jsStr += response.responseText;                     },                     failure : function(response, option) {                         Ext.MessageBox.alert('错误信息提示',                                 '加载页面超时 或 页面连接错误!');                     }                 }); ######request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 ###### 引用来自“天涯咫尺”的答案 jquery ajax里面有个参数asycn 默认是true 代表异步,你把它设置成false时,就可用用了。 ext里面应该也有,因为这是ajax的一个参数。 asycn 表示的意思是单个ajax请求的时候 是否为异步, 如果设置为false, 则要等到服务器返回才会继续往下执行代码, 也就是你的页面就卡那, 直到服务器返回. 对于多个ajax之间的同步没有用处. 设置为false后, 每发送一个请求就卡住, 直到他返回, 每次返回都会触发success或failure, 而不是同步所有的ajax都完成之后, 只触发一次success或failure. ######你说的完全对,不过ajax的同步有时也是有用的。必须说在等待后台返回的数据,然后判断进行操作,最后返回TRUE或者FALSE的时候,必须要用ajax的同步了,或者能提供一个别的思路###### 引用来自“szmneo”的答案 request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 我也发现这个问题了,可是如何解决呢? 真是头疼 ######难道你知道原因了还搞不定ext的同步请求吗?extjs3.2是要自己另加插件的,叫ext-basex.js,然后代码里Ext.Ajax.request里就可以用async : false来控制,4.0我还没开始用呢,不知道内置async了没,自己查看源码吧###### 引用来自“Panaon”的答案 引用来自“szmneo”的答案 request是异步的啊 ,跟我当年的困惑一样,折腾了好久才明白……哈哈 我也发现这个问题了,可是如何解决呢? 真是头疼 那就在ajax的回调函数里面alert呗,或者在回调函数里面调用一个函数,这个函数做alert. ######ajax应该有支持同步的吧,看看是否有同步的参数,jquery是支持的###### jsStr变量在function里面赋的值,以上那种情况外面的jsStr肯定是没有值的。######楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert. ######和 extjs 没啥关系 去掉 extjs 代码 , 剩下 var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   } jsFieldLoading只是一个变量, 当然不会 alert , 如果想 alert , 加一个括号就行了。   var jsFieldLoading = function(fields) {                 var jsStr = "";                                 alert("test:" + jsStr);                 return jsStr;                   }();    ######你这真会误导 人……###### 引用来自“scl33”的答案 楼主, 你的意图没有说明白, 你是希望在所有的返回字符串全部链接完毕后再弹出对话框吗? 如果是这样, 你应该使用回调, 而不是return返回结果. 因此必须有一个外部的甚至是全局的变量用来存储返回的值, 并在回调中进行计数, 当全部响应后, 即计数等于循环最大值后, 才调用弹出.  var res= {sum:0,ary:[]};//make sure  accessible in your scope var handleFn = function(success, msg, max){     if (success) res.ary.push(msg);    if (max == ++res.sum) alert(res.ary.join(''));//all responsed, call your function back } 在ajax的success方法中改为 handleFn(true, response.responseText, fields.length); 同理,在failure方法中改为 handleFn(false, response.responseText, fields.length); 当所有的请求全部响应时, 才调用你定义的方法, 此处是alert. 这个功能主要响应EXTJS treepanel点击事件,加载指定URL的页面,因为用到了tabPanel所以对于使用全局变量不合适,而对于在success后执行自定义方法,并不能确定我调用jsFieldLoading方法是返回的是有效的值,现在问题困在如何返回AJAX请求到的文件内容,对于Extjs4.0里没有找到Ext.Ajax的同步设置属性,我现在想不出更好的方案解决它。

kun坤 2020-06-08 10:57:40 0 浏览量 回答数 0

问题

MaxCompute百问集锦(持续更新20171011)

隐林 2019-12-01 20:19:23 38430 浏览量 回答数 18

问题

第6篇 指针数组字符串(下)补充:报错

kun坤 2020-06-08 11:02:03 3 浏览量 回答数 1

回答

有点明白了,哈哈,异步的话,还是用回调函数吧   getData(function(data){ xxx; }); function getData(callback){ ...; callback(data); ...; } ######ajax可以设置同步!######可以试试用 $.Deferred###### 引用来自“con”的评论 可以试试用 $.Deferred 谢谢,刚才看dom数发现trigger和triggerHandler函数,一查也是看到了deffered,正在试,不过没有试验成功,希望能指导下 使用的jquery1.10.2和easyui1.4 简单地就是一个二级联动菜单,一个事件是一级菜单联动二级菜单,另外一个事件是载入数据的时候将数据写入(不过因为二级菜单跟着一级菜单走,所以得等到二级菜单载入完毕才能写入数据) 下面的代码都是放在$()里面的 //设置一级菜单的二级菜单联动 $('#topic1').combobox({ onChange:function(n,o){ topic2Loaded=false;//因为没有搞懂deferred用法,这个是加的全局变量准备用全局变量来判断 var f_s; //alert(1); f_s=getTopic2(n);    //这个是我现在的简单的存储处理方法 if(f_s==false){ $.post('../server/t_getsubtopic.php',{father:n},function(data,sta,xhr){ jQuery('#topic2').combobox('clear').combobox('loadData',data.topic); eval('db_topic2.'+'f'+n+'=data.topic;'); topic2Loaded=true; },'json'); }else{ jQuery('#topic2').combobox('clear').combobox('loadData',f_s); topic2Loaded=true; } } });        //初始化编辑器的显示内容 jQuery.post('../server/t_editorinit.php',function(data,sta,xhr){ var jjj; jQuery('#topic1').combobox('clear').combobox('loadData',data.topic); jQuery('#saved').attr('value',1); jQuery('#subject').combobox('clear').combobox('loadData',data.subject); if(data.topic.length==0){ jQuery.messager.alert('提示','当前无权限进行操作,请登陆后刷新本页面。','info'); //jQuery('#saved').window('close'); }else{ //是否读取数据,如果是的话读取数据 var id=getURLRequest('id'); if(id){ jQuery.post('../server/getcontent.php',{id:id},function(data,sta,xhr){ var topic=data.path[0]; //jQuery.when(jQuery('#topic1').combobox('select',topic.father.index);); jQuery('#topic1').combobox('select',topic.father.index);                                         //这里就没有看懂,包括看的jquery的api里面then貌似已经废弃了的,这里执行不下去 // jQuery.when(jQuery('#topic1').triggerHandler( // 'onChange',jQuery('#topic1').combobox('getValue') // )).done(jQuery('#topic2').combobox('select',topic.son.topicid)); jQuery('#topic2').combobox('select',topic.son.topicid); //jQuery('#saved').attr('saved')=1; },'json'); } } },'json'); ###### 试了半天没有试出来,现在这样做的,但是看着好丑…… 最主要是如果超500ms没有完成载入就丑了…… jQuery.post('../server/getcontent.php',{id:id},function(data,sta,xhr){ var topic=data.path[0];         jQuery('#topic1').combobox('select',topic.father.index).delay(500).queue(function(){             jQuery('#topic2').combobox('select',topic.son.topicid);         }); jQuery('#saved').attr('saved')=1; },'json'); ###### 1、首先是通过Deferred实现的数据存储 // 存储函数 function getData(dfd, name) { var sdata = []; // 缓存所有ajax请求过的数据 if ( sdata[name] ){ dfd.resolve( sdata[name] ); } else { $.ajax({ url: xxx, }).done( function (data) { sdata[name] = data; dfd.resolve( data ); }) } } // 调用方式 var dfd = $.Deferred(); dfd.done( function (data) { // 拿到数据后要执行的操作 }); getData(dfd, "name1"); Deferred对象的使用方式大抵如上。 2、combobox二级菜单 简单看了下easyui combobox的api,一级菜单被选择时,更新二级菜单内容,可以用类似下面的写法: $("#level_1").combobox({ onSelect: function (record) { // 获取二级菜单内容并缓存,调用上面的getData var dfd = $.Deferred(); dfd.done(function (data) { $("#level_2").combobox( 'loadData', data); }); //这里的record不知道是个啥东西,可能需要加工一下再传入getData getData(dfd, record); } }); 不知道这种方式是不是能满足你说的菜单联动和缓存数据的需求 ###### 引用来自“con”的评论 1、首先是通过Deferred实现的数据存储 // 存储函数 function getData(dfd, name) { var sdata = []; // 缓存所有ajax请求过的数据 if ( sdata[name] ){ dfd.resolve( sdata[name] ); } else { $.ajax({ url: xxx, }).done( function (data) { sdata[name] = data; dfd.resolve( data ); }) } } // 调用方式 var dfd = $.Deferred(); dfd.done( function (data) { // 拿到数据后要执行的操作 }); getData(dfd, "name1"); Deferred对象的使用方式大抵如上。 2、combobox二级菜单 简单看了下easyui combobox的api,一级菜单被选择时,更新二级菜单内容,可以用类似下面的写法: $("#level_1").combobox({ onSelect: function (record) { // 获取二级菜单内容并缓存,调用上面的getData var dfd = $.Deferred(); dfd.done(function (data) { $("#level_2").combobox( 'loadData', data); }); //这里的record不知道是个啥东西,可能需要加工一下再传入getData getData(dfd, record); } }); 不知道这种方式是不是能满足你说的菜单联动和缓存数据的需求 谢谢,因为没用过所以还不太清楚,不过我就当是回调函数理解的话貌似这样的确可以解决问题,有时间的时候我会试着用这个代码并学习一下deferred这个有用的东西的。 至于之前我的解决方式整体就是这样的,不过有eval在里面真的好丑…… var db_topic2={};//用于存储topic2的本地数据,以免频繁进行查询 function getTopic2(father){ //通过查询本地dbTopic2来获取topic2的数据,如果没有的话才进行远程查询 // father='f'+father;//转换为字符 var flag; eval('flag=db_topic2.'+father+';'); if(flag){ return flag; }else{ //通过数据进行查询 return false; } } //设置一级菜单的二级菜单联动 $('#topic1').combobox({ onChange:function(n,o){ $('#saved').prop('value','0');//设置未保存 var f_s; f_s=getTopic2(n); if(f_s==false){ $.post('../server/t_getsubtopic.php',{father:n},function(data,sta,xhr){ jQuery('#topic2').combobox('clear').combobox('loadData',data.topic); eval('db_topic2.'+'f'+n+'=data.topic;'); },'json'); }else{ jQuery('#topic2').combobox('clear').combobox('loadData',f_s); } } }); //载入数据时候的设置 jQuery('#topic1').combobox('select',n.father.index).delay(500).queue(function(){ jQuery('#topic2').combobox('select',n.son.topicid); $(this).dequeue(); }).delay(500).queue(function(){ //因为存在延时,所以得在这里再延时设置已保存状态 $('#saved').prop('value','1');//设置已保存 $(this).dequeue(); }); 看着很丑吧…… ###### /* * 获取数据方法 * name: 数据key * fn: 回调函数 */ function getData(name, fn) { if(typeof getData.cache[name] != "undefined") { fn(getData.cache[name]); return; } $.post("index.php", { name: name }, function (data) { getData.cache[name] = data; fn(data); }, "json"); } getData.cache = {}; //使用实例 getData("user", function (user) { alert(user.name); }); ###### 引用来自“mr-zhuo”的评论 /* * 获取数据方法 * name: 数据key * fn: 回调函数 */ function getData(name, fn) { if(typeof getData.cache[name] != "undefined") { fn(getData.cache[name]); return; } $.post("index.php", { name: name }, function (data) { getData.cache[name] = data; fn(data); }, "json"); } getData.cache = {}; //使用实例 getData("user", function (user) { alert(user.name); }); 谢谢,用回调函数适用范围应该更广一些。###### 这里有篇关于deferred的,不错。 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

kun坤 2020-06-07 00:35:34 0 浏览量 回答数 0

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

以下是我列出的2020年Java开发者应该学习的技术: 1、DevOps (Docker and Jenkins) 过去的一年,越来越多的公司正在转型DevOps,DevOps非常庞大,需要学习很多工具和原理,但你不需要担心。有大神已经分享了DevOps路线图(https://github.com/kamranahmedse/developer-roadmap,可以按照这个路线图以自己的速度学习和掌握DevOps。 如果你是一个有经验的Java程序员,愿意学习环境管理、自动化和整体改进,你也可以成为DevOps工程师。 2、Java 9 - Java 15 相信现在很多Java开发人员主要使用的Java版本还是以Java 8为主,虽然Java 9 - Java 13已经推出了有一段时间。 但是作为Java程序员,我们可能因为某些原因没办法在线上环境真正的进行JDK的升级,但是花一些时间学习Java 9、Java 10、Java 11、Java 12和 Java 13的新特性还是有必要的。 另外,大家可以重点关注一些关键特性,如GC相关的特性、对编码风格有改变的特性等。还有就是Java的LTS版本(Java 8、Java 11)要重点学习。 还要提醒大家一点,在2020年,Oracle还会推出Java 14 和 Java 15!!!如果你在使用Java 7的话,马上就要被"套圈"了! 3、Spring Framework 5 2017年我们见证了Spring和Java生态系统的许多重大升级,Spring 5.0就是其中之一。Spring 5 的新反应式编程模型、HTTP/2 支持,以及 Spring 通过 Kotlin 对函数式编程的全面支持这些都值得我们好好了解一下。 4、Spring Security 5.0 Spring Security 5.0 提供了许多新功能,并支持 Spring Framework 5.0,总共有 400 多个增强功能和 bug 修复。在Spring Security 5.0.0之前,密码是明文保存,十分不安全。因为这一次发布的是大版本,所以我们决定使用更安全的密码存储方式。Spring Security 5.0.0的主要亮点在于它只需要最小化的JDK 8、反应式安全特性、OAuth 2.0(OIDC)和现代密码存储。 5、Spring Boot 2 Spring Boot 2.0 基于 Spring 5 Framework ,提供了 异步非阻塞 IO 的响应式 Stream 、非堵塞的函数式 Reactive Web 框架 Spring WebFlux等特性。很多使用过SpringBoot的人都知道,使用SpringBoot搭建Web应用真的是又快又好,相信Spring Boot 2会带来更多惊喜。 6、Hadoop、Spark 和 Kafka 另外在2020年Java程序员需要学习的是大数据相关的知识。特别是Apache Spark 和 Kafka两个框架。 如果你也想在2020年学习大数据,也一定绕不开Hadoop生态。 7、Elasticsearch 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。维基百科、Stack Overflow、Github 都在使用它。 Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。 8、ServiceMesh 这两年很火,火的一塌糊涂。在2019年,但凡是程序员相关的大会,如果没有讲ServiceMest的专题,那都不好意思开。 所有人都在说 ServiceMesh; 几乎没人知道怎么落地 ServiceMesh; 但是大家都觉得其他人在大力做 ServiceMesh; 所以大家都宣称自己在做 ServiceMesh; 这个号称下一代微服务架构的概念,现在对于大多数人来说根本不知道是啥。只知道很多大厂宣称自己在做,很多大牛在布道。 9、Serverless 无服务器运算(英语:Serverless computing),又被称为功能即服务(Function-as-a-Service,缩写为 FaaS),是云计算的一种模型。以平台即服务(PaaS)为基础,无服务器运算提供一个微型的架构,终端客户不需要部署、配置或管理服务器服务,代码运行所需要的服务器服务皆由云平台来提供。这东西,听上去就很高大上。 2019年,和ServiceMesh一样,所有人都宣称自己在做。但是又很很多人不知道他到底是什么。 10、Kotlin 如果大家有关注Java 13的新特性的话,一定知道推出了字符串文本块的功能,这个功能其实是借鉴的Kotlin,除此之外,最近几年,Java有很多特性都在借鉴Kotlin,相比较于Java,Kotlin更加简洁,而且Kotlin编出来的代码也可以直接通过JVM运行。 Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。Kotlin的设计初衷就是用来生产高性能要求的程序的,所以运行起来和Java也是不相上下。Kotlin可以从 JetBrains InteilliJ Idea IDE这个开发工具以插件形式使用。 总结 以上,就是作者总结的建议Java程序员在2020年学习的一些技术,其中有一些是一定要学习的,还有一些是看大家的精力情况酌情考虑。

剑曼红尘 2020-04-07 20:42:52 0 浏览量 回答数 0

回答

回 1楼yjseu的帖子 这是要重新build OSS_C_SDK的lib文件吗?我用的是VS2012,也是这样操作? ------------------------- 回 3楼yjseu的帖子 我把调用函数的CPP文件都照你说的改了编码,加上#pragma once  #pragma execution_character_set("utf-8") ,编译的时候报错,在注释中遇到意外的文件结束,不知道啥原因,没改前是GB2312,是没这个问题的 ------------------------- 回 5楼yjseu的帖子 1>------ 已启动生成: 项目: OSSTest (Visual Studio 2010), 配置: Debug Win32 ------ 1>  ObjectTest.cpp 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(3): warning C4068: 未知的杂注 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(128): error C2065: “headers”: 未声明的标识符 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(142): error C2065: “headers”: 未声明的标识符 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(146): error C2065: “headers”: 未声明的标识符 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(310): error C2065: “complete_resp_headers”: 未声明的标识符 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(312): error C2065: “complete_resp_headers”: 未声明的标识符 1>c:\users\administrator\desktop\osstest\osstest\objecttest.cpp(333): fatal error C1071: 在注释中遇到意外的文件结束 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== ------------------------- 回 7楼yjseu的帖子 headers和complete_resp_headers是初始化过了的,都是按照C_Sdk中的例子来写的,没改成UTF-8未签名的编码前(默认GB2312)时编译是通过的,而且照你说的,在头文件声明后加上那两行也没有什么效果 ------------------------- 回 7楼yjseu的帖子 刚才的报错原因找到了,是因为改成UTF-8格式后,中文注释后面都要加一个空格才行,现在编译通过,但是发现变量中的中文乱码了,如图中的filename中的中文路径乱码依然会导致打开文件失败,不知道怎么解决呢?我是新手,请多指教! ------------------------- 回 10楼yjseu的帖子 那我还是把测试程序发你帮我看一下吧,请问怎么发你呢?私信好像只能发文字信息?

samhuang1987 2019-12-02 00:41:45 0 浏览量 回答数 0

问题

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

问问小秘 2020-06-02 14:27:10 11463 浏览量 回答数 3

问题

【算法】五分钟算法小知识:Linux的进程、线程、文件描述符是什么?

游客ih62co2qqq5ww 2020-05-09 11:28:57 0 浏览量 回答数 0

回答

前言之前因为仅仅是把HBase当成一个可横向扩展并且具有持久化能力的KV数据库,所以只用在了指标存储上,参看很早之前的一篇文章基于HBase做Storm 实时计算指标存储。这次将HBase用在了用户行为存储上,因为Rowkey的过滤功能也很不错,可以很方便的把按人或者内容的维度过滤出所有的行为。从某种意义上,HBase的是一个有且仅有一个多字段复合索引的存储引擎。 虽然我比较推崇实时计算,不过补数据或者计算历史数据啥的,批处理还是少不了的。对于历史数据的计算,其实我是有两个选择的,一个是基于HBase的已经存储好的行为数据进行计算,或者基于Hive的原始数据进行计算,最终选择了前者,这就涉及到Spark(StreamingPro) 对HBase的批处理操作了。 整合过程和Spark 整合,意味着最好能有Schema(Mapping),因为Dataframe 以及SQL API 都要求你有Schema。 遗憾的是HBase 有没有Schema取决于使用者和场景。通常SparkOnHBase的库都要求你定义一个Mapping(Schema),比如hortonworks的 SHC(https://github.com/hortonworks-spark/shc) 就要求你定义一个如下的配置: {"rowkey":"key","table":{"namespace":"default", "name":"pi_user_log", "tableCoder":"PrimitiveType"},"columns":{"col0":{"cf":"rowkey", "col":"key", "type":"string"},"col1":{"cf":"f","col":"col1", "type":"string"}}}看上面的定义已经还是很容易看出来的。对HBase的一个列族和列取一个名字,这样就可以在Spark的DataSource API使用了,关于如何开发Spark DataSource API可以参考我的这篇文章利用 Spark DataSource API 实现Rest数据源中使用,SHC大体实现的就是这个API。现在你可以这么用了: val cat = "{n"rowkey":"key","table":{"namespace":"default", "name":"pi_user_log", "tableCoder":"PrimitiveType"},n"columns":{"col0":{"cf":"rowkey", "col":"key", "type":"string"},n"28360592":{"cf":"f","col":"28360592", "type":"string"}n}n}" val cc = sqlContext .read .options(Map(HBaseTableCatalog.tableCatalog -> cat)) .format("org.apache.spark.sql.execution.datasources.hbase") .load() 不过当你有成千上万个列,那么这个就无解了,你不大可能一一定义,而且很多时候使用者也不知道会有哪些列,列名甚至可能是一个时间戳。我们现在好几种情况都遇到了,所以都需要解决: 自动获取HBase里所有的列形成Schema,这样就不需要用户配置了。规定HBase只有两个列,一个rowkey,一个 content,content 是一个map,包含所有以列族+列名为key,对应内容为value。先说说第二种方案(因为其实第一种方案也要依赖于第二种方案): { "name": "batch.sources", "params": [ { "inputTableName": "log1", "format": "org.apache.spark.sql.execution.datasources.hbase.raw", "path": "-", "outputTable": "log1" } ] }, { "name": "batch.sql", "params": [ { "sql": "select rowkey,json_value_collect(content) as actionList from log1", "outputTableName":"finalTable" } ] }, 首先我们配置了一个HBase的表,叫log1,当然,这里是因为程序通过hbase-site.xml获得HBase的链接,所以配置上你看不到HBase相关的信息。接着呢,在SQL 里你就可以对content 做处理了。我这里是把content 转化成了JSON格式字符串。再之后你就可以自己写一个UDF函数之类的做处理了,从而实现你复杂的业务逻辑。我们其实每个字段里存储的都是JSON,所以我其实不关心列名,只要让我拿到所有的列就好。而上面的例子正好能够满足我这个需求了。 而且实现这个HBase DataSource 也很简单,核心逻辑大体如下: case class HBaseRelation( parameters: Map[String, String], userSpecifiedschema: Option[StructType] )(@transient val sqlContext: SQLContext) extends BaseRelation with TableScan with Logging { val hbaseConf = HBaseConfiguration.create() def buildScan(): RDD[Row] = { hbaseConf.set(TableInputFormat.INPUT_TABLE, parameters("inputTableName")) val hBaseRDD = sqlContext.sparkContext.newAPIHadoopRDD(hbaseConf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result]) .map { line => val rowKey = Bytes.toString(line._2.getRow) import net.liftweb.{json => SJSon} implicit val formats = SJSon.Serialization.formats(SJSon.NoTypeHints) val content = line._2.getMap.navigableKeySet().flatMap { f => line._2.getFamilyMap(f).map { c => (Bytes.toString(f) + ":" + Bytes.toString(c._1), Bytes.toString(c._2)) } }.toMap val contentStr = SJSon.Serialization.write(content) Row.fromSeq(Seq(UTF8String.fromString(rowKey), UTF8String.fromString(contentStr))) } hBaseRDD }}那么我们回过头来,如何让Spark自动发现Schema呢?大体你还是需要过滤所有数据得到列的合集,然后形成Schema的,成本开销很大。我们也可以先将我们的数据转化为JSON格式,然后就可以利用Spark已经支持的JSON格式来自动推倒Schema的能力了。 总体而言,其实并不太鼓励大家使用Spark 对HBase进行批处理,因为这很容易让HBase过载,比如内存溢出导致RegionServer 挂掉,最遗憾的地方是一旦RegionServer 挂掉了,会有一段时间读写不可用,而HBase 又很容易作为实时在线程序的存储,所以影响很大。

hiekay 2019-12-02 01:42:58 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0

回答

PHP面试干货 1、进程和线程 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于: 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。 2、apache默认使用进程管理还是线程管理?如何判断并设置最大连接数? 一个进程可以开多个线程 默认是进程管理 默认有一个主进程 Linux: ps -aux | grep httpd | more 一个子进程代表一个用户的连接 Conf/extra/httpd-mpm.conf 多路功能模块 http -l 查询当前apache处于什么模式下 3、单例模式 单例模式需求:只能实例化产生一个对象 如何实现: 私有化构造函数 禁止克隆对象 提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一对象 需要一个保存类的静态属性 class demo { private static $MyObject; //保存对象的静态属性 private function __construct(){ //私有化构造函数 } private function __clone(){ //禁止克隆 } public static function getInstance(){ if(! (self::$MyObject instanceof self)){ self::$MyObject = new self; } return self::$MyObject; } } 4、安装完Apache后,在http.conf中配置加载PHP文件以Apache模块的方式安装PHP,在文件http.conf中首先要用语句LoadModule php5_module "e:/php/php5apache2.dll"动态装载PHP模块,然后再用语句AddType application/x-httpd-php .php 使得Apache把所有扩展名为PHP的文件都作为PHP脚本处理 5、debug_backtrace()函数能返回脚本里的任意行中调用的函数的名称。该函数同时还经常被用在调试中,用来判断错误是如何发生的 function one($str1, $str2) { two("Glenn", "Quagmire"); } function two($str1, $str2) { three("Cleveland", "Brown"); } function three($str1, $str2) { print_r(debug_backtrace()); } one("Peter", "Griffin"); Array ( [0] => Array ( [file] => D:\www\test\result.php [line] => 9 [function] => three [args] => Array ( [0] => Cleveland [1] => Brown ) ) [1] => Array ( [file] => D:\www\test\result.php [line] => 5 [function] => two [args] => Array ( [0] => Glenn [1] => Quagmire ) ) [2] => Array ( [file] => D:\www\test\result.php [line] => 16 [function] => one [args] => Array ( [0] => Peter [1] => Griffin ) ) ) 6、输出用户的IP地址,并且判断用户的IP地址是否在192.168.1.100 — 192.168.1.150之间 echo $ip=getenv('REMOTE_ADDR'); $ip=str_replace('.','',$ip); if($ip<1921681150 && $ip>1921681100) { echo 'ip在192.168.1.100—–192.168.1.150之间'; } else { echo 'ip不在192.168.1.100—–192.168.1.150之间'; } 7、请将2维数组按照name的长度进行重新排序,按照顺序将id赋值 $tarray = array( array('id' => 0, 'name' => '123'), array('id' => 0, 'name' => '1234'), array('id' => 0, 'name' => '1235'), array('id' => 0, 'name' => '12356'), array('id' => 0, 'name' => '123abc') ); foreach($tarray as $key=>$val) { $c[]=$val['name']; } function aa($a,$b) { if(strlen($a)==strlen($b)) return 0; return strlen($a)>strlen($b)?-1:1; } usort($c,'aa'); $len=count($c); for($i=0;$i<$len;$i++) { $t[$i]['id']=$i+1; $t[$i]['name']=$c[$i]; } print_r($t); 8、表单数据提交方式POST和GET的区别,URL地址传递的数据最大长度是多少? POST方式提交数据用户不可见,是数据更安全,最大长度不受限制,而GET方式传值在URL地址可以看到,相对不安全,对大长度是2048字节。 9、SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历 SESSION和COOKIE都能够使值在页面之间进行传递,SESSION存储在服务器端,数据更安全,COOKIE保存在客户端,用户使用手段可以进行修改,SESSION依赖于COOKIE进行传递的。Session遍历使用$_SESSION[]取值,cookie遍历使用$_COOKIE[]取值。 10、什么是数据库索引,主键索引,唯一索引的区别,索引的缺点是什么 索引用来快速地寻找那些具有特定值的记录。 主键索引和唯一索引的区别:主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”,每个表只能有一个主键。唯一索引索引列的所有值都只能出现一次,即必须唯一。 索引的缺点: 1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 2、索引需要占用物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,需要的空间就会更大。 3、当对表中的数据进行增加、删除、修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 11、数据库设计时,常遇到的性能瓶颈有哪些,常有的解决方案 瓶颈主要有: 1、磁盘搜索 优化方法是:将数据分布在多个磁盘上 2、磁盘读/写 优化方法是:从多个磁盘并行读写。 3、CPU周期 优化方法:扩充内存 4、内存带宽 12、include和require区别 include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。 require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。 13、文件上传时设计到点 和文件上传有关的php.ini配置选项(File Uploads): file_uploads=On/Off:文件是否允许上传 upload_max_filesize上传文件时,单个文件的最大大小 post_max_size:提交表单时,整个post表单的最大大小 max_file_uploads =20上传文件的个数 内存占用,脚本最大执行时间也间接影响到文件的上传 14、header常见状态 //200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富 15、ORM和ActiveRecord ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。还可以隔离底层数据库层,我们不需要关心我们使用的是mysql还是其他的关系型数据库 ActiveRecord也属于ORM层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。 ActiveRecord的主要思想是: 1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field; 2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;; 3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑; ActiveRecord比较适用于: 1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作; 2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中; 3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了; 这些优点使ActiveRecord特别适合WEB快速开发。 16、斐波那契方法,也就是1 1 2 3 5 8 ……,这里给出两种方法,大家可以对比下,看看哪种快,以及为什么 function fibonacci($n){ if($n == 0){ return 0; } if($n == 1){ return 1; } return fibonacci($n-1)+fibonacci($n-2); } function fibonacci($n){ for($i=0; $i<$n; $i++){ $r[] = $i<2 ? 1 : $r[$i-1]+$r[$i-2]; } return $r[--$i]; } 17、约瑟夫环,也就是常见的数猴子,n只猴子围成一圈,每只猴子下面标了编号,从1开始数起,数到m那么第m只猴子便退出,依次类推,每数到m,那么那个位置的猴子退出,那么最后剩下的猴子下的编号是啥。 function yuesefu($n,$m) { $r=0; for($i=2; $i<=$n; $i++) { $r=($r+$m)%$i; } return $r+1; } 18、冒泡排序,大致是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束 function bubbleSort($arr){ for($i=0, $len=count($arr); $i<$len; $i++){ for($j=0; $j<$len; $j++){ if($arr[$i]<$arr[$j]){ $tmp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } 19、快速排序,也就是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。 function quickSort($arr){ $len = count($arr); if($len <=1){ return $arr; } $key = $arr[0]; $leftArr = $rightArr= array(); for($i=1; $i<$len; $i++){ if($arr[$i] <= $key){ $leftArr[] = $arr[$i]; } else{ $rightArr[] = $arr[$i]; } } $leftArr = quickSort($leftArr); $rightArr = quickSort($rightArr); return array_merge($leftArr, array($key), $rightArr); } 20、(递归的)列出目录下所有文件及目录,这里也有两种方法 function listDir($path){ $res = dir($path); while($file = $res->read()){ if($file == '.' || $file == '..'){ continue; } if(is_dir($path . '/' .$file)){ echo $path . '/' .$file . "\r\n"; listDir($path . '/' .$file); } else{ echo $path . '/' .$file . "\r\n"; } } $res->close(); } function listDir($path){ if(is_dir($path)){ if(FALSE !== ($res = opendir($path))){ while(FALSE !== ($file = readdir($res))){ if($file == '.' || $file == '..'){ continue; } $subPath = $path . '/' . $file; if(is_dir($subPath)){ echo $subPath . "\r\n"; listDir($subPath); } else{ echo $subPath . "\r\n"; } } } } } 21、找出相对的目录,比如/a/b/c/d/e.php相对于/a/b/13/34/c.php是/c/d/ function ralativePath($a, $b){ $a = explode('/', dirname($a)); $b = explode('/', dirname($b)); $c = '/'; foreach ($a as $k=> $v){ if($v != $b[$k]){ $c .= $v . '/'; } } echo $c; } 22、快速找出url中php后缀 function get_ext($url){ $data = parse_url($url); return pathinfo($data['path'], PATHINFO_EXTENSION); } 23、正则题,使用正则抓取网页,以网页meta为utf8为准,若是抓取的网页编码为big5之类的,需要转化为utf8再收录 function preg_meta($meta){ $replacement = "\\1utf8\\6\\7"; $pattern = '#(<meta\s+http-equiv=(\'|"|)Content-Type(\'|"|)\s+content=(\'|"|)text/html; charset=)(\w+)(\'|"|)(>)#i'; return preg_replace($pattern, $replacement, $meta); } echo preg_meta("<meta http-equiv=Content-Type content='text/html; charset=big5'><META http-equiv=\"Content-Type\" content='text/html; charset=big5'>"); 24、不用php的反转函数倒序输出字符串,如abc,反序输出cba function revstring($str){ for($i=strlen($str)-1; $i>=0; $i--){ echo $str{$i}; } } revstring('abc'); 25、常见端口 TCP 21端口:FTP 文件传输服务 SSH 22端口:SSH连接linux服务器,通过SSH连接可以远程管理Linux等设备 TCP 23端口:TELNET 终端仿真服务 TCP 25端口:SMTP 简单邮件传输服务 UDP 53端口:DNS 域名解析服务 TCP 80端口:HTTP 超文本传输服务 TCP 110端口:POP3 “邮局协议版本3”使用的端口 TCP 443端口:HTTPS 加密的超文本传输服务 TCP 1521端口:Oracle数据库服务 TCP 1863端口:MSN Messenger的文件传输功能所使用的端口 TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口 TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口 UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口 TCP 5000端口:MS SQL Server使用的端口 UDP 8000端口:腾讯QQ 26、linux常用的命令 top linux进程实时监控 ps 在Linux中是查看进程的命令。ps查看正处于Running的进程 mv 为文件或目录改名或将文件由一个目录移入另一个目录中。 find 查找文件 df 可显示所有文件系统对i节点和磁盘块的使用情况。 cat 打印文件类容 chmod 变更文件或目录的权限 chgrp 文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。 wc 为统计指定文件中的字节数、字数、行数,并将统计结果显示输出 27、对于大流量的网站,您采用什么样的方法来解决访问量问题 首先,确认服务器硬件是否足够支持当前的流量 其次,优化数据库访问。 第三,禁止外部的盗链。 第四,控制大文件的下载。 第五,使用不同主机分流主要流量 第六,使用流量分析统计软件 28、$_SERVER常用的字段 $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名 $_SERVER['SERVER_NAME'] #当前运行脚本所在服务器主机的名称 $_SERVER['REQUEST_METHOD'] #访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT” $_SERVER['QUERY_STRING'] #查询(query)的字符串 $_SERVER['HTTP_HOST'] #当前请求的 Host: 头部的内容 $_SERVER['HTTP_REFERER'] #链接到当前页面的前一页面的 URL 地址 $_SERVER['REMOTE_ADDR'] #正在浏览当前页面用户的 IP 地址 $_SERVER['REMOTE_HOST'] #正在浏览当前页面用户的主机名 $_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名 $_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用 $_SERVER['REQUEST_URI'] #访问此页面所需的 URI。例如,“/index.html” 29、安装php扩展 进入扩展的目录 phpize命令得到configure文件 ./configure --with-php-config=/usr/local/php/bin/php-config make & make install 在php.ini中加入扩展名称.so 重启web服务器(nginx/apache) 30、php-fpm与nginx PHP-FPM也是一个第三方的FastCGI进程管理器,它是作为PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比spawn-fcgi引擎好很多,因此,推荐Nginx+PHP/PHP-FPM这个组合对PHP进行解析。 FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求 #fastcgi FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。 FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问时,几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在已经很少被使用了。 FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 Nginx+FastCGI运行原理 Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket,(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端,这就是Nginx+FastCGI的整个运作过程。 31、ajax全称“Asynchronous Javascript And XML”(异步JavaScript和XML)

小川游鱼 2019-12-02 01:41:29 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板