• 关于

    C-HTML是干嘛的

    的搜索结果

回答

已经自行搞定了,高手漂过吧,谢谢 http://www.513624.com/archives/960.html ------------------------- 回 2楼(李逵) 的帖子 不懂您说的是干嘛用的。。。。但还是安装了,您再试试有改观吗?
bjjcmy 2019-12-02 02:29:49 0 浏览量 回答数 0

回答

“可我想给网站BBS弄二级域名提示我没有备案.... ” 这个情况是怎么来的? 备案服务号么, http://bbs.aliyun.com/read/259103.html?spm=5176.bbsl229.0.0.HtZHTB ------------------------- 回 2楼(爱上小萝莉) 的帖子 自己在机器哪里做一个301条转不就够了,干嘛一定要在dns上浓
妙正灰 2019-12-01 23:26:52 0 浏览量 回答数 0

回答

Re建网站求助 谁能给点建议,我该怎么办? 个人域名是neapeng.com ------------------------- Re建网站求助 这个RDS管理后台干嘛的进去看不懂 ------------------------- Re建网站求助 ------------------------- Re建网站求助 ------------------------- Re建网站求助 这个老是提示错误,是不是RDS本来就可以做后台管理?里面全是空的,要导入的sql文件是什么?怎么做?有模版吗 ------------------------- Re建网站求助 https://bbs.aliyun.com/read/270692.html?spm=5176.bbsr270925.0.0.K0Inr6 找到一个讲解的,在试 ------------------------- 回 7楼dongshan8的帖子 谢谢,这个成了, 现在又碰到这个问题 http://www.douban.com/note/342013806/ 我跟这个一样把域名改了,删了后面的wordpress 导致现在无法登录了,正郁闷呢 ------------------------- 回 9楼dongshan8的帖子 后来想了个办法,把wordpress里面的文件全部移动到外面根目录就好了, 原先wordpress默认是域名/wordpress,现在成了域名/, ------------------------- Re建网站求助 现在输入域名直接成这个页面了,原先的变了。目前还不明白 ------------------------- Re建网站求助 目前这个样子不是我想要的,我想的是目前主页上的neapeng小站点开的那个网站,文章推荐显示发布的文章,这个文章在后台控制,而不是用的wordpress来做,这个效果很不好,很不好控,无法添加随意代码,比如标签云,球型,每个标签可以转圈的,三年前做这个是别人帮做的,长时间没用,现在自己弄弄不好了,那个数据库内容都可以更改,首页可以用dreamweaver编辑,我目前只会这个软件 ------------------------- 回 15楼dongshan8的帖子 阿里云是就是wordpress元模版,我自己弄的,
猎杀师 2019-12-02 01:36:54 0 浏览量 回答数 0

回答

Re晒交易成功订单时间!看前面还有几人 等了一天,o秒一闪后马上支付,然后立即出错,然后用户中心不能进,然后又是然后。。。 大约十三分钟后,可以支付了,然后,一刷新 http://www.aliyun.com/act/1111.html 天,已经一千多台了。。。 我的支付时间是: 215955    消费    -    4823.89    26.11    2012-11-10 23:13:56    订单号:2012111000921 我对阿里云非常失望了,早知道不T心了。。。这失望不是中不中奖的问题,而是,竟然负载这么差,但阿里云是云服务商呀,这种情形都有,怎么解释? ------------------------- Re晒交易成功订单时间!看前面还有几人 等了一天,o秒一闪后马上支付,然后立即出错,然后用户中心不能进,然后又是然后。。。 大约十三分钟后,可以支付了,然后,一刷新 http://www.aliyun.com/act/1111.html 天,已经一千多台了。。。 我的支付时间是:2012-11-10 23:13:56 我对阿里云非常失望了,早知道不T心了。。。这失望不是中不中奖的问题,而是,竟然负载这么差,但阿里云是云服务商呀,这种情形都有,怎么解释? ------------------------- 回12楼micas2012的帖子 对,这真和中不中奖没关系,就官方自己人为挂掉还是这点用户就挂掉来看,这和云有半毛钱关系嘛?娘的。。。对这活动浪费一天时间真是错了。 ------------------------- 回25楼easonapp的帖子 干哟,哥们,你还能打通客服,说明祖上有德。。。这几十万?汗,这客服恐怕是大嘴巴吧? ------------------------- Re晒交易成功订单时间!看前面还有几人 如果是十几万人,那么,来论坛找理的不应该就这么点人。。。这客服的话术太差了吧,张口就十几万。。。 ------------------------- 回31楼micas2012的帖子 记住这数据码一下就可以改之的。。。 其实,我们大家都不是冲着t10来的,就是奔着七个月而来。 但出现这种情形,说明的问题太多了,这如何能让人高兴和放心? ------------------------- 回37楼wyz0551的帖子 像我这种等了一天,中间还三翻五次去电客服了解详情的人、0秒就开抢,然后花了几十分钟才让自己的钱让成功划后出去的人,肯定有一堆。。。 问题就在于:谁敢相信,阿里云会有这种状况出现? 难道这就是阿里巴巴集团的 阿里云计算有限公司?
chinaltch 2019-12-02 00:00:48 0 浏览量 回答数 0

回答

Re【急】wdcp转到amh后,伪静态全部失效 如果需要ssh来编辑,麻烦给个命令,谢谢,新手实在不懂这些。 ------------------------- 回2楼dongshan8的帖子 谢谢斑竹,已经用你的方法修改了文章,但还是不行。 只能再看看了,估计不是这个文件的问题。 搞不懂了,wdcp安装后直接就可以使用,amh就不行。 ------------------------- 回4楼dongshan8的帖子 1. 是apache 2. 修改后重启过apache 3. 具体的目录?这个是什么意思呢? ------------------------- 回6楼dongshan8的帖子 挂了个伪静态,就变成403. 伪静态文件不用,就是404. 搞不明白了 以前用wdcp,啥都没有配置,就可以用 改到amh,不知道什么原因,就是不型。 但是不启用伪静态,就可以正常。 thinkphp ------------------------- 回8楼dongshan8的帖子 你好,斑竹 是最新5.1版本的 ------------------------- 回10楼dongshan8的帖子 ------------------------- 回12楼dongshan8的帖子 谢谢您,我试试看这2个方法能不能解决 ------------------------- 回13楼dhdz187的帖子 还是不行,换了个php版本后可以了,但是每次重启apache,又挂了。 看来还是换回wdcp吧 谢谢你一路以来的回复帮助 ------------------------- 回12楼dongshan8的帖子 http://www.meili999.com/weixin/index/id/53.html 现在一切都是OK的,但是重启apache就挂了,URL链接都错了。 ------------------------- 回17楼dongshan8的帖子 版主,终于可以了,太感谢了。 amh很奇怪,比wdcp奇怪。 我用着用着是可以的,但是如果中途更改任何一个程序文件,如果不重启apache和mysql(2者必须同时),就会出现链接错误。 两者同时重启,就OK。 折腾了一下午,原来如此。现在完美解决了。 纳闷的是,为什么更改程序文件,需要同时重启apache和mysql呢?在wdcp,随便更改文件都不需要的。 是不是因为安装了amh的amhpathinfo模块 ------------------------- 回17楼dongshan8的帖子 还以为搞定了,原来又空欢喜一场。刚刚还可以,下楼去超市买个东西回来,添加了几篇文章,url地址又全部挂了。 看来得换回wdcp了。 ------------------------- 回21楼zuijh的帖子 嗯,说的也对,不影响网站正常运行就好 ------------------------- Re回22楼dhdz187的帖子 引用第24楼dongshan8于2015-05-31 17:38发表的 回 22楼(dhdz187) 的帖子 : 早知道……您可能就不去超市了。   [url=http://bbs.aliyun.com/job.php?action=topost&tid=245671&pid=660083][/url]    斑竹,知道amh的pathinfo干嘛的吗?为什么用这个后,伪静态全部都OK了,但是相对地址全部出错。 而且同一个页面,不做任何服务器环境的改变,过上一段时间,里面的相对地址都会变? ------------------------- 回 24楼(dongshan8) 的帖子 比如首页: http://www.meili999.com/ 点开最新收录,链接地址是 http://www.meili999.com/index.php/weixin/show/id/weixin/news/id/90.html 但是这个页面的真实地址 http://www.meili999.com/weixin/news/id/90.html 却是可以打开的。 不启用pathinfo,全部返回404. ------------------------- Re:回 25楼(dhdz187) 的帖子 引用第27楼dongshan8于2015-05-31 19:27发表的 回 25楼(dhdz187) 的帖子 : 您好, 如果您指的是php的pathinfo函数,请看这里:http://php.net/manual/zh/function.pathinfo.php 一个使用phpinfo来实现网址静态化的例子,如wordpress,请看这里:https://codex.wordpress.org/zh-cn:%E4%BD%BF%E7%94%A8%E5%9B%BA%E5%AE%9A%E9%93%BE%E6%8E%A5 [url=http://bbs.aliyun.com/job.php?action=topost&tid=245671&pid=660102][/url] 谢谢,不折腾了,换回wdcp了,不再纠结了。
dhdz187 2019-12-02 02:24:47 0 浏览量 回答数 0

回答

所有获名礼品已全部寄出,请未收到用户私信管理员查询!~~ 获奖者名单! 8楼获奖者:dlongxiang 奖品-淘公仔 18楼获奖者:怀英;奖品-淘公仔 28楼获奖者:51干警网;奖品-技术书籍 38楼获奖者:我的中国;奖品-技术书籍 48楼获奖者:dasdas;奖品-技术书籍 58楼获奖者:小柒2012;奖品-技术书籍 68楼获奖者:liuhuaspee;奖品-淘公仔 78楼获奖者:smartli;奖品-技术书籍 88楼获奖者:wu-being; 98楼获奖者:鬼才神兵 中奖名额已满 ,请以上中奖用户,尽快将邮寄地址、联系人、联系电话以私信形式发给管理员:linanxiaoxiao. 我们会尽快将礼品快递给大家! ------------------------- 回 9楼(dlongxiang) 的帖子 好吧,算你狠 ------------------------- 回 11楼(小柒2012) 的帖子 写得好敷衍,回来好好写,哈哈! ------------------------- 回 8楼(dlongxiang) 的帖子 恭喜获奖,要书还是淘公仔? ------------------------- 回 20楼(我的中国) 的帖子 ------------------------- 回 18楼(怀英) 的帖子 你就卡着50个字来啊!淘公仔、技术书籍要什么 ------------------------- 回 24楼(不靠谱贝贝) 的帖子 自然美,才是真的美 ------------------------- 回 26楼(51干警网) 的帖子 你看她昵称,还不明白嘛 ------------------------- 回 38楼(我的中国) 的帖子 说说要书还是淘公仔,另外你这个分享得是不是有点牵强啊,身为版主是不是质量再高些 ------------------------- 回 43楼(dasdas) 的帖子 你这不是已经盖了么! ------------------------- 回 47楼(dasdas) 的帖子 你这个水灌的,勉强算可以吧! 要淘公仔还是书? ------------------------- 回 58楼(小柒2012) 的帖子 还是小柒写得标准!要书还是淘公仔呀~ ------------------------- 回 61楼(小柒2012) 的帖子 真神奇竟然都选这本书。 ------------------------- 回 78楼(smartli) 的帖子 感谢分享,要技术书还是淘公仔? ------------------------- 回 63楼(51干警网) 的帖子 够你们分的啊! ------------------------- 回 68楼(liuhuaspeed) 的帖子 恭喜抢楼成功哦,话说,你可是抢了我们元芳大人的那层楼哦~~要技术书还淘公仔呢? ------------------------- 回 88楼(wu-being) 的帖子 亲,有没有看活动说明哦,不能重复刷楼的。看在你是初犯,再补写一篇其它踩过的坑,奖品就是你的! ------------------------- 回 92楼(叶箫) 的帖子 你没事儿留个凤姐在桌面上干嘛?辟邪么?? ------------------------- 回 103楼(鬼才神兵) 的帖子 有呢,要书还是淘公仔 ------------------------- 回 88楼(wu-being) 的帖子 亲,要书还是淘公仔 ------------------------- 回 72楼(potato520) 的帖子 亲,申请版主请移步“版务管理”按版主招募帖要求, https://bbs.aliyun.com/read/244009.html  发布申请版主帖
聚小编 2019-12-02 02:16:56 0 浏览量 回答数 0

回答

