IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

后端

共 1964 篇文章

IT 2014-12-10 23:19:02 / 累计浏览 9,087

【2014年版】异地购房提取北京公积金

这篇讲的是作者离职后异地购房,如何提取北京公积金的完整实操经历。文章从个人“踩坑”出发,梳理了从账户状态确认、材料准备到现场办理的全流程。 作者首先发现自己的公积金账户已被原单位挂靠的中智公司“集中封存”,导致无法线上处理。朝阳管理部电话长期打不通,最终通过拨打北京公积金中心客服热线010-96155,获取了清晰的材料清单,包括购房合同、发票、身份证、结婚证,以及针对已离职人员的关键文件——异地购房证明和社保缴纳明细。 文章详细记录了如何与购房地居委会沟通开具证明,并分享了自己拟定的证明模板。现场办理时发现,正是因为账户处于“封存”状态,才得以以个人名义直接前往公积金中心办理,避免了通过单位的繁琐流程。作者在文中对比了南北方办事效率的差异,并总结了多条实用提示:优先查询官方网站、耐心拨打官方客服电话、利用在线问答渠道获取准确信息。整体是一份信息扎实、充满细节的“办事指南”式经验复盘。

本机暂存
IT 2014-12-08 23:39:43 / 累计浏览 3,682

应用层的容错与分层设计

这篇讲的是分布式系统中,如何为应用层远程调用构建健壮容错体系的实践思考。文章从实际项目问题出发,指出系统内部服务间远程调用的不可靠性——无论是网络波动、硬件故障还是服务本身变慢,都可能像多米诺骨牌一样拖垮整个系统。单纯依赖服务端容错还不够,调用端(应用层)必须有独立的防御设计。 作者以微博团队的实践为例,分享了不同场景下的容错策略:访问MySQL时,写操作直接抛异常,读操作则有多级Failover;连接Redis或Memcached则需设置超时、异常标记、定期探测,并通过一致性哈希切换到备份节点;调用HTTP接口则要短超时、谨慎重试,并配合业务降级。 这些分散的实现暴露了问题:各客户端独立编码,原理相通却无法复用,维护成本高,且同步调用消耗大量线程资源。文章进而探讨了统一解决方案的可能性,参考了Twitter的Finagle框架思路——将容错、重试等策略抽象为“Filter”,与服务和Future模型结合,实现异步化的通用网络客户端。一个理想的统一client应该具备分层设计(服务层、网络层)、可扩展协议支持,并内置负载均衡、Failover等高可用能力,最终让开发者更专注于业务逻辑而非繁琐的容错细节。

本机暂存
IT 2014-12-08 23:23:54 / 累计浏览 3,581

使用valgrind的callgrind工具进行多线程性能分析

性能分析常让人头疼,尤其在多线程程序里找出瓶颈更不容易。这篇讲的是如何用开源的Valgrind套件中的Callgrind工具,来完成多线程程序的性能剖析。作者从实际命令出发,演示了从数据采集到图形化分析的完整流程。 核心步骤很清晰:先用`valgrind --tool=callgrind`运行目标程序生成分析文件。如果是多线程程序,加上`--separate-threads=yes`参数,就能为每个线程单独生成一份数据,比如`callgrind.out.31113-01`、`-02`等,便于逐个排查。采集到的数据再通过`gprof2dot.py`脚本转换成dot格式,最后用`dot`命令生成PNG调用图。 最终得到的图形能直观展示函数的调用关系和耗时分布,让性能热点一目了然。文章没有空谈理论,而是给出了可直接复制的命令和参数,对需要快速定位代码性能问题的开发者来说,是个实用且上手快的方案。

本机暂存
IT 2014-12-06 20:32:08 / 累计浏览 2,103

关于时间、时区、系统时间和硬件时间