点击某一个函数名,会读取整个文档并弹出子窗口显示 - 这个无论是用原生js还是jquery都可以简单快速做到 定位到选择的函数 - 这个我认为做个锚就行了,如果不太清楚锚是干嘛的,可以参考一下这个  html 网页中的锚点的使用介绍 ######我知道锚,但问题是读取的文档是一个后台的方法类,无法也不能添加锚点...###### 你想搞一个方便从html页面中快速查看 某个语言的函数文档吧。 类似于语言手册一样方便,或者是自己项目文档。 例如,这样一个列表。 json_decode json_encode 点击后会用 js window.open, 指定大小的新窗口打对应的链接。 如 点击 json_decode 弹开 http://php.net/manual/zh/function.json-decode.php ######是的,但就是不知道怎样定位到点击的函数方法######phpDesigner编辑器, 可以直接关连手册. ######回复 @ZeronoFreya : 用 class来选择 例如列表 <div class="my_list"><ul><li>json_decode</li>....</ul></div> Jquery 选择就写成 $('.my_list > ul > li').click(function(){ open new window}); 或者直接就给函数列表加上某个class名 直接用 $('.my_li')选择就成了。 哈哈,不知道你问是不是这样的。######很遗憾不是的...简单来说就是读取一篇文档,但你不能修改其内容,里面有一些关键字,在html里有对应的链接(其实没对应),单击连接后定位到关键字所在行... 类似查找功能######回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。###### 引用来自“dworry”的评论回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。 无法编辑问题真的很.... 请原谅我不及格的语文成绩... 比如html中是这样的: <ul> <li>hahaha</li> <li>...</li> </ul> 后台控制器,不能改 ... function hahaha(){ ... } ... 当我点击<li>hahaha</li>时,会把整个后台控制器作为文本文档读取到变量中, 然后append到<mycode></mycode>,将包含此自定义标签的Div显示(模拟子窗口), 这时就显示了后台控制器的所有方法, 然后,定位到hahaha这个方法所在行... (别问我为啥这么做,上面要求的) 基本来说,就是做一个后台控制器方法的预览器,无修改能力,但必须要同步...所以采用了读取后台控制器文档的方法,所以绝对不能动后台控制器的脑筋 现在我能想到的就是一般文本编辑器所具有的查找功能,但不知道具体如何实现,百度一堆都是调用了一个函数,然后就没了,老实说,我想要的是思路...跑题了 ###### 引用来自“dworry”的评论 回复 @ZeronoFreya : 就是百度百科中的关键词连接一样对吧。 又不能改html,你怎么知道一段html里某个是关键词。 保存文档没有这个关键词链接,只能在web返回页面时加上,才是你说不能修改html原因吧。 用php把关键词替换成超链接或者加个<span>标签。 ------------------------------------------------------ 问的不清楚,估计连你自己都不知道要写成什么样的。 引用来自“ZeronoFreya”的评论 无法编辑问题真的很.... 请原谅我不及格的语文成绩... 比如html中是这样的: <ul> <li>hahaha</li> <li>...</li> </ul> 后台控制器,不能改 ... function hahaha(){ ... } ... 当我点击<li>hahaha</li>时,会把整个后台控制器作为文本文档读取到变量中, 然后append到<mycode></mycode>,将包含此自定义标签的Div显示(模拟子窗口), 这时就显示了后台控制器的所有方法, 然后,定位到hahaha这个方法所在行... (别问我为啥这么做,上面要求的) 基本来说,就是做一个后台控制器方法的预览器,无修改能力,但必须要同步...所以采用了读取后台控制器文档的方法,所以绝对不能动后台控制器的脑筋 现在我能想到的就是一般文本编辑器所具有的查找功能,但不知道具体如何实现,百度一堆都是调用了一个函数,然后就没了,老实说,我想要的是思路...跑题了 就是在线版的 ctage 你用过 sublime text + ctage 或者 是 gvim + ctage 代码跳转的。 ctage 在项目文档中生成 .tage 文本,(看下面是我项目中生成的.tage一段内容) 你可以根据这段内容来定位到要读取的代码。 secure_cookie .\system\core\Security.php /^ $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;$/;" v security .\system\core\Input.php /^ $this->security =& $SEC;$/;" v see_json .\application\helpers\common_helper.php /^ function see_json($json) {$/;" f segment .\system\core\URI.php /^ function segment($n, $no_result = FALSE)$/;" f segment_array .\system\core\URI.php /^ $segment_array = 'rsegment_array';$/;" v segment_array .\system\core\URI.php /^ $segment_array = 'segment_array';$/;" v 如我定义的 see_json 函数 第一列是函数名, 第二列是所在文件, 第三个是正则函数名所有行。 see_json    .\application\helpers\common_helper.php    /^    function see_json($json) {$/;"    f 可以在本地生成 .tage文件与代码一起提交上去。 只要写个php解析这个.tage文件最行了。 ######谢谢,我研究一下
kun坤 2020-06-06 15:30:57 0 浏览量 回答数 0

回答

这个问题已经解决,请看:<atarget="_blank"rel="nofollow">http://blog.linuxeye.com/342.html<atarget='_blank'>@codepat<imgsrc="/js/ke/plugins/emoticons/83.gif"alt="83"/>不客气正解,按此方法已解决,感谢! 把 --enable-opcache 去掉试试呢去掉了也不行啊,报同样的错一个玩PHP的,非要学人家玩C和嵌入式的搞撒子编译嘛!扯淡回复<aclass='referer'target='_blank'>@codepat:http://www.dotdeb.org/2013/06/20/php-5-5-0-is-out-and-available-for-debian-7-0-wheezy/我错了,我编译安装我有罪,你能告诉我哪里有PHP最新版本的源吗?弄那么高版本干什么,5.3就差不多了<divclass="ref"> 引用来自“好大的凶兆”的答案<divclass=ref_body>一个玩PHP的,非要学人家玩C和嵌入式的搞撒子编译嘛!回复<aclass='referer'target='_blank'>@codepat:关键是centos软件太老了啊,如果是去年出的软件,今年可以跟上的,我干嘛去编译,如果centos默认的php是5.4+mysql5.5+nginx1.4+谁去编译么,关键是php5.3mysql5.1nginx没有自己编译linux端方便布置管理撒。回复<aclass='referer'target='_blank'>@普华之光:没有5.5.1版本的啊,不过谢谢你回复<aclass='referer'target='_blank'>@codepat:http://rpmfind.net/linux/rpm2html/search.php?query=php你以为我想啊,装B又不能当饭吃,有现成的我干嘛要编译呢?你知道哪里有编译好的吗?或者能yum的也行,我用的是centos6.364位 windows下可以看看这个: <arel="nofollow">http://www.oschina.net/news/42444/xampps-1-8-4linux上的,不过谢谢你 google./configure--help|grepopcode./configure--help|grepopcache一般编译安装都会说各种依赖错误,但是,只要将错误信息往谷歌一搜,问题就解决了。 搞php与编译php不冲突。 我编译过5.5的,但是apc,xcache还没有跟进,所以就降到5.4了。
爱吃鱼的程序员 2020-06-23 11:53:36 0 浏览量 回答数 0

回答

回 2楼(阿king) 的帖子 文档这块我们正在尝试改进。如果在查看文档时有任何的疑问,非常欢迎在文档中心填写意见反馈,或者直接在工单中指出问题,我们会及时对文档中的问题进行修正。希望有大家的帮助,让OSS更加方便简单。 ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第6楼真的小白于2015-03-23 11:12发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : 我一直没搞懂那个 跨域资源共享  貌似在控制台叫cros设置   这个功能是干嘛的啊 ? 跨域资源共享(Cors)是Html5协议解决ajax跨域资源调用问题的功能。如您的程序为Web站点或基于Html5开发的APP应用可以通过跨域资源共享解决这个问题,其他使用场景用不到这个功能。   由于ajax等的同源策略 ,会禁止获取其他域名的资源。 比如,这样的操作是被禁止的。 xhr.open("GET", "http://www.taobao.com/pic.jpg", true);   以前要实现跨域访问,可以通过JSONP、Flash或者服务器中转的方式来实现,但是现在我们有了CORS。 现在大部分浏览器都可通过名为Cross-Origin Resource Sharing(CORS)的协议支持ajax跨域调用。 ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第5楼宝宝助手于2015-03-23 11:11发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : 我最近上传的时候都返回地址了。但是用地址访问内容时却是 0KB 没有上传成功? 用的php SDKV2          pubObject 的时候偶尔就会这样! 到底怎么回事!!我都想转到七牛去了。前几天七牛的人才来拿服务比较 人家还上传下载双向CDN    如果上传后返回了200,表示这次上传是成功的。并且可以在上传时带入数据的MD5值,服务器端会帮用户做校验,防止网络传输中出现数据丢失。 有其他的可能的类似问题,可以提交工单,客服同学会帮你仔细排查问题。 同时,建议使用php sdk v1版本。v2版本已不再维护增加新功能。 如果使用OSS中任何困扰,欢迎使用工单,论坛等方式告知我们,我们需要你的声音。 ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第14楼我是菜鸟2于2015-03-23 12:32发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx 问题1  【Signature代表什么 】 问题2 【如何向这个地址(oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx)上传文件】 ....... 这段url表示使用url签名的方式来直接访问OSS资源,主要针对 【客户端/服务器端】 这样的用户场景: Access key 存储在服务器端,客户端想访问一个OSS资源没有权限,需要先向服务器端发送操作信息(包括操作哪个资源,完成什么操作等)。服务器端根据信息与Access key生成Signature(签名信息),并以一个url的形式传给客户端。客户端使用该url完成之前约定的操作。 问题1  【Signature代表什么 】 签名(Signature)信息是用户的服务器端生成的身份签名,用户的客户端使用该签名来完成操作。OSS根据这个签名来判断操作是否合法。 问题2 【如何向这个地址(oss-example.oss-cn-hangzhou.aliyuncs.com/oss-api.pdf?OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx)上传文件】 该url只能完成特定的操作,比如控制台上生成的签名url是用于用户发送get请求,获取object。用户如果要生成put操作的签名url,可以参考JAVA SDK中的实现: 点击这里 。 对于想参考实现签名算法,这里给一些建议: 1. OSS api 接口基于标准的http协议规范,签名是通过对请求的方法,资源位置,请求头等以AccessKeySecret为秘钥按照统一方法加密生成的。具体方法可以参考API文档: 点击这里 2. 论坛中提供了一个可视化签名demo,希望能对你有所帮助: 点击这里 3. 各个SDK版本都已开源的,可以尝试参考一下。后续也会推出更多语言的SDK。 4. 如果对签名还有疑惑与困难,告知我们,后续会考虑推出更多帮助文档以及demo来帮助用户 ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第19楼老陈小安于2015-03-24 13:19发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : 我想问几个问题: 1、OSS选定存储区域后,在这个区域里有什么数据可靠性措施?比如一般的存3份? 2、OSS选定存储区域后,可以跨区域存储吗?比如我觉得只存在杭州一个区域不安全,我希望在北京存储区域再放一份,可以实现吗? 3、OSS能提版本控制功能吗?一个文件,我在下载到本地修改后,再上传,能提供上一次的版本控制吗? 4、OSS只有官方推荐第三方管理软件,有没有官方自己的管理软件? ....... 【问题】 OSS选定存储区域后,可以跨区域存储吗?比如我觉得只存在杭州一个区域不安全,我希望在北京存储区域再放一份,可以实现吗? 暂时不支持此功能,因为OSS底层已经实现了3分数据备份,所以您大可以放心您的数据安全。且如果您的数据很多,多存一份也会增加您的存储成本。 【问题】 OSS能提版本控制功能吗?一个文件,我在下载到本地修改后,再上传,能提供上一次的版本控制吗? 不支持版本控制 上传相同名的object在OSS端是覆盖原有信息。 OSS只有官方推荐第三方管理软件,有没有官方自己的管理软件? 官方推出过命令行工具,OSSCMD。 官方推荐的客户端工具是经过我们安全部门认证审核的,保证安全性与质量。 同时我们会推动我们的合作伙伴服务商推出更多工具。 【问题】 OSS的API与其他厂商的兼容吗?比如和X牛? 不支持 【问题】 OSS后续有什么新功能设计?比如音视频转码? 新功能的上线尽请期待我们的官网公告。 音视频转码服务主要通过阿里云其他云产品支持,比如可以使用MTS做视频转码。 【问题】 OSS存储计费,是用阶梯方式计费吗?还是按传统的,我用了600G,就按600G范围的单价计算?,如果是按阶梯计费方式,这有什么优势呢? 存储和流量都是按照阶梯计费的。采用的是类似计税使用的超额累进的方式,将你使用的资源量切分成不同段,按不同价格计费。 比如600T的存储费用=(50-0)*价格1+(500-50)*价格2+(600-500)*价格3 采用这样的方式,对用户来说使用资源量越大,价格会越便宜。 【问题】 最后,能说说OSS的定位是什么?面向服务商的,还是面向最终客户的? OSS的最终面向用户是开发者用户,为有存储需求的用户提供海量,安全,高可靠,支持高并发的企业级云存储服务。 ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第29楼fds-em于2015-03-25 20:45发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : 域名绑定。CNAME跟我网站的A记录冲突怎么解决啊?而且子域名先认证文件然后把A记录删除后。然后再用CNAME。那么访问也是没用啊 参考下这个教程 http://docs.aliyun.com/#/oss/getting-started/bucket-attributes&cname 注意核对您的区域(您的Bucket所在区域不同cname地址也不同) ------------------------- Re:ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) 引用第38楼金龟于2015-03-26 13:01发表的 ReOSS大学堂OSS产品技术互动第一期OSS的介绍及控制台操作(3.23-3.27) : 为什么没有 批量转移目录,全选等功能 您可以使用这个客户端工具解决您的需求 http://bbs.aliyun.com/read/231195.html   ------------------------- 回 18楼(渴望更高) 的帖子 您可以使用移动端的SDK,直接通过手机上传图片到OSS, SDK文档: android-sdk http://docs.aliyun.com/#/oss/sdk/android-sdk ios-sdk http://docs.aliyun.com/#/oss/sdk/ios-sdk ------------------------- 回 17楼(寂寞先生) 的帖子 您可以参考下这个帖子 http://bbs.aliyun.com/read/233791.html
ossbaymax 2019-12-02 01:54:17 0 浏览量 回答数 0

回答

昨天晚上写出来了,就是用JS来监控页面上是否发生了ajax请求.发生就重置倒计时.   $(document).ready(function(){ obj.sessionTime(); } ); varobj={}; varnum=20; vart; obj.sessionTime=function(){ if(--num==0) window.location. $("#sss").html(num); t=setTimeout("obj.sessionTime()",1000); } /*ajax时重置时间!*/ functionshowTooltip(){ if(this.tooltipText==null){ clearTimeout(t); obj.sessionTime(); num=20;} } ######没看明白,拜托楼主先恶补一下语文吧######用JS或jQuery监控/获知到ajax请求的产生,我觉得可以理解了吧?######写了一半还是删了,楼上+10000######也是没明白,什么监控? 监控你自己写的ajax函数,还是所有的?######要我自己写的ajax请求我还监控干嘛.###### 这个说明的比较详细。 Jquery$.ajax请求详解及ajax全局变量分析-项目实战-IT工作生活这点事。JustSuchSo!http://www.suchso.com/projecteactual/jquery-ajax-global-variable-send-start-complete-error-success.html
优选2 2020-06-09 11:22:48 0 浏览量 回答数 0

回答

昨天晚上写出来了,就是用JS来监控页面上是否发生了ajax请求.发生就重置倒计时.   $(document).ready(function(){ obj.sessionTime(); } ); var obj = {}; var num = 20; var t; obj.sessionTime = function(){ if(--num == 0) window.location. $("#sss").html(num); t = setTimeout("obj.sessionTime()",1000); } /*ajax时重置时间!*/ function showTooltip(){ if(this.tooltipText==null){ clearTimeout(t); obj.sessionTime(); num=20;} } ######没看明白,拜托楼主先恶补一下语文吧######用JS或jQuery 监控/获知 到ajax 请求的产生,我觉得可以理解了吧?######写了一半还是删了,楼上+10000######也是没明白, 什么监控?  监控你自己写的ajax函数, 还是所有的?######要我自己写的ajax请求我还监控干嘛.###### 这个说明的比较详细。 Jquery $.ajax请求详解及ajax全局变量分析 - 项目实战 - IT工作生活这点事。Just Such So! http://www.suchso.com/projecteactual/jquery-ajax-global-variable-send-start-complete-error-success.html
爱吃鱼的程序员 2020-05-30 21:03:53 0 浏览量 回答数 0