这篇讲的是时间体系中那些容易被混淆的基础概念,以及如何在Linux系统里看清它们的“真面目”。作者从格林威治标准时间(GMT)和世界协调时间(UTC)的历史渊源与精度差异入手,厘清了二者常被混用的原因。同时,也解释了夏日节约时间(DST)的由来,以及系统时间和硬件时间(BIOS时间)这两个在计算机中至关重要的区别:一个由操作系统管理和调用,另一个则依赖主板电池维系,是系统启动时的时间基准。 文章的一大实用亮点在于,它不仅解释概念,更手把手地展示了在Linux终端中查看这些时间的正确姿势。例如,用`date -u`获取UTC时间,而不仅仅是显示本地时间的`date`命令。特别提到了输出中的“CST”可能代表四种不同的时区(包括中国标准时间),这恰恰是很多技术人员会踩的一个小坑。最后,通过`hwclock`命令查看硬件时间,并提供了一个去除其输出中模糊“CST”标识的小技巧。 总的来说,这篇文章从原理到实操,清晰地梳理了时间管理中几个关键但又容易忽略的点,尤其适合那些需要在多时区环境或系统底层开发中与时间打交道的工程师。

本机暂存
IT 2014-12-06 20:00:12 / 累计浏览 2,761

Node.js 打造实时多人游戏框架

这篇讲的是作者在一个极客松的36小时高压环境下,如何利用Node.js从零打造一个名为“Spaceroom”的实时多人游戏框架。框架的核心目标是解决LAN Party场景下的低延迟同步问题,让身处同一局域网的玩家能够实时互动。 作者设计了以“房间”为单位的用户管理和一个基于“bucket”的指令同步算法。简单来说,服务器会将时间切分成固定的小片段(bucket),收集并广播各客户端的指令。客户端根据收到的bucket序列来更新状态,从而在理论上保持画面一致,将网络延迟的影响控制在约定范围内。 实现过程中并非一帆风顺。文章用相当的篇幅分享了一个典型的“踩坑”经历:他们发现Node.js在Windows平台下的`setTimeout(…, 1)`实际精度只有15.625ms左右,远达不到毫秒级计时的要求。通过测试和查阅资料,他们揭示了这是Windows系统计时器的固有特性,并最终给出了基于实际系统时间差进行补偿的解决方案。 总的来说,这篇文章不仅展示了一个具体技术方案的实现过程,也坦诚地分享了探索中的陷阱与排错思路,对于想用Node.js处理实时通信或游戏同步的开发者来说,很有参考价值。

本机暂存
IT 2014-12-06 00:39:59 / 累计浏览 2,201

慕课网——一组java数据带来的行业奇迹

5个月,5万人学同一门Java课,这个数字在在线教育行业里相当炸裂。这篇讲的是慕课网“Java入门第一季”如何成为行业首个学习人数破5万的单门课程。 文章深挖了这一现象背后的核心:课程采用了“视频讲解+在线编程”的混合式设计。这解决了自学者“眼高手低”的痛点,通过“讲、练、再讲”的闭环,让知识即时巩固。慕课网独家的在线编程平台支持多种语言、即时呈现运行结果,大幅降低了编程学习的实践门槛和成本。 课程的成功也源于精准的定位。它瞄准了Java人才市场需求巨大但合格者短缺的矛盾,内容由专业团队和一线技术大咖讲师打造,以企业实战需求为标尺,确保了学以致用。这种以“提升能力、助力就业”为明确目标的课程开发理念,使其在众多学习资源中脱颖而出。 对于想入门编程的学习者而言,这个案例证明了“学练结合”模式的有效性。慕课网的尝试表明,当课程设计能紧密围绕学习效果,并提供强有力的实践工具时,就能跨越入门门槛,甚至创造出行业性的学习热潮。

本机暂存
IT 2014-12-04 13:31:54 / 累计浏览 3,380

Nginx缓存解决方案:SRCache

作者在优化PHP程序时,首先启用了Nginx内置的FastCGI Cache,但发现它不支持分布式缓存,在多服务器场景下存在资源浪费和数据一致性难题。这让他开始寻找更精细的解决方案。 这篇文章的核心就是介绍SRCache这个模块。它作为FastCGI Cache的补充,能实现更细粒度的缓存控制。作者展示了SRCache如何与Memc模块配合处理简单场景,而在需要动态计算缓存键等复杂需求时,则通过Lua脚本进行灵活扩展。 文章详细解读了这套方案的配置实践。通过自定义的Lua脚本,作者实现了对请求的智能判断:只有匹配特定规则的请求才会开启缓存,缓存键由请求方法、主机名和URI等信息动态生成。这种设计既避免了缓存的无效占用,也保证了缓存的精准命中。 整体来看,SRCache提供了一套从粗放式到精细化缓存管理的平滑升级路径。它通过开放的Lua集成,将缓存决策权交给了开发者,能有效应对复杂多变的生产环境需求。

本机暂存
IT 2014-12-04 13:27:46 / 累计浏览 3,462

短网址服务的构建

短网址服务从社交媒体兴起,核心是解决链接过长、不便传播的问题。这篇文章深入讲解了如何构建这样一个服务,其实质是一个将长URL映射为短字符串的函数。 作者首先澄清了核心原则:一个短码必须唯一对应一个长地址。随后,文章详细拆解了两种主流的生成方案。方案一利用数据库自增ID,通过精心设计的进制转换(剔除易混淆字符如L、I、0、O)将其编码为6位左右的短码,保证了可读性与生成效率。方案二则从URL的哈希值(如MD5)出发,通过位运算和字符映射将其截断、压缩成短串,提供了另一种无状态的思路。 文章不仅停留在理论层面,还给出了具体的算法代码片段。从设计考量到实现细节,完整展现了一个短网址服务背后的工程思维。

本机暂存
IT 2014-12-04 13:21:22 / 累计浏览 3,944

当cpu飙升时,找出php中可能有问题的代码行

当PHP进程CPU占用率突然飙升至接近100%,如何在解释型语言中精确定位问题代码行?这篇内容深入Zend引擎内部,展示了如何通过调试工具直击PHP运行时状态。 文章的核心思路是,利用Zend引擎维护的全局数据结构(`executor_globals`)来获取执行现场。作者聚焦于其中关键的两个变量:`active_op_array`和`current_execute_data`。通过分析其C语言结构体定义,文章指出`active_op_array`中的`filename`和`function_name`记录了当前执行的文件与函数,而`current_execute_data`里的`opline`则指向了正在执行的操作码(opcode),其`lineno`字段直接对应源码行号。 实战演示部分极具操作性:编写一个包含死循环的PHP脚本,通过`gdb`附加到进程后,只需几条简单的打印命令,就能立即看到脚本正卡在第四行的`sleep(1)`上。文章还介绍了PHP源码附带的`.gdbinit`文件,其中的`zbacktrace`命令能一键生成完整的调用栈回溯,大大简化了调试流程。 这篇内容为PHP性能问题排查提供了一种底层的、引擎级的视角。它告诉我们,即使面对解释型语言,依然可以通过理解其底层实现(如Zend执行器),在应用层优化之外,找到更直接的故障诊断路径。

本机暂存
IT 2014-12-04 13:20:25 / 累计浏览 2,405

HQueue:基于HBase的消息队列

这篇讲的是阿里一淘团队如何用HBase“搭积木”,造出一个叫HQueue的分布式消息队列。作者从时间序列存储、MapReduce数据输入输出等场景的实际需求出发,选择了站在HBase的肩膀上。 核心思路很巧妙:把消息直接存为HBase的KV对,利用HTable的多Region实现高并发,用Coprocessor来保证消息ID的唯一有序,并处理消息的持久化。这样一来,HBase本身的自动Region迁移、动态负载均衡和数据持久化能力,就直接变成了HQueue的“超能力”,实现了自动容错、消息不丢和性能优化。 文章还详细拆解了它的设计细节:比如用PartitionID+Timestamp+SequenceID组合成RowKey来保证消息全局有序,通过不同的Scanner支持灵活扫描,以及在0.3版本后引入的基于ZooKeeper的订阅推送机制。整体来看,这为需要可靠消息队列又已有HBase技术栈的团队,提供了一个无需额外组件、可随HBase无缝升级的解决方案。