问题

discuz3.2 win2003系统切换到linux系统切换后还需要干嘛

discuz3.2 win2003系统切换到linux系统切换后还需要干嘛 操作系统:centos5.5 (无奈服务商只有这个) Web服务器:Nginx/1....
天朝就这 2019-12-01 21:30:09 7258 浏览量 回答数 3

回答

"alert(RegExp.$1);######Thanks!######我说你都是在写js,你干嘛要用正则去匹配,直接操作元素用innerHTML不是更好吗######html形式的字符串,谢谢######你正则就是取的 <span style=""font-family:Consolas, "font-size:14px;line-height:15.4px;background-color:#FFFFFF;"">>(\w+)<这个啊######正则表达式全局模式是不会返回子匹配的###### var a = reg.exec(str); 如果想仔细了解原因还是看文档吧 ######用的不是纯正的js,没有exec()######欢迎加入【javaweb前端基地】QQ群:573820490"
montos 2020-06-01 21:03:56 0 浏览量 回答数 0

回答

首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。######+1,网页不能允许你修改客户本地内容,得到数据然后后台根据这些数据再去读写服务器上的内容######我可以用js操作vba修改我本地的office文档,这是怎么回事######意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?######回复 @業餘碼農 : 映射可能不准确,应该是理解成副本要好点。######回复 @業餘碼農 : 这两天脑壳想了很多。个人理解成,每个用户在处理php等的时候是获取其文档里面的一个映射,然后再处理。你说的fclose,我理解成很多用户在一个服务器里面映射了很多php文档,如果不关闭,每个映射在处理过程中都占用一定内存,但是~!~,如果没个用户使用映射的时间不一样,那么对于fclose就可有可无,因为反正用户使用映射完了传送数据给用户了,打开的文档就自动关闭,是把?######回复 @kog-7 : 而unset,不一定是用来销毁数组的。 也可以用来销毁数组元素的。比如unset( $arr['a'] ); 这样就是纯粹的数组函数了。 关于PHP事件,不知道可不可以这样称呼, PHP只有一种事件,就是请求事件,就是说只有客户端请求它才会响应并执行。 当然如果你在服务器设置了计划任务那就另当别论了。 以上都是我的个人观点。经验之谈。 不一定正确。######回复 @kog-7 : fclose你可能现在看不出作用。 但是大项目的时候,资源优化要做的很全面的。 一个用户读一个文件是1M,1000个用户同时读就是1G,并且占用1000个I/O资源,用完就手动fclose,而不是等到程序结束,这样就能在同一时刻减少I/O占用率( 有时你看到fclose靠近文件末尾,但那里有时并不代表程序结束。特别是面向对象程序设计 )。######回复 @業餘碼農 : 就是点击,或者某个状态生成了激活某处功能。###### 引用来自“kog-7”的答案 我可以用js操作vba修改我本地的office文档,这是怎么回事 百度了一下 : Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。 关键是你能修改别的文档吗? ###### 引用来自“kog-7”的答案 意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?  。。呃,关键不在于内存的占用。 而在于I/O的占用。 内存很便宜,但是I/O资源有限,你要知道像百度谷歌这样的大网站,每秒钟都会有几千上万的用户在同时操作。而且一个请求不是一秒就可以完成的。 虽说现在有什么负载均衡的技术,不过算下来,每时段的用户请求也不是小数目 。fclose要养成习惯。数据库也是一样。 遇到大项目就不易出问题。 你说的映射,或者副本,应该可以理解成C语言里的指针。 你可以想象一下,如果某个用户上传了一个100G的文件,如果要删除这个文件,是不是要把它载入内存? 我想不可能吧。  读取也是一样, 通过指针去读取数据流而已。 而不用把整个文件放入内存。 并且单个用户的内存占用是有限制的。所以fclose是省I/O。 ######如果没经过内存的,再要引用他,就要指定相关已被传输的文档,然后找起!!!是不? (限制字数,我分开回答)######同时我理解的js和html也如此,也是向文档请求,然后文档把其代码复制张贴到内存。。。这样子我觉得要容易理解一些,也很容易解释为什么你操作的js是不会反应到本来的js文档中的。。。。同时对于跨内容的传递,比如你说的100g的文档,我理解的是,让这个100g移动的命令是在内存中的,但是命令只是要求其从a文档移动到b文档,不经过内存。。。同时,如果有那种要经过内存的数据,就可以直接引用其值######我说的副本,理解是,比如服务器上有个PHP文档,我在浏览器请求这个php,那么这个php就把其代码复制张贴到内存中运行(所以这个副本跟前面的php就没有关系了),然后内存的代码运行得出一些数据。。######呵呵,不知道I/O是什么东西,都是自学的,这些没看到,读书的时候工科,所以c什么指针的不重要都在睡觉。######  所谓I/O就是输入输出。通俗说,就是硬盘的数据通道。你fopen一次,就占用一个通道(直到程序执行结束或fclose)。硬盘的I/O发展远没有容量发展的快。 所以硬盘容量可以十几个TB但是I/O还是差不多。  你说的副本这个原理,我也说不清楚,我也是自学的。 C语言也只是了解了一下而已。 不论PHP JS HTML都是载入内存来执行的。 但是会不会一个用户载入一个PHP我就不敢肯定了。 不过有一点可以肯定, 你在服务器修改程序,新的请求会得到新的程序执行的结果 。 而不需要重启PHP服务,这应该能证明你说的副本吧。 然后html不算编程语言,是标记语言,你不能说一个html文件是一个程序吧,程序的结果是可变的,纯html 是固定的。js不能操作文档不是因为它被载入内存。 PHP也被载入内存的,任何程序都要载入内存去执行。 关键在于js寄存的浏览器,没有给js操作权限。 js被包裹起来了。 只能通过浏览器去操作cookie之类的有严格限定的文件。 而php的解释器是拥有文件操作权限的。 当然只是有服务器的文件操作权限。 客户端的东西是不能操作的。 至少光凭它自己是不能的。 同样的,js也是不能操作服务器上的东西的。 就算是读取服务器的文件,也是要经过apache之类 的服务器软件来读取的。 js本身只是给服务器发个话。 服务器给不给返回,还是看服务器心情的。 很多东西个人理解会有偏差,我建议你有不理解的地方就查查文档。 比我这种业余的码农更权威。 ######还有就是不管i/O和内存,都是开始说的一个用户占用部分的东西,如果多个用户不是同时解析,那么,,就可以说成是fclose这个可以不写,当然写了最好######额,问下,你什么行业啊,以前学什么专业。。? 专业的书籍我看了一些,但是一两本书说的很少,同时国内的书确实不好,国外的书翻译的又老火。###### 我就是一个业余的爱好者而已。没学过什么专业,也不在什么行业。 纯兴趣。 当然以后就难说了。 老实说,我是最近一年才学的编程。 但是计算基础方面的东西积累了很多年,也有一定的了解了。 你叫我买书来看我真看不下去。 我的方法是,先看视频。 对一门语言有大概了解,然后把文档上的每一条都拿 来琢磨透,然后开发小项目。 当然我也没能吞下文档。 所以才成为业余的。 另外上面这个问题 如果多个用户不是同时请求或者用户很少,自然不需要fclose了。 不过也有可能程序结束没有关闭I/O连接导致进程关闭失败造成僵尸进程, 浪费了资源。也难说的。 ######呵呵,你让我想起了有,不要问我从哪里来,我不也不知道去哪里,我不属于任何地方,未来一切皆有可能的某部电影~~~~###### @kog-7 这是褒奖吗。。。。 ######回复 @Infinity : 改xml的php,写在上面,感觉用了很多重复的话######回复 @業餘碼農 : 那好多人都去提鞋了~我只是好奇好奇,你要是提鞋的,我就是给别人檫菊花的~!~######。。。。要是有个人对自己的身份工作支支吾吾遮遮掩掩,要么他是个特工黑客要么他就是个提鞋的。你觉得我像不像特工呢?######回复 @業餘碼農 : 呵呵,搞那么多标签干嘛嘛,你就是你,我只想了解你是干嘛的。######回复 @kog-7 : 。。。。。。。。。。。。农二代工一代码后代。######就是这个改xml,感觉写多了<?php header("Content-type: text/html; charset=utf-8"); print '<style> body{ background:rgba(223,238,231,0.9); } .error{color:rgb(182,69,69);font-size:60%;} .iput { border:1px solid black;      height:10%; background:rgb(223,238,231); font-family:"Microsoft YaHei",微软雅黑,helvetica; } #word0u { margin-left:2%; float:left; margin-top:5%; font-family:"Microsoft YaHei",微软雅黑,helvetica; } #input0u { list-style-type:none; float:left; margin-top:5%; } </style>'; print "<script> function closef() {window.parent.document.getElementById('screen').style.display='none';} </script>"; print '<body><button  style="cursor:pointer;border:1px;right:0px;top:0px;font-family:arial;font-weight:bolder;position:absolute" onclick="closef()">X</button>  '; $pro=true; if($_SERVER['REQUEST_METHOD']=="POST") { $pro=false;    if(empty($_POST['user'])||empty($_POST['pw'])||empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','请输入用户名和密码').' </span>';}    if(strlen($_POST['user'])>15)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','用户名要小于5位数').' </span>';}    if(strlen($_POST['pw'])<5)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','密码要大于5位数').' </span>';}    if(empty($_POST['pw'])!=empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','两次密码输入不一样').' </span>';}  $xmluser=new DOMDocument;  $xmluser->load('euser.xml');  $users=$xmluser->getElementsByTagName('user'); for($i=0;$i<$users->length;$i++) { if($users->item($i)->childNodes->item(0)->nodeValue==$_POST['user']) { $pro=true; print '<p class="error">'.iconv('gb2312','utf-8','有人用了这个用户名').'</p>';; break; } } } if(!$pro) { date_default_timezone_set('Asia/Shanghai');  $log= $xmluser->createElement('log');  $user= $xmluser->createElement('user');  $pw= $xmluser->createElement('pw');  $time=$xmluser->createElement('time'); $usert=$xmluser->createTextNode($_POST['user']); $pwt=$xmluser->createTextNode($_POST['pw']); $da=date("Y-m-d"); $timet=$xmluser->createTextNode($da); $user->appendChild($usert); $pw->appendChild($pwt); $time->appendChild($timet); $log->appendChild($user); $log->appendChild($pw); $log->appendChild($time); $xmluser->documentElement->appendChild($log); $xmluser->save('euser.xml'); print "<h2 style='font-family:微软雅黑,helvetica'>".iconv('gb2312','utf-8','欢迎').$_POST['user']." ".$da." ".iconv('gb2312','utf-8','您已注册')."</h2>"; $uu=$_POST['user']; $pp=$_POST['pw']; print "<script> window.parent.document.getElementById('user').innerHTML='hello<br>$uu'; window.parent.document.getElementById('login').style.display='none'; window.parent.document.getElementById('logon').style.display='none'; window.parent.document.getElementById('cookss').style.display='none'; window.parent.document.getElementById('clears').style.display='inherit'; window.parent.document.getElementById('chat').src='example1.html'; document.cookie='koguser=$uu'; </script></body>"; } else { print "<p style='font-family:arial;font-weight:bold;font-size:150%;letter-spacing:5px;margin-left:auto;margin-right:auto;width:70%;height:10%;text-align:center;margin-top:2%'>welcome</p>"; $_POST=array(); print  "<form action='elog.php' method='post'><ul id='word0u'><li>".iconv('gb2312','utf-8','用户名')."</li><br><li>" .iconv('gb2312','utf-8','密码')."</li><br><li>" .iconv('gb2312','utf-8','再次确认密码')."</li></ul> <ul id='input0u'><li><input class='iput' type='text' name='user' size='20'/></li><br> <li><input class='iput' type='password' name='pw' size='20'/></li><br> <li><input class='iput' type='password' name='pw2' size='20'/></li></ul><div><input style='border:2px solid black;clear:left;font-family:helvetica;background:rgb(223,238,231);margin-left:42%;margin-top:3%;font-size:18px;width:100px;text-align:center' type='submit' value=".iconv('gb2312','utf-8','注册')."></div></form></body>"; } ?> ###### 引用来自“Infinity”的评论首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。 谢谢~
kun坤 2020-06-05 14:27:36 0 浏览量 回答数 0

回答

.php 做 提交到apache ###### 引用来自“滔哥”的答案 .php 做 提交到apache 不需要在nginx里面做配置嘛? ######中间层apache直接可以省略,直接nginx既做balance,也可以server###### 引用来自“Meso”的答案 中间层apache直接可以省略,直接nginx既做balance,也可以server 哎呀。这不是你说省略就省略的呀。需求要这么搞,就得这么搞呀。。。 ######需要 怎么配置还得需要具体需求来看了。 1:php和静态文件分别在两个不同的域,这是最好配置的了。 2:如果都在一个域,但是静态文件又都在一个目录下,那就把这一个目录交给nginx处理,其它的交给apache处理 3:这种是最麻烦的,到时都可能存在静态文件和php,那么把.js、.css、.flv、.swf、.gif、.png、.txt、.jpg、.jpeg,其它的都交给apache处理,如果有urlrewrite,但是后缀不带有html、htm等,那么htm、html也交给nginx处理,如果带有,那么只好都交给apache处理了 ######nginx.conf user www www; worker_processes 1; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; server { listen 80; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot; location / { try_files $uri @apache; } location @apache { internal; proxy_pass http://127.0.0.1:88; include proxy.conf; } location ~ .*\.(php|php5)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /home/wwwlogs/access.log access; } include vhost/*.conf; } proxy.conf proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; httpd.conf 就不贴了 ,默认就行 ,伪静态 可以直接在 nginx .conf 里添加 ,也可以直接添加进httpd.conf 仔细研究揣摩以上 代码###### 好复杂,我一直都是nginx,php-fpm,mysql,这样的结构很好,不知道为什么要加一个apache,就算要平均负载,直接让dns,平均解析到不同的nginx上面,例如192.168.1.1,192.168.1.2,192.168.1.3. 然后碰到.php就丢给内网的php-fpm,几台机子rsync一下,把php代码一致,每台台子开个600进程.集群memcache,主从mysql,就这架构,我想百万级是一点问题没有阿.###### 引用来自“红星”的答案 nginx.conf user www www; worker_processes 1; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; server { listen 80; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot; location / { try_files $uri @apache; } location @apache { internal; proxy_pass http://127.0.0.1:88; include proxy.conf; } location ~ .*\.(php|php5)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /home/wwwlogs/access.log access; } include vhost/*.conf; } proxy.conf proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; httpd.conf 就不贴了 ,默认就行 ,伪静态 可以直接在 nginx .conf 里添加 ,也可以直接添加进httpd.conf 仔细研究揣摩以上 代码 你这nginx里面的配置,是不是有用到fastcgi啊?这个东西放到nginx里面来干嘛? 据我所了解的,apache是以fastcgi来跑PHP的,而PHP是用php-fpm来管理fastcgi的,对吧?   ######你都 php-fpm了,还要apache干嘛###### 引用来自“xiaojia2008”的答案 你都 php-fpm了,还要apache干嘛 。。。。汗。。php-fpm是用来管理fastcgi的吧?要apache是要它以fastcgi方式来运行PHP呀。。。
kun坤 2020-06-20 13:48:00 0 浏览量 回答数 0