本机暂存
IT 2014-12-04 13:18:23 / 累计浏览 3,504

构建C1000K的服务器(2) – 实现百万连接的comet服务器

这篇讲的是作者如何从零实现一个支持百万并发连接的Comet服务器。在解决了系统内核参数调整的基础问题后,文章将焦点转向了具体的应用实现。 作者选择用C/C++和libevent来构建核心,重点在于如何高效管理百万级的连接与通道。一个巧妙的设计是:服务器启动时便预先分配好100万个通道对象,而动态的订阅者则通过内存池管理,这使得初始内存占用控制在24MB。 最吸引人的是文章展示的实测数据。通过逐步增加连接数进行压力测试,结果非常直观:每个Comet连接大约只消耗2.7KB内存。最终,在支撑100万空闲连接时,进程总内存占用约2.7GB,而CPU使用率维持在0%。这清晰证明了该架构在高并发、低活跃度场景下的高效性。 项目的代码已在GitHub开源,文章提供的测试方法和详细数据,为需要构建类似长轮询服务的开发者提供了一个扎实的参考范例。

本机暂存
IT 2014-12-04 13:17:16 / 累计浏览 4,146

构建C1000K的服务器(1) – 基础

当C10K问题已成为历史,作者将目光投向了更宏大的C1000K挑战。对于Twitter、微博这类需要维持千万级实时连接的平台,单机百万连接(C1000K)的能力能极大降低服务器集群规模。 这篇文章并没有直接给出某个框架或库的解决方案,而是从根源出发,剖析了限制C1000K实现的四大核心因素。作者以Linux为例,深入讲解了如何突破操作系统默认的“最大打开文件数”限制,给出了包括临时修改(ulimit)和永久配置(sysctl.conf, limits.conf)在内的具体方法与命令。文章还通过一个原始的C语言服务器程序,实际测量并验证了操作系统为维护百万连接所消耗的内存,将理论估算与实际开销结合起来分析。 作者强调,解决C1000K问题不能盲目追求新技术,而应先理清操作系统内核、内存分配与网络吞吐这些底层瓶颈。文中的系统参数配置和测试思路,为需要应对海量并发连接的开发者提供了切实可行的排查起点和优化依据。

本机暂存
IT 2014-12-03 00:03:18 / 累计浏览 4,582

Trackback,Pingback及XML-RPC

在博客技术中,评论区的互动方式不止“普通评论”一种。这篇讲的是Trackback与Pingback这两种经典的引用通知机制——它们如何让博客文章之间能够“对话”。 文章开门见山,对比了两者:Trackback更像是个“手动挡”,源于早期博客系统,需要作者在自己的文章发布后,手工将链接和摘要以HTTP POST请求发送给目标文章。而Pingback则是一次全面升级,它是“自动挡”。当你在文章中插入其他博客的链接并发布后,Pingback机制会基于XML-RPC协议,自动发现这些链接并向对方服务器发送通知。 作者清晰地列出了核心差异:Pingback使用的是更现代的XML-RPC协议,而Trackback用的是HTTP POST;最关键的是Pingback的全自动发现与通知,无需手动操作。此外,Pingback提取的是链接周边的文字作为摘要,Trackback则需完全手写。 文章不止于对比,还进一步探讨了Pingback机制的潜在应用场景,比如用于跟踪页面引用的脚本和CSS版本。最后,作者简要勾勒了实现Pingback服务端与客户端的核心步骤,从解析请求、抓取页面内容到生成评论,为想动手实践的开发者提供了清晰的思路图谱。

本机暂存
IT 2014-12-02 23:50:19 / 累计浏览 1,864

使用 Mojolicious 写非阻塞的应用: Part 2