回答

.php 做 提交到apache ###### 引用来自“滔哥”的答案 .php 做 提交到apache 不需要在nginx里面做配置嘛? ######中间层apache直接可以省略,直接nginx既做balance,也可以server###### 引用来自“Meso”的答案 中间层apache直接可以省略,直接nginx既做balance,也可以server 哎呀。这不是你说省略就省略的呀。需求要这么搞,就得这么搞呀。。。 ######需要 怎么配置还得需要具体需求来看了。 1:php和静态文件分别在两个不同的域,这是最好配置的了。 2:如果都在一个域,但是静态文件又都在一个目录下,那就把这一个目录交给nginx处理,其它的交给apache处理 3:这种是最麻烦的,到时都可能存在静态文件和php,那么把.js、.css、.flv、.swf、.gif、.png、.txt、.jpg、.jpeg,其它的都交给apache处理,如果有urlrewrite,但是后缀不带有html、htm等,那么htm、html也交给nginx处理,如果带有,那么只好都交给apache处理了 ######nginx.conf user www www; worker_processes 1; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; server { listen 80; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot; location / { try_files $uri @apache; } location @apache { internal; proxy_pass http://127.0.0.1:88; include proxy.conf; } location ~ .*\.(php|php5)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /home/wwwlogs/access.log access; } include vhost/*.conf; } proxy.conf proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; httpd.conf 就不贴了 ,默认就行 ,伪静态 可以直接在 nginx .conf 里添加 ,也可以直接添加进httpd.conf 仔细研究揣摩以上 代码######好复杂,我一直都是nginx,php-fpm,mysql,这样的结构很好,不知道为什么要加一个apache,就算要平均负载,直接让dns,平均解析到不同的nginx上面,例如192.168.1.1,192.168.1.2,192.168.1.3. 然后碰到.php就丢给内网的php-fpm,几台机子rsync一下,把php代码一致,每台台子开个600进程.集群memcache,主从mysql,就这架构,我想百万级是一点问题没有阿.###### 引用来自“红星”的答案 nginx.conf user www www; worker_processes 1; error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; server { listen 80; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot; location / { try_files $uri @apache; } location @apache { internal; proxy_pass http://127.0.0.1:88; include proxy.conf; } location ~ .*\.(php|php5)?$ { proxy_pass http://127.0.0.1:88; include proxy.conf; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /home/wwwlogs/access.log access; } include vhost/*.conf; } proxy.conf proxy_connect_timeout 30s; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 32k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; httpd.conf 就不贴了 ,默认就行 ,伪静态 可以直接在 nginx .conf 里添加 ,也可以直接添加进httpd.conf 仔细研究揣摩以上 代码 你这nginx里面的配置,是不是有用到fastcgi啊?这个东西放到nginx里面来干嘛? 据我所了解的,apache是以fastcgi来跑PHP的,而PHP是用php-fpm来管理fastcgi的,对吧?   ######你都 php-fpm了,还要apache干嘛###### 引用来自“xiaojia2008”的答案 你都 php-fpm了,还要apache干嘛 。。。。汗。。php-fpm是用来管理fastcgi的吧?要apache是要它以fastcgi方式来运行PHP呀。。。
kun坤 2020-05-31 17:47:12 0 浏览量 回答数 0

回答

"首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。######+1,网页不能允许你修改客户本地内容,得到数据然后后台根据这些数据再去读写服务器上的内容######我可以用js操作vba修改我本地的office文档,这是怎么回事######意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 映射可能不准确,应该是理解成副本要好点。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 这两天脑壳想了很多。个人理解成,每个用户在处理php等的时候是获取其文档里面的一个映射,然后再处理。你说的fclose,我理解成很多用户在一个服务器里面映射了很多php文档,如果不关闭,每个映射在处理过程中都占用一定内存,但是~!~,如果没个用户使用映射的时间不一样,那么对于fclose就可有可无,因为反正用户使用映射完了传送数据给用户了,打开的文档就自动关闭,是把?######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : 而unset,不一定是用来销毁数组的。 也可以用来销毁数组元素的。比如unset( $arr['a'] ); 这样就是纯粹的数组函数了。 关于PHP事件,不知道可不可以这样称呼, PHP只有一种事件,就是请求事件,就是说只有客户端请求它才会响应并执行。 当然如果你在服务器设置了计划任务那就另当别论了。 以上都是我的个人观点。经验之谈。 不一定正确。######回复 <a href=""http://my.oschina.net/kog7"" class=""referer"" target=""_blank"">@kog-7 : fclose你可能现在看不出作用。 但是大项目的时候,资源优化要做的很全面的。 一个用户读一个文件是1M,1000个用户同时读就是1G,并且占用1000个I/O资源,用完就手动fclose,而不是等到程序结束,这样就能在同一时刻减少I/O占用率( 有时你看到fclose靠近文件末尾,但那里有时并不代表程序结束。特别是面向对象程序设计 )。######回复 <a href=""http://my.oschina.net/u/1029302"" class=""referer"" target=""_blank"">@業餘碼農 : 就是点击,或者某个状态生成了激活某处功能。######<div class=""ref""> 引用来自“kog-7”的答案 我可以用js操作vba修改我本地的office文档,这是怎么回事 百度了一下 : Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件。也可说是一种应用程式视觉化的Basic Script。 关键是你能修改别的文档吗? ###### 引用来自“kog-7”的答案 意识是不管xml放在服务器里面还是我本地的e盘里都不能修改吧?  。。呃,关键不在于内存的占用。 而在于I/O的占用。 内存很便宜,但是I/O资源有限,你要知道像百度谷歌这样的大网站,每秒钟都会有几千上万的用户在同时操作。而且一个请求不是一秒就可以完成的。 虽说现在有什么负载均衡的技术,不过算下来,每时段的用户请求也不是小数目 。fclose要养成习惯。数据库也是一样。 遇到大项目就不易出问题。 你说的映射,或者副本,应该可以理解成C语言里的指针。 你可以想象一下,如果某个用户上传了一个100G的文件,如果要删除这个文件,是不是要把它载入内存? 我想不可能吧。  读取也是一样, 通过指针去读取数据流而已。 而不用把整个文件放入内存。 并且单个用户的内存占用是有限制的。所以fclose是省I/O。 ######如果没经过内存的,再要引用他,就要指定相关已被传输的文档,然后找起!!!是不? (限制字数,我分开回答)######同时我理解的js和html也如此,也是向文档请求,然后文档把其代码复制张贴到内存。。。这样子我觉得要容易理解一些,也很容易解释为什么你操作的js是不会反应到本来的js文档中的。。。。同时对于跨内容的传递,比如你说的100g的文档,我理解的是,让这个100g移动的命令是在内存中的,但是命令只是要求其从a文档移动到b文档,不经过内存。。。同时,如果有那种要经过内存的数据,就可以直接引用其值######我说的副本,理解是,比如服务器上有个PHP文档,我在浏览器请求这个php,那么这个php就把其代码复制张贴到内存中运行(所以这个副本跟前面的php就没有关系了),然后内存的代码运行得出一些数据。。######呵呵,不知道I/O是什么东西,都是自学的,这些没看到,读书的时候工科,所以c什么指针的不重要都在睡觉。######  所谓I/O就是输入输出。通俗说,就是硬盘的数据通道。你fopen一次,就占用一个通道(直到程序执行结束或fclose)。硬盘的I/O发展远没有容量发展的快。 所以硬盘容量可以十几个TB但是I/O还是差不多。  你说的副本这个原理,我也说不清楚,我也是自学的。 C语言也只是了解了一下而已。 不论PHP JS HTML都是载入内存来执行的。 但是会不会一个用户载入一个PHP我就不敢肯定了。 不过有一点可以肯定, 你在服务器修改程序,新的请求会得到新的程序执行的结果 。 而不需要重启PHP服务,这应该能证明你说的副本吧。 然后html不算编程语言,是标记语言,你不能说一个html文件是一个程序吧,程序的结果是可变的,纯html 是固定的。js不能操作文档不是因为它被载入内存。 PHP也被载入内存的,任何程序都要载入内存去执行。 关键在于js寄存的浏览器,没有给js操作权限。 js被包裹起来了。 只能通过浏览器去操作cookie之类的有严格限定的文件。 而php的解释器是拥有文件操作权限的。 当然只是有服务器的文件操作权限。 客户端的东西是不能操作的。 至少光凭它自己是不能的。 同样的,js也是不能操作服务器上的东西的。 就算是读取服务器的文件,也是要经过apache之类 的服务器软件来读取的。 js本身只是给服务器发个话。 服务器给不给返回,还是看服务器心情的。 很多东西个人理解会有偏差,我建议你有不理解的地方就查查文档。 比我这种业余的码农更权威。 ######还有就是不管i/O和内存,都是开始说的一个用户占用部分的东西,如果多个用户不是同时解析,那么,,就可以说成是fclose这个可以不写,当然写了最好######额,问下,你什么行业啊,以前学什么专业。。? 专业的书籍我看了一些,但是一两本书说的很少,同时国内的书确实不好,国外的书翻译的又老火。###### 我就是一个业余的爱好者而已。没学过什么专业,也不在什么行业。 纯兴趣。 当然以后就难说了。 老实说,我是最近一年才学的编程。 但是计算基础方面的东西积累了很多年,也有一定的了解了。 你叫我买书来看我真看不下去。 我的方法是,先看视频。 对一门语言有大概了解,然后把文档上的每一条都拿 来琢磨透,然后开发小项目。 当然我也没能吞下文档。 所以才成为业余的。 另外上面这个问题 如果多个用户不是同时请求或者用户很少,自然不需要fclose了。 不过也有可能程序结束没有关闭I/O连接导致进程关闭失败造成僵尸进程, 浪费了资源。也难说的。 ######呵呵,你让我想起了有,不要问我从哪里来,我不也不知道去哪里,我不属于任何地方,未来一切皆有可能的某部电影~~~~###### @kog-7 这是褒奖吗。。。。 ######回复 @Infinity : 改xml的php,写在上面,感觉用了很多重复的话######回复 @業餘碼農 : 那好多人都去提鞋了~我只是好奇好奇,你要是提鞋的,我就是给别人檫菊花的~!~######。。。。要是有个人对自己的身份工作支支吾吾遮遮掩掩,要么他是个特工黑客要么他就是个提鞋的。你觉得我像不像特工呢?######回复 @業餘碼農 : 呵呵,搞那么多标签干嘛嘛,你就是你,我只想了解你是干嘛的。######回复 @kog-7 : 。。。。。。。。。。。。农二代工一代码后代。######就是这个改xml,感觉写多了<?php header("Content-type: text/html; charset=utf-8"); print '<style> body{ background:rgba(223,238,231,0.9); } .error{color:rgb(182,69,69);font-size:60%;} .iput { border:1px solid black;      height:10%; background:rgb(223,238,231); font-family:"Microsoft YaHei",微软雅黑,helvetica; } #word0u { margin-left:2%; float:left; margin-top:5%; font-family:"Microsoft YaHei",微软雅黑,helvetica; } #input0u { list-style-type:none; float:left; margin-top:5%; } </style>'; print "<script> function closef() {window.parent.document.getElementById('screen').style.display='none';} </script>"; print '<body><button  style="cursor:pointer;border:1px;right:0px;top:0px;font-family:arial;font-weight:bolder;position:absolute" onclick="closef()">X</button>  '; $pro=true; if($_SERVER['REQUEST_METHOD']=="POST") { $pro=false;    if(empty($_POST['user'])||empty($_POST['pw'])||empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','请输入用户名和密码').' </span>';}    if(strlen($_POST['user'])>15)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','用户名要小于5位数').' </span>';}    if(strlen($_POST['pw'])<5)    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','密码要大于5位数').' </span>';}    if(empty($_POST['pw'])!=empty($_POST['pw2']))    {$pro=true;    print '<span class="error">'.iconv('gb2312','utf-8','两次密码输入不一样').' </span>';}  $xmluser=new DOMDocument;  $xmluser->load('euser.xml');  $users=$xmluser->getElementsByTagName('user'); for($i=0;$i<$users->length;$i++) { if($users->item($i)->childNodes->item(0)->nodeValue==$_POST['user']) { $pro=true; print '<p class="error">'.iconv('gb2312','utf-8','有人用了这个用户名').'</p>';; break; } } } if(!$pro) { date_default_timezone_set('Asia/Shanghai');  $log= $xmluser->createElement('log');  $user= $xmluser->createElement('user');  $pw= $xmluser->createElement('pw');  $time=$xmluser->createElement('time'); $usert=$xmluser->createTextNode($_POST['user']); $pwt=$xmluser->createTextNode($_POST['pw']); $da=date("Y-m-d"); $timet=$xmluser->createTextNode($da); $user->appendChild($usert); $pw->appendChild($pwt); $time->appendChild($timet); $log->appendChild($user); $log->appendChild($pw); $log->appendChild($time); $xmluser->documentElement->appendChild($log); $xmluser->save('euser.xml'); print "<h2 style='font-family:微软雅黑,helvetica'>".iconv('gb2312','utf-8','欢迎').$_POST['user']." ".$da." ".iconv('gb2312','utf-8','您已注册')."</h2>"; $uu=$_POST['user']; $pp=$_POST['pw']; print "<script> window.parent.document.getElementById('user').innerHTML='hello<br>$uu'; window.parent.document.getElementById('login').style.display='none'; window.parent.document.getElementById('logon').style.display='none'; window.parent.document.getElementById('cookss').style.display='none'; window.parent.document.getElementById('clears').style.display='inherit'; window.parent.document.getElementById('chat').src='example1.html'; document.cookie='koguser=$uu'; </script></body>"; } else { print "<p style='font-family:arial;font-weight:bold;font-size:150%;letter-spacing:5px;margin-left:auto;margin-right:auto;width:70%;height:10%;text-align:center;margin-top:2%'>welcome</p>"; $_POST=array(); print  "<form action='elog.php' method='post'><ul id='word0u'><li>".iconv('gb2312','utf-8','用户名')."</li><br><li>" .iconv('gb2312','utf-8','密码')."</li><br><li>" .iconv('gb2312','utf-8','再次确认密码')."</li></ul> <ul id='input0u'><li><input class='iput' type='text' name='user' size='20'/></li><br> <li><input class='iput' type='password' name='pw' size='20'/></li><br> <li><input class='iput' type='password' name='pw2' size='20'/></li></ul><div><input style='border:2px solid black;clear:left;font-family:helvetica;background:rgb(223,238,231);margin-left:42%;margin-top:3%;font-size:18px;width:100px;text-align:center' type='submit' value=".iconv('gb2312','utf-8','注册')."></div></form></body>"; } ?> ###### 引用来自“Infinity”的评论首先,不论是PHP还是JS都不能修改客户端的文件。 你可以在客户端用JS修改XML数据,注意是数据,再传到服务器端用PHP保存成文档。 谢谢~"
montos 2020-06-04 13:24:13 0 浏览量 回答数 0