这篇讲的是用 Mojolicious 实现非阻塞 Perl Web 应用的进阶技巧,核心解决的是“异步任务编排”的痛点。作者从一个实际场景出发:需要同时抓取多个外部网站并提取标题。 文章首先展示了两个常见的“错误”范式。第一个是单个非阻塞请求,虽然不阻塞服务器,但只能处理一件事。第二个是串行嵌套回调,虽然能处理多个请求,但带来了“回调地狱”,且请求之间仍然是顺序阻塞的,无法真正并行处理,代码可读性和扩展性都很差。 真正的解决方案是引入了 `Mojo::IOLoop::Delay` 这个对象。它的核心思想是将一系列非阻塞操作的依赖关系显式化,通过 `begin` 和 `steps` 方法来定义任务的执行顺序和数据传递。这彻底摆脱了回调嵌套,让开发者可以像写同步代码一样清晰地组织异步流程,同时保持了服务器的高并发能力——所有网络请求几乎可以同时发出,只在需要结果时才等待。 作者通过具体的代码对比,清晰地揭示了从原始回调到结构化异步编程的演进路径,展示了如何利用框架特性写出既高效又易维护的非阻塞代码。

本机暂存
IT 2014-12-02 23:48:25 / 累计浏览 2,023

使用 Mojolicious 写非阻塞的应用: Part 1

这篇讲的是Mojolicious这个Perl Web框架的核心设计理念。作者从“为什么选择Mojolicious”这个常见问题切入,指出其最根本的区别在于从诞生之初就为非阻塞而设计,这让它区别于其他大多数Perl框架。 为了具体说明,文章先展示了Mojolicious简洁高效的模板技术,随后构建了一个连接MongoDB的粘贴应用。作者特意先用开发者更熟悉的阻塞式写法实现,这时所有客户端请求会排队等待数据库操作完成,导致服务器资源利用率低下。这自然引出了阻塞模型的性能瓶颈——单个慢请求会阻塞整个处理流程。 文章的核心在于揭示,当应用切换到Mojolicious的非阻塞模式后,情况将发生质变。服务器可以并发处理多个请求,不会因单个数据库查询而停顿,从而用更少的硬件资源支撑更高的并发量。这对于构建快速、轻量且可扩展的现代Web应用至关重要。

本机暂存
IT 2014-12-02 23:34:15 / 累计浏览 3,401

Linux 安装 Nginx PHP fpm

这篇教程针对初学者在Linux下搭建Nginx+PHP环境时常遇到的依赖复杂、步骤陈旧的困扰,提供了一条从零开始、清晰简洁的实操路径。作者从建议使用Ubuntu Server系统出发,完整演示了从源码编译安装Nginx和PHP的全过程,核心步骤都配有明确的命令行代码。 文章不仅讲解了如何让Nginx和PHP-CGI协同工作的基础配置,更关键的是,它指出了临时运行与生产环境的区别,并详细说明了如何通过PHP-FPM配置守护进程,实现更稳定可靠的部署。此外,教程还涉及了单独编译安装PHP扩展模块(如sockets)这一实用技巧,使读者无需重新编译整个PHP即可按需添加功能。 整体而言,这是一篇注重实战、步骤连贯的现代指南。它强调方法的简洁性与可用性,并承诺会保持内容更新,对于希望快速搭建起标准Web开发环境的新手来说,提供了扎实且可跟随的步骤。

本机暂存
IT 2014-12-02 23:32:03 / 累计浏览 2,041

战斗HTTP

作者从一个棘手的线上问题出发,讲述了一场与HTTP协议“战斗”的完整经历。他的同事在使用Mock工具Moco进行测试时,遇到了连接莫名挂住的怪象,且现象时有时无,极难复现。 排查过程一波三折。从最初怀疑测试框架本身,到单步跟踪发现“挂住”发生在Netty框架层面,甚至怀疑是框架缺陷。直到作者注意到Moco代码中一句强制关闭连接的逻辑,而客户端请求却带着 `Connection: keep-alive`,才初窥门径。问题在于,当服务器不支持长连接却强行关闭,而客户端期望保持连接并继续读取数据时,双方就陷入了“死锁”。 但故事并未结束。修复后,另一个单元测试又“挂”了。通过反复比对,作者最终发现了问题的核心:当服务器支持keep-alive时,如果响应中没有 `Content-Length` 头,客户端将无法得知需要读取多少数据,从而无限等待。最终的解决方案是:在保持连接的响应中,若缺少该字段则主动补全。 这篇记录展现了排查复杂问题的典型路径:从现象到假设,再由新线索推翻假设,循环逼近真相。它不仅剖析了HTTP协议中连接与数据读取的交互细节,也凸显了团队协作与刨根问底精神的价值。