问题

为程序猿正言,程序猿是很有文化的,七夕考虑约一下呗!

眼看着七夕就要到了,身边一群单身程序猿开始焦躁了。 不要以为他们只会敲键盘,不解风情,其实他们很想找个爱情恋恋。 不要以为他们头脑里只有代码,不会吟诗作赋,...
cheerup1231 2019-12-01 21:01:16 6409 浏览量 回答数 3

回答

求助啊,有没高手解惑啊######text/html; charset=gbk 这个编码是你页面 你返回也要配置成GBK的 才可以 ###### 引用来自“小桥ya”的答案 text/html; charset=gbk 这个编码是你页面 你返回也要配置成GBK的 才可以 gbk的也试过了,一样无效 ######怎么总是有人遇到中文乱码问题啊,我做了这么多年的项目,所有的页面,代码全用UTF-8格式,没有一次出现乱码问题的。干嘛不试试用UTF-8呢######这个@Response乱码要重写个一StringMessageConverter,然后在Spring中配置它就可以了。######StringMessageConverter缺省都是UTF8编码格式
kun坤 2020-06-20 11:53:34 0 浏览量 回答数 0

回答

求助啊,有没高手解惑啊######text/html; charset=gbk 这个编码是你页面 你返回也要配置成GBK的 才可以 ###### 引用来自“小桥ya”的答案 text/html; charset=gbk 这个编码是你页面 你返回也要配置成GBK的 才可以 gbk的也试过了,一样无效 ######怎么总是有人遇到中文乱码问题啊,我做了这么多年的项目,所有的页面,代码全用UTF-8格式,没有一次出现乱码问题的。干嘛不试试用UTF-8呢######这个@Response乱码要重写个一StringMessageConverter,然后在Spring中配置它就可以了。######StringMessageConverter缺省都是UTF8编码格式
kun坤 2020-06-02 19:33:13 0 浏览量 回答数 0

回答

拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下: session.save_handler=files session.save_path=/tmp PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_ sesseion_id 把这些session绑定在本机的Web应用放到 Nginx的upstream应用集群应该是不合适的,就算 设置ip_hash让固定IP只访问一个后端, 但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话. 还有如果这台后端服务器宕机,那用户的会话也会丢失. 所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展. 引用来自“eechen”的答案 拿PHP提供的session来说,默认使用的是文件存储的方式,会话文件就保存在当前的服务器,一般是/tmp下: session.save_handler=files session.save_path=/tmp PHP的会话机制会给客户端设置一个cookie用来保存sesseion_id,对应服务器上的会话文件/tmp/sess_ sesseion_id 把这些session绑定在本机的Web应用放到 Nginx的upstream应用集群应该是不合适的,就算 设置ip_hash让固定IP只访问一个后端, 但如果客户端IP在会话中改变,那就有可能连上后端其他的服务器,这样会导致找不到会话. 还有如果这台后端服务器宕机,那用户的会话也会丢失. 所以最好还是自己用cookie实现一套适合自己的session机制,比如用mysql内存表或者memcached来保存cookie对应的会话数据,非关键和不敏感的数据直接设置cookie保存到客户端,这样会话数据就不会存储在具体的应用服务器上,方便了使用Nginx的 upstream进行php-fpm应用服务器集群扩展. 回复 @eechen:同样多谢大神,我刚开始学习nginx,太复杂的话反而我怕造成其他问题,ip_hase这样的方式也算是适合我们想在的系统环境了,不是完全“均衡”的负载,但是也能分担单个节点压力,存在节点的宕机风险导致部分用户无法使用,也好过现在单个节点承受的风险,是不是这个道理哈~~这个你最好问下Tengine作者 @shudu,看看有没有可行的方法。把内网特定的IP段用Nginx分流到后端Tomcat上,可以试着这样干: server{if($remote_addr=192.168.0.20){location~\.(jsp|do)${proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$remote_addr;proxy_set_headerHost$host;proxy_passhttp://192.168.0.1:8080;}}} 把来自192.168.0.20的jsp和do请求proxy给后面192.168.0.1的服务器。 条件$remote_addr 那里可以用正则匹配一个IP段,这样应该就可以把该IP段的动态请求导到指定的Tomcat服务器上。后台系统是java吗?回复 @夏天198801:不一定非要序列化,可以后台转换成json,存入memcached,取出json再映射成session回复 @屁屁果:额,这个之前试过,但是后来发现tomcat里面有一个工程的session没有序列化,做不了session共享,上面描述问题里面我也提到过了,我们的开发不好协调,找他们做session序列化没做好回复 @夏天198801:可以扩展tomcat,实现容器级别的session共享,就和应用没有关系了http://www.9iu.org/2011/11/25/tomcat-memcached-session-sso.html是啊,后台是java,容器是tomcat 可以把session托管到memcache或者redis嘛 推荐你使用Tengine: 1、使用Tengine的consistent_hash功能,以你的登录的cookie为key,这样的话一个固定的用户(登录cookie值)可以hash到一台固定的机器上。 2、如果没有登录(即没有登录cookie),则使用round-robin方式(默认的负载均衡方式)。 3、你可以使用if来判断cookie值是否为空。兼容从nginx转tengine有无什么限制?都兼容么?赞一个mark客户端服务器session是靠浏览器cookie维持的,每次去请求都会带一个参数SESSIONID。so...只要把nginx的分发策略设置为根据cookie中的SESSIONID来分发。可以满足你的需求。只要第一次登陆(不管ip是否登陆过)都会走负载,重新分配节点;如果已经访问过(带cookie)则可以保证分配到同一节点。QQ:875881559欢迎交流
爱吃鱼的程序员 2020-06-22 14:22:45 0 浏览量 回答数 0

回答

动态生成######那这样岂不是要解析网页了??###### HTML 和 XML 不过是格式不同而已,使用任何一个模板如 JSP、Velocity 都可以很方便的生成 XML,不需要 XML 工具 ######回复 @Owater- : 我干嘛要解析网页啊?######生成是很简单,几行代码就OK了,但是一个网页,你要先对整个网页进行解析就有点难了######解析xml啊 得到文章的title/content之类的######回复 @Owater- : 解析其他网站要用解析html的类库。######假如你要解析其他网站的文章呢,你要怎样才能准确地获取到那些对应的内容呢######创建的啊######怎么创建######我要的好奇我们能不能使用这个接口获取数据,如果 @红薯 不想让我们使用,那么有什么简单易行的办法解决不然他人调用?######通过这个接口肯定可以获取数据啊,不会不让你使用的~###### 只是自定义一个格式,然后把数据填充上去而已. 你的想法本来就岔劈了.... ######从数据库去数据出来,然后生成的xml,######这个有可能,不过还是想知道开源中国到底是怎么弄的,希望官方能解释一下######你的想法走偏了吧。请求接口返回参数如下面格式就可以取到了: {id:1,title:"测试",content:"xml文本"} 直接将content放入webview显示不就可以了?想要什么字段你就传过来就行了嘛。 ######这样子的,我还以为是通过抓网页内容获得数据的
爱吃鱼的程序员 2020-06-03 11:46:26 0 浏览量 回答数 0

回答

干嘛不用@ResponseBody 然后直接returnuser呢?######我是被逼的……######回复 @郏高阳:多此一举啊######我不想用这样的方式###### 引用来自“throwable”的答案 干嘛不用@ResponseBody 然后直接returnuser呢? +1###### @RequestMapping("yourFun")@ResponseBodypublicStringyourFun(){return"{'a':1}";} ######这种方法不行中文会乱码###### 最简单的直接用 @ResponseBody返回。其二我经常使用的多视图,代码如下:JsonView.java packagecom.szfore.springmvc;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.util.CollectionUtils;importorg.springframework.validation.BindingResult;importorg.springframework.web.servlet.view.AbstractView;importcom.google.gson.Gson;/***<b>function:</b>扩展AbstractView实现JSON-lib视图*@authorhoojo*@createDate2011-4-28下午05:26:43*@fileMappingJsonlibVeiw.java*@packagecom.hoo.veiw.xml*@projectSpringMVC4View*@bloghttp://blog.csdn.net/IBM_hoojo*@emailhoojo_@126.com*@version1.0*/publicclassJsonViewextendsAbstractView{publicstaticfinalStringDEFAULT_CONTENT_TYPE="application/json";publicstaticfinalStringHTML_CONTENT_TYPE="text/html";publicstaticfinalStringDEFAULT_CHAR_ENCODING="UTF-8";privateStringencodeing=DEFAULT_CHAR_ENCODING;privateObjectjsonData=null;privateMap<String,Object>_jsonDataMap=newHashMap<String,Object>();publicvoidsetEncodeing(Stringencodeing){this.encodeing=encodeing;}privateSet<String>renderedAttributes;publicJsonView(){setContentType(DEFAULT_CONTENT_TYPE);}publicJsonView(Objectdata){setContentType(DEFAULT_CONTENT_TYPE);this.jsonData=data;}@OverrideprotectedvoidrenderMergedOutputModel(Map<String,Object>model,HttpServletRequestrequest,HttpServletResponseresponse)throwsException{response.setCharacterEncoding(encodeing);response.setContentType(getContentType());PrintWriterout=response.getWriter();if(jsonData!=null){out.print(newGson().toJson(jsonData));}elseif(!_jsonDataMap.isEmpty()){out.print(newGson().toJson(_jsonDataMap));}else{model=filterModel(model);out.print(newGson().toJson(model));}}/***Filtersoutundesiredattributesfromthegivenmodel.*<p>Defaultimplementationremoves{@linkBindingResult}instancesandentriesnotincludedinthe{@link*#setRenderedAttributes(Set)renderedAttributes}property.*/protectedMap<String,Object>filterModel(Map<String,Object>model){Map<String,Object>result=newHashMap<String,Object>(model.size());Set<String>renderedAttributes=!CollectionUtils.isEmpty(this.renderedAttributes)?this.renderedAttributes:model.keySet();for(Map.Entry<String,Object>entry:model.entrySet()){if(!(entry.getValue()instanceofBindingResult)&&renderedAttributes.contains(entry.getKey())){result.put(entry.getKey(),entry.getValue());}}returnresult;}publicvoidsetJsonData(ObjectjsonData){this.jsonData=jsonData;}publicstaticJsonViewreturnJson(ObjectjsonData){JsonViewjsonView=newJsonView();jsonView.setJsonData(jsonData);returnjsonView;}publicJsonViewput(Stringkey,Objectvalue){_jsonDataMap.put(key,value);returnthis;}}MultiViewResover.java packagecom.szfore.springmvc;importjava.util.Locale;importjava.util.Map;importorg.springframework.web.servlet.View;importorg.springframework.web.servlet.ViewResolver;/***@authorJeson*@blog:http://www.gbsou.com*@date:Oct20,20098:39:27AM*@version:1.0**/publicclassMultiViewResoverimplementsViewResolver{privateMap<String,ViewResolver>resolvers;privatefinalstaticStringDEFAULT_RESOLVER="jsp";privatefinalstaticStringJSON_RESOLVER="json";privatefinalstaticStringJSON_VIEW_NAME="jsonView";/**自定义resolve类默认为jsp视图,其余视图用下划线分隔*/@OverridepublicViewresolveViewName(StringviewName,Localelocale)throwsException{//判断是否为jsonStringtmpViewName=viewName.trim().toLowerCase();if(JSON_RESOLVER.equals(tmpViewName)){ViewResolverresolver=resolvers.get(JSON_RESOLVER);returnresolver.resolveViewName(JSON_VIEW_NAME,locale);}//若无下划线,默认转向jsp视图intn=viewName.lastIndexOf("_");if(n==(-1)){ViewResolverresolver=resolvers.get(DEFAULT_RESOLVER);returnresolver.resolveViewName(viewName,locale);}//有的话截取下划线后面的字符串这里一般是jsp,ftl,vm与配置文件中的<entrykey="ftl">的key匹配Stringsuffix=viewName.substring(n+1);//根据下划线后面的字符串去获取托管的视图解析类对象ViewResolverresolver=resolvers.get(suffix);//取下划线前面的部分那时真正的资源名.比如我们要使用hello.jsp那viewName就应该是hello_jspviewName=viewName.substring(0,n);if(resolver!=null){returnresolver.resolveViewName(viewName,locale);}returnnull;}publicMap<String,ViewResolver>getResolvers(){returnresolvers;}publicvoidsetResolvers(Map<String,ViewResolver>resolvers){this.resolvers=resolvers;}}xml配置 <!--多视图--><beanname="jsonView"class="com.szfore.springmvc.JsonView"></bean><beanid="viewResolver"class="com.szfore.springmvc.MultiViewResover"><propertyname="resolvers"><map><entrykey="jsp"><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/"/><propertyname="suffix"value=".jsp"/></bean></entry><entrykey="json"><beanclass="org.springframework.web.servlet.view.BeanNameViewResolver"></bean></entry></map></property></bean>使用方法: @RequestMapping("/test")publicJsonViewtest(){returnnewJsonView(newUser());} ######支持一楼######是不是想这样用?找我呗 @RequestMapping(value="/user",method=RequestMethod.GET)publicStringgetUser(){Useruser=newUser();user.setUserName("userName");user.setPassword("password");user.setAge(22);user.setSex("男");user.setBirthday("2013-11-11");return"json:"+JSONUtils.jsonSucess(user);} ###### @郏高阳这样用的目的就是返回JSONObject######我还是返回JSONObject
优选2 2020-06-09 16:13:14 0 浏览量 回答数 0

回答

干嘛不用@ResponseBody 然后直接return user呢? ######我是被逼的……######回复 @郏高阳 : 多此一举啊######我不想用这样的方式###### 引用来自“throwable”的答案 干嘛不用@ResponseBody 然后直接return user呢? +1 ###### @RequestMapping("yourFun") @ResponseBody public String yourFun() { return "{'a':1}"; } ######这种方法不行 中文会乱码###### 最简单的直接用 @ResponseBody返回。 其二我经常使用的多视图,代码如下: JsonView.java package com.szfore.springmvc; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.util.CollectionUtils; import org.springframework.validation.BindingResult; import org.springframework.web.servlet.view.AbstractView; import com.google.gson.Gson; /** * <b>function:</b>扩展AbstractView 实现JSON-lib视图 * @author hoojo * @createDate 2011-4-28 下午05:26:43 * @file MappingJsonlibVeiw.java * @package com.hoo.veiw.xml * @project SpringMVC4View * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */ public class JsonView extends AbstractView { public static final String DEFAULT_CONTENT_TYPE = "application/json"; public static final String HTML_CONTENT_TYPE = "text/html"; public static final String DEFAULT_CHAR_ENCODING = "UTF-8"; private String encodeing = DEFAULT_CHAR_ENCODING; private Object jsonData = null; private Map<String, Object> _jsonDataMap = new HashMap<String, Object>(); public void setEncodeing(String encodeing) { this.encodeing = encodeing; } private Set<String> renderedAttributes; public JsonView() { setContentType(DEFAULT_CONTENT_TYPE); } public JsonView(Object data) { setContentType(DEFAULT_CONTENT_TYPE); this.jsonData =data; } @Override protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setCharacterEncoding(encodeing); response.setContentType(getContentType()); PrintWriter out = response.getWriter(); if(jsonData != null){ out.print(new Gson().toJson(jsonData)); }else if(!_jsonDataMap.isEmpty()){ out.print(new Gson().toJson(_jsonDataMap)); }else { model = filterModel(model); out.print(new Gson().toJson(model)); } } /** * Filters out undesired attributes from the given model. * <p>Default implementation removes {@link BindingResult} instances and entries not included in the {@link * #setRenderedAttributes(Set) renderedAttributes} property. */ protected Map<String, Object> filterModel(Map<String, Object> model) { Map<String, Object> result = new HashMap<String, Object>(model.size()); Set<String> renderedAttributes = !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet(); for (Map.Entry<String, Object> entry : model.entrySet()) { if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) { result.put(entry.getKey(), entry.getValue()); } } return result; } public void setJsonData(Object jsonData){ this.jsonData = jsonData; } public static JsonView returnJson(Object jsonData){ JsonView jsonView = new JsonView(); jsonView.setJsonData(jsonData); return jsonView; } public JsonView put(String key, Object value) { _jsonDataMap.put(key, value); return this; } } MultiViewResover.java package com.szfore.springmvc; import java.util.Locale; import java.util.Map; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; /** * @author Jeson * @blog:http://www.gbsou.com * @date:Oct 20, 2009 8:39:27 AM * @version :1.0 * */ public class MultiViewResover implements ViewResolver { private Map<String, ViewResolver> resolvers; private final static String DEFAULT_RESOLVER = "jsp"; private final static String JSON_RESOLVER = "json"; private final static String JSON_VIEW_NAME = "jsonView"; /* * 自定义resolve类默认为jsp视图,其余视图用下划线分隔 */ @Override public View resolveViewName(String viewName, Locale locale) throws Exception { //判断是否为json String tmpViewName = viewName.trim().toLowerCase(); if(JSON_RESOLVER.equals(tmpViewName)){ ViewResolver resolver = resolvers.get(JSON_RESOLVER); return resolver.resolveViewName(JSON_VIEW_NAME, locale); } //若无下划线,默认转向jsp视图 int n = viewName.lastIndexOf("_"); if (n == (-1)){ ViewResolver resolver = resolvers.get(DEFAULT_RESOLVER); return resolver.resolveViewName(viewName, locale); } //有的话截取下划线后面的字符串 这里一般是jsp,ftl,vm与配置文件中的<entry key="ftl">的key匹配 String suffix = viewName.substring(n + 1); // 根据下划线后面的字符串去获取托管的视图解析类对象 ViewResolver resolver = resolvers.get(suffix); // 取下划线前面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是hello_jsp viewName = viewName.substring(0, n); if (resolver != null){ return resolver.resolveViewName(viewName, locale); } return null; } public Map<String, ViewResolver> getResolvers() { return resolvers; } public void setResolvers(Map<String, ViewResolver> resolvers) { this.resolvers = resolvers; } } xml配置 <!-- 多视图 --> <bean name="jsonView" class="com.szfore.springmvc.JsonView"> </bean> <bean id="viewResolver" class="com.szfore.springmvc.MultiViewResover"> <property name="resolvers"> <map> <entry key="jsp"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> </bean> </entry> <entry key="json"> <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> </bean> </entry> </map> </property> </bean> 使用方法: @RequestMapping("/test") public JsonView test(){ return new JsonView(new User()); } ######支持一楼######是不是想这样用?找我呗 @RequestMapping(value="/user", method=RequestMethod.GET) public String getUser() { User user = new User(); user.setUserName("userName"); user.setPassword("password"); user.setAge(22); user.setSex("男"); user.setBirthday("2013-11-11"); return "json:" + JSONUtils.jsonSucess(user); } ###### @郏高阳 这样用的目的就是返回JSONObject######我还是返回JSONObject
爱吃鱼的程序员 2020-05-30 22:43:36 0 浏览量 回答数 0

回答

直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。 别说我SB,这是专业做法。也就是所谓的转码器的工作。######这位同学估计是在说类似access,dbf这种小型数据库吧,可以直接按他的文件格式写,一般这种东西普通人都想到怎么往大型数据库里面导入######膜拜,还能这么搞######直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作. 我居然没读懂这句话。。。######还有这样的做法,太神了。完全没想到。。。。牛人啊######批量插入: com.jfinal.plugin.activerecord.Db.batch(......)######应该是想要将Excel当数据源select * into ……这样的答案吧。###### @Secret : 看你头像估计是JAVA的,做应用开发的,自然爽。我们做C的,整天就没白天黑夜的在底层折腾这种事情。你们如同豪华油轮上的侍者,虽然服务于民,但多少一样可以看到风景。我们是锅炉房里铲煤的,自然你们不知道昏天黑地里,还有一片火光。。。哈。 ######回复 @布谷鸟 : 桑那用工资??太亏了吧。银行的钱不借,傻哦。。哈。######嗯,你们领工资去桑拿按*摩的时候,我们忙着到银行还信用卡-_-//###### 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。###### 又是小倩风格.  execl文件是啥格式? 好吧, 这个也还可以有资料可以参考 , 毕竟有可以兼容execl的开源软件可以参考.  那数据库表文件呢, 去哪里可以看到oracle的数据文件是啥格式?哪里有这样的资料? ###### 引用来自“中山野鬼”的答案 直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。 别说我SB,这是专业做法。也就是所谓的转码器的工作。 用 win 的Com 接口, 直接调用 excel的接口, 导出csv 然后 想咋干就咋干 软件就是服务嘛 把Excel 当成工人看待 ###### 引用来自“布谷鸟”的答案 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。 jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi. ###### 引用来自“justin_cn”的答案 引用来自“布谷鸟”的答案 是java吗? 我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。 我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。 百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。 jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi. From http://www.andykhan.com/jexcelapi/tutorial.html Memory Allocation and Sheet Caching For very large files, it was found that reading in the entire workbook led to horrendous performance. As of version 1.6, it was therefore decided to read in a sheet at a time. Every call to getSheet() frees up all the objects currently allocated in the current sheet and then reads in all the data from the next sheet. This alleviated the problems which previously occurred, but it does however assume that the giant size workbooks are spread over several sheets - if not, performance problems and OutOfMemoryExceptions may still occur.  A consequence of this is that if you are using the API to constantly flick between sheets in a large workbook, then this will result in adverse performance because every call to getSheet is causing ExcelRead to re-read and re-deduce all the data. It is recommended that ,if possible, the client application should do all their processing necessary on one sheet before progressing to the next.  The method getSheets(), which returns an array of all sheets, will still attempt to hold all sheets in memory at the same time. Use of this method for very large spreadsheets is not recommended.  ######直接 copy to啊 load进去啊 转换导入的格式,很快的。 跟 @中山野鬼 那速度差不多。
kun坤 2020-06-08 11:17:45 0 浏览量 回答数 0

回答

没看懂你这个配置是要干嘛啊######试试加个 default_type 指令,设置为 text/html######回复 @perfgao : include mime.types; default_type application/octet-stream;######回复 @尴尬中出 : mime文件和default_type指令是否在同一级? http { include /path/to/mime.types; default_type text/html; }######回复 @perfgao : 肯定有引入呀 js就是对应的 application/javascript######回复 @尴尬中出 : 你的nginx配置中有引入include mime.types;吗?######我加了 default_typ 为text/html后 对应的/base目录下的js文件返回的 content_type也变成了 text/html 而不是 application/javascript###### http { include /path/to/mime.types; default_type text/html; } mime文件和default_type指令是否在同一级?
kun坤 2020-06-05 13:13:10 0 浏览量 回答数 0

回答

初识 MyBatis MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map 接口和 POJO 类映射到数据库字段和记录。 MyBatis 的特点 那么 MyBatis 具有什么特点呢?或许我们可以从如下几个方面来描述 MyBatis 中的 SQL 语句和主要业务代码分离,我们一般会把 MyBatis 中的 SQL 语句统一放在 XML 配置文件中,便于统一维护。 解除 SQL 与程序代码的耦合,通过提供 DAO 层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。SQL 和代码的分离,提高了可维护性。 MyBatis 比较简单和轻量 本身就很小且简单。没有任何第三方依赖,只要通过配置 jar 包,或者如果你使用 Maven 项目的话只需要配置 Maven 以来就可以。易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 屏蔽样板代码 MyBatis 回屏蔽原始的 JDBC 样板代码,让你把更多的精力专注于 SQL 的书写和属性-字段映射上。 编写原生 SQL,支持多表关联 MyBatis 最主要的特点就是你可以手动编写 SQL 语句,能够支持多表关联查询。 提供映射标签,支持对象与数据库的 ORM 字段关系映射 ORM 是什么?对象关系映射(Object Relational Mapping,简称ORM) ,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 提供 XML 标签,支持编写动态 SQL。 你可以使用 MyBatis XML 标签,起到 SQL 模版的效果,减少繁杂的 SQL 语句,便于维护。 MyBatis 整体架构 MyBatis 最上面是接口层,接口层就是开发人员在 Mapper 或者是 Dao 接口中的接口定义,是查询、新增、更新还是删除操作;中间层是数据处理层,主要是配置 Mapper -> XML 层级之间的参数映射,SQL 解析,SQL 执行,结果映射的过程。上述两种流程都由基础支持层来提供功能支撑,基础支持层包括连接管理,事务管理,配置加载,缓存处理等。 接口层 在不与Spring 集成的情况下,使用 MyBatis 执行数据库的操作主要如下: InputStream is = Resources.getResourceAsStream("myBatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(is); sqlSession = factory.openSession(); 其中的SqlSessionFactory,SqlSession是 MyBatis 接口的核心类,尤其是 SqlSession,这个接口是MyBatis 中最重要的接口,这个接口能够让你执行命令,获取映射,管理事务。 数据处理层 配置解析 在 Mybatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configration 对象中。之后,根据该对象创建SqlSessionFactory 对象。待 Mybatis 初始化完成后,可以通过 SqlSessionFactory 创建 SqlSession 对象并开始数据库操作。 SQL 解析与 scripting 模块 Mybatis 实现的动态 SQL 语句,几乎可以编写出所有满足需要的 SQL。 Mybatis 中 scripting 模块会根据用户传入的参数,解析映射文件中定义的动态 SQL 节点,形成数据库能执行的SQL 语句。 SQL 执行 SQL 语句的执行涉及多个组件,包括 MyBatis 的四大核心,它们是: Executor、StatementHandler、ParameterHandler、ResultSetHandler。SQL 的执行过程可以用下面这幅图来表示 MyBatis 层级结构各个组件的介绍(这里只是简单介绍,具体介绍在后面): SqlSession: ,它是 MyBatis 核心 API,主要用来执行命令,获取映射,管理事务。接收开发人员提供 Statement Id 和参数。并返回操作结果。Executor :执行器,是 MyBatis 调度的核心,负责 SQL 语句的生成以及查询缓存的维护。StatementHandler : 封装了JDBC Statement 操作,负责对 JDBC Statement 的操作,如设置参数、将Statement 结果集转换成 List 集合。ParameterHandler : 负责对用户传递的参数转换成 JDBC Statement 所需要的参数。ResultSetHandler : 负责将 JDBC 返回的 ResultSet 结果集对象转换成 List 类型的集合。TypeHandler : 用于 Java 类型和 JDBC 类型之间的转换。MappedStatement : 动态 SQL 的封装SqlSource : 表示从 XML 文件或注释读取的映射语句的内容,它创建将从用户接收的输入参数传递给数据库的 SQL。Configuration: MyBatis 所有的配置信息都维持在 Configuration 对象之中。 基础支持层 反射模块 Mybatis 中的反射模块,对 Java 反射进行了很好的封装,提供了简易的 API,方便上层调用,并且对反射操作进行了一系列的优化,比如,缓存了类的 元数据(MetaClass)和对象的元数据(MetaObject),提高了反射操作的性能。 类型转换模块 Mybatis 的别名机制,能够简化配置文件,该机制是类型转换模块的主要功能之一。类型转换模块的另一个功能是实现 JDBC 类型与 Java 类型的转换。在 SQL 语句绑定参数时,会将数据由 Java 类型转换成 JDBC 类型;在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型。 日志模块 在 Java 中,有很多优秀的日志框架,如 Log4j、Log4j2、slf4j 等。Mybatis 除了提供了详细的日志输出信息,还能够集成多种日志框架,其日志模块的主要功能就是集成第三方日志框架。 资源加载模块 该模块主要封装了类加载器,确定了类加载器的使用顺序,并提供了加载类文件和其它资源文件的功能。 解析器模块 该模块有两个主要功能:一个是封装了 XPath,为 Mybatis 初始化时解析 mybatis-config.xml配置文件以及映射配置文件提供支持;另一个为处理动态 SQL 语句中的占位符提供支持。 数据源模块 Mybatis 自身提供了相应的数据源实现,也提供了与第三方数据源集成的接口。数据源是开发中的常用组件之一,很多开源的数据源都提供了丰富的功能,如连接池、检测连接状态等,选择性能优秀的数据源组件,对于提供ORM 框架以及整个应用的性能都是非常重要的。 事务管理模块 一般地,Mybatis 与 Spring 框架集成,由 Spring 框架管理事务。但 Mybatis 自身对数据库事务进行了抽象,提供了相应的事务接口和简单实现。 缓存模块 Mybatis 中有一级缓存和二级缓存,这两级缓存都依赖于缓存模块中的实现。但是需要注意,这两级缓存与Mybatis 以及整个应用是运行在同一个 JVM 中的,共享同一块内存,如果这两级缓存中的数据量较大,则可能影响系统中其它功能,所以需要缓存大量数据时,优先考虑使用 Redis、Memcache 等缓存产品。 Binding 模块 在调用 SqlSession 相应方法执行数据库操作时,需要制定映射文件中定义的 SQL 节点,如果 SQL 中出现了拼写错误,那就只能在运行时才能发现。为了能尽早发现这种错误,Mybatis 通过 Binding 模块将用户自定义的Mapper 接口与映射文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作,从而避免上述问题。注意,在开发中,我们只是创建了 Mapper 接口,而并没有编写实现类,这是因为 Mybatis 自动为 Mapper 接口创建了动态代理对象。 MyBatis 核心组件 在认识了 MyBatis 并了解其基础架构之后,下面我们来看一下 MyBatis 的核心组件,就是这些组件实现了从 SQL 语句到映射到 JDBC 再到数据库字段之间的转换,执行 SQL 语句并输出结果集。首先来认识 MyBatis 的第一个核心组件 SqlSessionFactory 对于任何框架而言,在使用该框架之前都要经历过一系列的初始化流程,MyBatis 也不例外。MyBatis 的初始化流程如下 String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); sqlSessionFactory.openSession(); 上述流程中比较重要的一个对象就是SqlSessionFactory,SqlSessionFactory 是 MyBatis 框架中的一个接口,它主要负责的是 MyBatis 框架初始化操作 为开发人员提供SqlSession 对象 SqlSessionFactory 有两个实现类,一个是 SqlSessionManager 类,一个是 DefaultSqlSessionFactory 类 DefaultSqlSessionFactory : SqlSessionFactory 的默认实现类,是真正生产会话的工厂类,这个类的实例的生命周期是全局的,它只会在首次调用时生成一个实例(单例模式),就一直存在直到服务器关闭。 SqlSessionManager : 已被废弃,原因大概是: SqlSessionManager 中需要维护一个自己的线程池,而使用MyBatis 更多的是要与 Spring 进行集成,并不会单独使用,所以维护自己的 ThreadLocal 并没有什么意义,所以 SqlSessionManager 已经不再使用。 ####SqlSessionFactory 的执行流程 下面来对 SqlSessionFactory 的执行流程来做一个分析 首先第一步是 SqlSessionFactory 的创建 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 1 从这行代码入手,首先创建了一个 SqlSessionFactoryBuilder 工厂,这是一个建造者模式的设计思想,由 builder 建造者来创建 SqlSessionFactory 工厂 然后调用 SqlSessionFactoryBuilder 中的 build 方法传递一个InputStream 输入流,Inputstream 输入流中就是你传过来的配置文件 mybatis-config.xml,SqlSessionFactoryBuilder 根据传入的 InputStream 输入流和environment、properties属性创建一个XMLConfigBuilder对象。SqlSessionFactoryBuilder 对象调用XMLConfigBuilder 的parse()方法,流程如下。 XMLConfigBuilder 会解析/configuration标签,configuration 是 MyBatis 中最重要的一个标签,下面流程会介绍 Configuration 标签。 MyBatis 默认使用 XPath 来解析标签,关于 XPath 的使用,参见 https://www.w3school.com.cn/xpath/index.asp 在 parseConfiguration 方法中,会对各个在 /configuration 中的标签进行解析 重要配置 说一下这些标签都是什么意思吧 properties,外部属性,这些属性都是可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递。 <properties> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/test" /> <property name="username" value="root" /> <property name="password" value="root" /> </properties> 一般用来给 environment 标签中的 dataSource 赋值 <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> 还可以通过外部属性进行配置,但是我们这篇文章以原理为主,不会介绍太多应用层面的操作。 settings ,MyBatis 中极其重要的配置,它们会改变 MyBatis 的运行时行为。 settings 中配置有很多,具体可以参考 https://mybatis.org/mybatis-3/zh/configuration.html#settings 详细了解。这里介绍几个平常使用过程中比较重要的配置 一般使用如下配置 <settings> <setting name="cacheEnabled" value="true"/> <setting name="lazyLoadingEnabled" value="true"/> </settings> typeAliases,类型别名,类型别名是为 Java 类型设置的一个名字。 它只和 XML 配置有关。 <typeAliases> <typeAlias alias="Blog" type="domain.blog.Blog"/> </typeAliases> 当这样配置时,Blog 可以用在任何使用 domain.blog.Blog 的地方。 typeHandlers,类型处理器,无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。 在 org.apache.ibatis.type 包下有很多已经实现好的 TypeHandler,可以参考如下 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很方便的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。 objectFactory,对象工厂,MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。 public class ExampleObjectFactory extends DefaultObjectFactory { public Object create(Class type) { return super.create(type); } public Object create(Class type, List constructorArgTypes, List constructorArgs) { return super.create(type, constructorArgTypes, constructorArgs); } public void setProperties(Properties properties) { super.setProperties(properties); } public boolean isCollection(Class type) { return Collection.class.isAssignableFrom(type); } } 然后需要在 XML 中配置此对象工厂 <objectFactory type="org.mybatis.example.ExampleObjectFactory"> <property name="someProperty" value="100"/> </objectFactory> plugins,插件开发,插件开发是 MyBatis 设计人员给开发人员留给自行开发的接口,MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。MyBatis 允许使用插件来拦截的方法调用包括:Executor、ParameterHandler、ResultSetHandler、StatementHandler 接口,这几个接口也是 MyBatis 中非常重要的接口,我们下面会详细介绍这几个接口。 environments,MyBatis 环境配置,MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中 使用相同的 SQL 映射。 这里注意一点,虽然 environments 可以指定多个环境,但是 SqlSessionFactory 只能有一个,为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可。 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties); databaseIdProvider ,数据库厂商标示,MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。 <databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider> mappers,映射器,这是告诉 MyBatis 去哪里找到这些 SQL 语句,mappers 映射配置有四种方式 上面的一个个属性都对应着一个解析方法,都是使用 XPath 把标签进行解析,解析完成后返回一个 DefaultSqlSessionFactory 对象,它是 SqlSessionFactory 的默认实现类。这就是 SqlSessionFactoryBuilder 的初始化流程,通过流程我们可以看到,初始化流程就是对一个个 /configuration 标签下子标签的解析过程。 SqlSession 在 MyBatis 初始化流程结束,也就是 SqlSessionFactoryBuilder -> SqlSessionFactory 的获取流程后,我们就可以通过 SqlSessionFactory 对象得到 SqlSession 然后执行 SQL 语句了。具体来看一下这个过程‘ 在 SqlSessionFactory.openSession 过程中我们可以看到,会调用到 DefaultSqlSessionFactory 中的 openSessionFromDataSource 方法,这个方法主要创建了两个与我们分析执行流程重要的对象,一个是 Executor 执行器对象,一个是 SqlSession 对象。执行器我们下面会说,现在来说一下 SqlSession 对象 SqlSession 对象是 MyBatis 中最重要的一个对象,这个接口能够让你执行命令,获取映射,管理事务。SqlSession 中定义了一系列模版方法,让你能够执行简单的 CRUD 操作,也可以通过 getMapper 获取 Mapper 层,执行自定义 SQL 语句,因为 SqlSession 在执行 SQL 语句之前是需要先开启一个会话,涉及到事务操作,所以还会有 commit、 rollback、close 等方法。这也是模版设计模式的一种应用。 MapperProxy MapperProxy 是 Mapper 映射 SQL 语句的关键对象,我们写的 Dao 层或者 Mapper 层都是通过 MapperProxy 来和对应的 SQL 语句进行绑定的。下面我们就来解释一下绑定过程 这就是 MyBatis 的核心绑定流程,我们可以看到 SqlSession 首先调用 getMapper 方法,我们刚才说到 SqlSession 是大哥级别的人物,只定义标准(有一句话是怎么说的来着,一流的企业做标准,二流的企业做品牌,三流的企业做产品)。 SqlSession 不愿意做的事情交给 Configuration 这个手下去做,但是 Configuration 也是有小弟的,它不愿意做的事情直接甩给小弟去做,这个小弟是谁呢?它就是 MapperRegistry,马上就到核心部分了。MapperRegistry 相当于项目经理,项目经理只从大面上把握项目进度,不需要知道手下的小弟是如何工作的,把任务完成了就好。最终真正干活的还是 MapperProxyFactory。看到这段代码 Proxy.newProxyInstance ,你是不是有一种恍然大悟的感觉,如果你没有的话,建议查阅一下动态代理的文章,这里推荐一篇 (https://www.jianshu.com/p/95970b089360) 也就是说,MyBatis 中 Mapper 和 SQL 语句的绑定正是通过动态代理来完成的。 通过动态代理,我们就可以方便的在 Dao 层或者 Mapper 层定义接口,实现自定义的增删改查操作了。那么具体的执行过程是怎么样呢?上面只是绑定过程,别着急,下面就来探讨一下 SQL 语句的执行过程。 MapperProxyFactory 会生成代理对象,这个对象就是 MapperProxy,最终会调用到 mapperMethod.execute 方法,execute 方法比较长,其实逻辑比较简单,就是判断是 插入、更新、删除 还是 查询 语句,其中如果是查询的话,还会判断返回值的类型,我们可以点进去看一下都是怎么设计的。 很多代码其实可以忽略,只看我标出来的重点就好了,我们可以看到,不管你前面经过多少道关卡处理,最终都逃不过 SqlSession 这个老大制定的标准。 我们以 selectList 为例,来看一下下面的执行过程。 这是 DefaultSqlSession 中 selectList 的代码,我们可以看到出现了 executor,这是什么呢?我们下面来解释。 Executor 还记得我们之前的流程中提到了 Executor(执行器) 这个概念吗?我们来回顾一下它第一次出现的位置。 由 Configuration 对象创建了一个 Executor 对象,这个 Executor 是干嘛的呢?下面我们就来认识一下 Executor 的继承结构 每一个 SqlSession 都会拥有一个 Executor 对象,这个对象负责增删改查的具体操作,我们可以简单的将它理解为 JDBC 中 Statement 的封装版。 也可以理解为 SQL 的执行引擎,要干活总得有一个发起人吧,可以把 Executor 理解为发起人的角色。 首先先从 Executor 的继承体系来认识一下 如上图所示,位于继承体系最顶层的是 Executor 执行器,它有两个实现类,分别是BaseExecutor和 CachingExecutor。 BaseExecutor 是一个抽象类,这种通过抽象的实现接口的方式是适配器设计模式之接口适配 的体现,是Executor 的默认实现,实现了大部分 Executor 接口定义的功能,降低了接口实现的难度。BaseExecutor 的子类有三个,分别是 SimpleExecutor、ReuseExecutor 和 BatchExecutor。 SimpleExecutor : 简单执行器,是 MyBatis 中默认使用的执行器,每执行一次 update 或 select,就开启一个Statement 对象,用完就直接关闭 Statement 对象(可以是 Statement 或者是 PreparedStatment 对象) ReuseExecutor : 可重用执行器,这里的重用指的是重复使用 Statement,它会在内部使用一个 Map 把创建的Statement 都缓存起来,每次执行 SQL 命令的时候,都会去判断是否存在基于该 SQL 的 Statement 对象,如果存在 Statement 对象并且对应的 connection 还没有关闭的情况下就继续使用之前的 Statement 对象,并将其缓存起来。因为每一个 SqlSession 都有一个新的 Executor 对象,所以我们缓存在 ReuseExecutor 上的 Statement作用域是同一个 SqlSession。 BatchExecutor : 批处理执行器,用于将多个 SQL 一次性输出到数据库 CachingExecutor: 缓存执行器,先从缓存中查询结果,如果存在就返回之前的结果;如果不存在,再委托给Executor delegate 去数据库中取,delegate 可以是上面任何一个执行器。 Executor 的创建和选择 我们上面提到 Executor 是由 Configuration 创建的,Configuration 会根据执行器的类型创建,如下 这一步就是执行器的创建过程,根据传入的 ExecutorType 类型来判断是哪种执行器,如果不指定 ExecutorType ,默认创建的是简单执行器。它的赋值可以通过两个地方进行赋值: 可以通过 标签来设置当前工程中所有的 SqlSession 对象使用默认的 Executor <settings> <!--取值范围 SIMPLE, REUSE, BATCH --> <setting name="defaultExecutorType" value="SIMPLE"/> </settings> 另外一种直接通过Java对方法赋值的方式 session = factory.openSession(ExecutorType.BATCH); Executor 的具体执行过程 Executor 中的大部分方法的调用链其实是差不多的,下面是深入源码分析执行过程,如果你没有时间或者暂时不想深入研究的话,给你下面的执行流程图作为参考。 我们紧跟着上面的 selectList 继续分析,它会调用到 executor.query 方法。 当有一个查询请求访问的时候,首先会经过 Executor 的实现类 CachingExecutor ,先从缓存中查询 SQL 是否是第一次执行,如果是第一次执行的话,那么就直接执行 SQL 语句,并创建缓存,如果第二次访问相同的 SQL 语句的话,那么就会直接从缓存中提取。 上面这段代码是从 selectList -> 从缓存中 query 的具体过程。可能你看到这里有些觉得类都是什么东西,我想鼓励你一下,把握重点,不用每段代码都看,从找到 SQL 的调用链路,其他代码想看的时候在看,看源码就是很容易发蒙,容易烦躁,但是切记一点,把握重点。 上面代码会判断缓存中是否有这条 SQL 语句的执行结果,如果没有的话,就再重新创建 Executor 执行器执行 SQL 语句,注意, list = doQuery 是真正执行 SQL 语句的过程,这个过程中会创建我们上面提到的三种执行器,这里我们使用的是简单执行器。 到这里,执行器所做的工作就完事了,Executor 会把后续的工作交给 StatementHandler 继续执行。下面我们来认识一下 StatementHandler 上面代码会判断缓存中是否有这条 SQL 语句的执行结果,如果没有的话,就再重新创建 Executor 执行器执行 SQL 语句,注意, list = doQuery 是真正执行 SQL 语句的过程,这个过程中会创建我们上面提到的三种执行器,这里我们使用的是简单执行器。 到这里,执行器所做的工作就完事了,Executor 会把后续的工作交给 StatementHandler 继续执行。下面我们来认识一下 StatementHandler StatementHandler 的继承结构 有没有感觉和 Executor 的继承体系很相似呢?最顶级接口是四大组件对象,分别有两个实现类 BaseStatementHandler 和 RoutingStatementHandler,BaseStatementHandler 有三个实现类, 他们分别是 SimpleStatementHandler、PreparedStatementHandler 和 CallableStatementHandler。 RoutingStatementHandler : RoutingStatementHandler 并没有对 Statement 对象进行使用,只是根据StatementType 来创建一个代理,代理的就是对应Handler的三种实现类。在MyBatis工作时,使用的StatementHandler 接口对象实际上就是 RoutingStatementHandler 对象。 BaseStatementHandler : 是 StatementHandler 接口的另一个实现类,它本身是一个抽象类,用于简化StatementHandler 接口实现的难度,属于适配器设计模式体现,它主要有三个实现类 SimpleStatementHandler: 管理 Statement 对象并向数据库中推送不需要预编译的SQL语句。PreparedStatementHandler: 管理 Statement 对象并向数据中推送需要预编译的SQL语句。CallableStatementHandler:管理 Statement 对象并调用数据库中的存储过程。 StatementHandler 的创建和源码分析 我们继续来分析上面 query 的调用链路,StatementHandler 的创建过程如下 MyBatis 会根据 SQL 语句的类型进行对应 StatementHandler 的创建。我们以预处理 StatementHandler 为例来讲解一下 执行器不仅掌管着 StatementHandler 的创建,还掌管着创建 Statement 对象,设置参数等,在创建完 PreparedStatement 之后,我们需要对参数进行处理了。 如 如果用一副图来表示一下这个执行流程的话我想是这样 这里我们先暂停一下,来认识一下第三个核心组件 ParameterHandler ParameterHandler - ParameterHandler 介绍 ParameterHandler 相比于其他的组件就简单很多了,ParameterHandler 译为参数处理器,负责为 PreparedStatement 的 sql 语句参数动态赋值,这个接口很简单只有两个方法 ParameterHandler 只有一个实现类 DefaultParameterHandler , 它实现了这两个方法。 getParameterObject: 用于读取参数setParameters: 用于对 PreparedStatement 的参数赋值ParameterHandler 的解析过程 上面我们讨论过了 ParameterHandler 的创建过程,下面我们继续上面 parameterSize 流程 这就是具体参数的解析过程了,下面我们来描述一下 下面用一个流程图表示一下 ParameterHandler 的解析过程,以简单执行器为例 我们在完成 ParameterHandler 对 SQL 参数的预处理后,回到 SimpleExecutor 中的 doQuery 方法 上面又引出来了一个重要的组件那就是 ResultSetHandler,下面我们来认识一下这个组件 ResultSetHandler - ResultSetHandler 简介 ResultSetHandler 也是一个非常简单的接口 ResultSetHandler 是一个接口,它只有一个默认的实现类,像是 ParameterHandler 一样,它的默认实现类是DefaultResultSetHandler ResultSetHandler 解析过程 MyBatis 只有一个默认的实现类就是 DefaultResultSetHandler,DefaultResultSetHandler 主要负责处理两件事 处理 Statement 执行后产生的结果集,生成结果列表 处理存储过程执行后的输出参数 按照 Mapper 文件中配置的 ResultType 或 ResultMap 来封装成对应的对象,最后将封装的对象返回即可。 其中涉及的主要对象有: ResultSetWrapper : 结果集的包装器,主要针对结果集进行的一层包装,它的主要属性有 ResultSet : Java JDBC ResultSet 接口表示数据库查询的结果。 有关查询的文本显示了如何将查询结果作为java.sql.ResultSet 返回。 然后迭代此ResultSet以检查结果。 TypeHandlerRegistry: 类型注册器,TypeHandlerRegistry 在初始化的时候会把所有的 Java类型和类型转换器进行注册。 ColumnNames: 字段的名称,也就是查询操作需要返回的字段名称 ClassNames: 字段的类型名称,也就是 ColumnNames 每个字段名称的类型 JdbcTypes: JDBC 的类型,也就是 java.sql.Types 类型 ResultMap: 负责处理更复杂的映射关系 在 DefaultResultSetHandler 中处理完结果映射,并把上述结构返回给调用的客户端,从而执行完成一条完整的SQL语句。 内容转载自:CSDN博主:cxuann 原文链接:https://blog.csdn.net/qq_36894974/article/details/104132876?depth_1-utm_source=distribute.pc_feed.none-task&request_id=&utm_source=distribute.pc_feed.none-task
问问小秘 2020-03-05 15:44:27 0 浏览量 回答数 0

回答

引用楼主路上的野花于2016-11-02 01:25发表的 备案就要关网站,不敢再爱了 : 总共备案了2个域名,第一次备案申请,最后发现还要买幕布,一套下来真心觉得好麻烦,终于备案好了,建了个网站,我就着手备案第2个域名,阿里云客户告诉我,不能建一些什么媒体,(我建的是视频网站)等等一切的网站,好吧,我为了备案,换了,阿里云又告诉我,我网站不能有评论,麻烦把评论删了,好吧,反正是你的天下,我懒得啰嗦细问,我说我还是把网站关了吧,就这样,我一个网站自己都忘记建了多久,备案长无所谓,但是阿里云备案,要审核前面的网站,不附规定的,不能备案,所以,几个月了,我网站一直都不敢搭建好,原因是我要多个域名,如果备案,我又要关了前面的网站,等于说,什么权重,粉丝,等都会掉光的,如果你说一次性都备几个案,第一我要那么多干嘛,第二,我都是想起一个好的域名才去备案,等于我就在阿里云备案了,什么服务器,我根本就用不上了,也想到把备好的,转一下,没想到,要等3个月,我现在用的是一个其他香港的服务器,确实很方便,我做了一个公众号,链接这个影视网站,但是好景不长,平台用了一个理由停止了我的域名,说我有营销,我视频网站,一个广告都没放过,那里来的营销,后来我一想,应该是我网站没备案,用了一个理由停止了吧,现在又想转到阿里云,但是但是我又纠结了,如果我把其他地方的域名转过来,又要备案,关网站,搞的我头都大了,真心不好做,跳转网址在阿里云根本就行不通,香港服务器速度肯定是比不过国内的,所以才想转,有老司机能教教我该怎么做才好。有老司机能教教我该怎么做。才好。有老司机能教教我该怎么做才好。 亲,如果亲是个人备案,是不能涉及企业商业等信息的,如果是企业备案,涉及视频与论坛需要先办理前置审批文件,亲可以参考一下:https://help.aliyun.com/knowledge_detail/36960.html。另外,如果亲在一个网站完成备案之后继续备案新网站时,是不会影响您已经完成备案网站的访问的,只是新的未备案网站在完成备案之前不能访问。从长远考虑,还是建议您按规则要求先完成备案。
备案服务 2019-12-02 02:31:23 0 浏览量 回答数 0

问题

【精品问答】前端开发必懂之JS技术二百问

1.document load 和 document ready 的区别 2.JavaScript 中如何检测一个变量是一个 String 类型? 3.请用 js 去除字符串空格? 4.js 是一门怎样的语言&#...
茶什i 2019-12-01 22:05:04 146 浏览量 回答数 0

回答

前言 这期我想写很久了,但是因为时间的原因一直拖到了现在,我以为一两天就写完了,结果从构思到整理资料,再到写出来用了差不多一周的时间吧。 你们也知道丙丙一直都是创作鬼才来的,所以我肯定不会一本正经的写,我想了好几个切入点,最后决定用一个完整的电商系统作为切入点,带着大家看看,我们需要学些啥,我甚至还收集配套视频和资料,暖男石锤啊,这期是呕心沥血之作,不要白嫖了。 正文 在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。 Tip:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。 不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。 前端 你可能会会好奇,你不是讲后端学习路线嘛,为啥还有前端的部分,我只能告诉你,傻瓜,肤浅。 我们可不能闭门造车,谁告诉你后端就不学点前端了? 前端现在很多也了解后端的技术栈的,你想我们去一个网站,最先接触的,最先看到的是啥? 没错就是前端,在大学你要是找不到专门的前端同学,去做系统肯定也要自己顶一下前端的,那我觉得最基本的技术栈得熟悉和了解吧,丙丙现在也是偶尔会开发一下我们的管理系统主要是VUE和React。 在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础的。 作为一名后端了解部分前端知识还是很有必要的,在以后开发的时候,公司有前端那能帮助你前后端联调更顺畅,如果没前端你自己也能顶一下简单的页面。 HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。 在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。 Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。 前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始讲后端了。 网关层: 互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。 微服务,分布式,负载均衡等我们经常提到的这些名词都是这些技术在场景背后支撑。 单机顶不住,我们就多找点服务器,但是怎么将流量均匀的打到这些服务器上呢? 负载均衡,LVS 我们机器都是IP访问的,那怎么通过我们申请的域名去请求到服务器呢? DNS 大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验? CDN 我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等? zk 这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。 Nginx 这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。 我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。 这一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开zk这一层,我们继续往下看。 服务层: 这一层有点东西了,算是整个框架的核心,如果你跟我帅丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。 我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。 为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,TCP协议,什么三次握手,四次挥手。 还有进程、线程、协程,什么内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而丙丙还做得不够)。 了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。 JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。 代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。 写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。 代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去写项目版本管理工具Git。 代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,查看进程,查看文件,各种Vim操作等等。 系统的优化很多地方没优化的空间了,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。 这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud。 了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。 代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。 他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里云的全局事务服务GTS等等。 分布式事务的时候你会想去了解RocketMQ,因为他自带了分布式事务的解决方案,大数据的场景你又看到了Kafka。 我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的,所以很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。 服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。 此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。 **Spring Cloud **中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。 你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化,你可能就会去了解容器化的知识,像**Docker,Kubernetes(K8s)**等。 微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。 这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。 好啦我们继续沿着图往下看,那再往下是啥呢? 数据层: 数据库可能是整个系统中最值钱的部分了,在我码文字的前一天,刚好发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,没想到还是照进了现实。 这里也提一点点吧,36小时的故障,其实在互联网公司应该是个笑话了吧,权限控制没做好类似rm -rf 、fdisk、drop等等这样的高危命令是可以实时拦截掉的,备份,全量备份,增量备份,延迟备份,异地容灾全部都考虑一下应该也不至于这样,一家上市公司还是有点点不应该。 数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。 上面我们提到了安全,不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。 你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是MongoDB、memcache也有各自的应用场景。 Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。 单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制…… 他的大容量存储有问题,你可能需要去了解Pika…. 其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。 实时/离线/大数据 等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。 你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。 然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。 写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。 离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。 数据接触完了,计算引擎Spark你是不是也不能放过…… 搜索引擎: 传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。 那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。 这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。 学习路线 看了这么久你是不是发现,帅丙只是一直在介绍每个层级的技术栈,并没说到具体的一个路线,那是因为我想让大家先有个认知或者说是扫盲吧,我一样用脑图的方式汇总一下吧,如果图片被平台二压了。 资料/学习网站 Tip:本来这一栏有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,所以大家去公众号回复【路线】好了。 絮叨 如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。 如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。 丙丙发现在工作中发现我身边的人真的就是实力越强的越努力,最高级的自律,享受孤独(周末的歪哥)。 总结 我提到的技术栈你想全部了解,我觉得初步了解可能几个月就够了,这里的了解仅限于你知道它,知道他是干嘛的,知道怎么去使用它,并不是说深入了解他的底层原理,了解他的常见问题,熟悉问题的解决方案等等。 你想做到后者,基本上只能靠时间上的日积月累,或者不断的去尝试积累经验,也没什么速成的东西,欲速则不达大家也是知道的。 技术这条路,说实话很枯燥,很辛苦,但是待遇也会高于其他一些基础岗位。 所实话我大学学这个就是为了兴趣,我从小对电子,对计算机都比较热爱,但是现在打磨得,现在就是为了钱吧,是不是很现实?若家境殷实,谁愿颠沛流离。 但是至少丙丙因为做软件,改变了家庭的窘境,自己日子也向小康一步步迈过去。 说做程序员改变了我和我家人的一生可能夸张了,但是我总有一种下班辈子会因为我选择走这条路而改变的错觉。 我是敖丙,一个在互联网苟且偷生的工具人。 创作不易,本期硬核,不想被白嫖,各位的「三连」就是丙丙创作的最大动力,我们下次见! 本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。 该回答来自:敖丙
剑曼红尘 2020-03-06 11:35:37 0 浏览量 回答数 0

云产品推荐

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