本机暂存
IT 2014-12-02 00:00:14 / 累计浏览 2,643

PHP语法分析器:RE2C && BISON 总结

这篇文章从作者的PHP到C编译项目phptoc说起,详细拆解了如何使用re2c和bison这对经典组合,为PHP构建一套自定义的语法分析器。作者的目标是让PHP程序员能更轻松地编写接近C扩展性能的代码,因此需要理解并重现PHP的核心解析流程。 文章的核心在于厘清re2c(扫描器)与bison(解析器)的分工与协作。re2c负责将原始的PHP代码字符串,根据预设的规则(如scanner.l文件)“扫描”并拆解为一个个token(如T_ECHO、T_LNUMBER)。随后,bison依据语法定义文件(如parse.y),接收这些token流,并按照语法规则执行相应的语义动作,最终完成代码的解析与转换。文中通过“echo 1;”这个简单例子,直观地展示了从字符识别到token生成,再到语法动作执行的完整闭环。 作者没有停留在理论,而是提供了具体的代码结构示例和关键宏定义解释,比如YYCURSOR如何定位当前扫描位置,以及yyparse如何调用yylex形成一个协作循环。这种从项目需求出发,结合工具原理与实践代码的讲述方式,将原本复杂的编译原理知识点拆解得清晰可循,对希望深入PHP底层或需要实现类似解析工具的开发者来说,是一份扎实的实践笔记。

本机暂存
IT 2014-12-01 23:49:39 / 累计浏览 7,802

POST与GET的区别及RESTful

这篇技术分析直指一个普遍存在的开发困惑:“POST能解决的问题GET都能解决”,但规范使用HTTP方法对于构建健壮、安全的Web应用至关重要。文章从实际用法出发,清晰地对比了GET与POST的核心差异。 GET被定义为“获取资源”,它天然是幂等的、可缓存的,数据附在URL上便于分享和书签,但有长度和字符限制。而POST是“发布新资源”,它非幂等(意味着可能产生副作用)、数据不可见、传输量基本不受限,更适合提交敏感或大量数据。文章还特别用数学例子解释了“幂等”这个关键但难懂的概念:即对同一URL的多次请求,应返回同样结果,这保障了请求的安全性。 最后,文章指出了许多项目未遵循HTTP规范的现状,并自然引出了RESTful架构——它通过将GET、POST、PUT、DELETE分别对应查、增、改、删操作,为这些方法赋予了清晰的语义。这篇内容有助于开发者从规范层面重新审视手头的代码。

本机暂存
IT 2014-12-01 23:46:59 / 累计浏览 4,282

& * # 这三个是什么符号?

这篇讲的是,很多国内程序员都习惯用中文叫那些常见符号——“and符”、“星号”、“井号”,但在国际技术交流中,它们却有另一个名字。作者从一次听国外公开课“彻底懵了”的经历出发,点出了这个细微却影响交流的认知差异。 文章核心就在于“翻译”这三个符号在技术语境下的真正发音和背景:& 其实是 ampersand,它的含义就是“and”;* 的名字是 asterisk,常见于表示脚注;而 # 的英文名是 hash,在英语中既可以表示数字序号(如地址#18),在美国还用作重量单位“磅”(如2# sugar,约两斤糖)。 这篇文章提醒我们,在阅读英文技术文档、观看国际公开课时,理解这些符号的“本名”非常关键。它不光是一个冷知识,更是帮助我们流畅获取一手技术信息的一个小钥匙。

本机暂存