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

标签:php

共 543 篇相关文章

IT 累计浏览 2,961

php 去掉 头尾   空格 2种方法

这篇讲的是PHP开发中一个常见但容易踩坑的问题:如何高效去除字符串头尾的空白字符,特别是那些由 生成的特殊空格。文章作者从实际编码困境出发,指出直接使用trim()函数无法处理 这种HTML实体编码的空格,因为它并非标准空白符。 文章核心提供了两种解决方案并做了比较。第一种是使用preg_replace正则替换,通过匹配头尾的 和\s来实现通用去除,作者特别推荐了这种方法。第二种是结合html_entity_decode先解码实体,再用trim配合UTF-8空格字符(chr(0xc2).chr(0xa0))进行去除。 作者进一步指出了编码兼容性的关键细节:第二种trim方法在UTF-8下工作良好,但在GBK或GB2312编码中可能引发乱码,同时也会影响json_encode对中文的处理。因此,文章最终给出了明确建议:在现代Web开发中,推荐统一使用UTF-8编码以避免此类陷阱。整个解析从问题现象到原理,再到具体实现与环境考量,非常贴近实际开发场景。

IT 累计浏览 3,386

PHP 用 curl 读取 HTTP chunked 数据

这篇讲的是在PHP中使用curl处理流式HTTP chunked数据时,遇到的一个实际坑点与解决方法。当需要实时处理服务器推送的每个数据块(比如对接icomet这类服务)时,开发者自然想到使用`CURLOPT_WRITEFUNCTION`回调。但实际会发现,一个逻辑上的chunk数据,回调函数可能会被多次触发,每次只收到大约16k的片段,破坏了数据的完整性。 文章指出了问题的根源:curl底层传输机制导致回调被分割,而非按应用层chunk边界返回。作者给出的解决方案巧妙且实用:在回调函数内维护一个静态缓冲区,将每次收到的片段拼接起来,并以特定分隔符(如`\n`)为界进行分割,确保每次只处理一个完整的应用层数据块。这种方法兼顾了实时性与数据完整性,是处理此类流式接口时一个值得借鉴的细节技巧。

IT 累计浏览 3,479

一个Laravel队列引发的报警

作者从一次诡异的服务器报警说起:集群中某台服务器内存飙高,但通过常规命令却查不到内存大户。通过对比不同服务器的进程列表,线索最终指向了 Laravel 队列。 深入排查后发现,问题的根源并非进程自身,而是 Laravel 队列在默认的监听模式下,其子进程会频繁重启。每次重启都会创建并删除大量临时文件,导致 Linux 系统内核中的 dentry 缓存(目录项缓存)被急剧撑大,从而“吃掉”了大量内存。文章通过 strace 跟踪清晰地捕捉到了这一过程。 针对这一问题,作者提供了两个层面的解决方案:一是应用层面,强烈推荐启用 Laravel 队列的守护进程模式,避免不必要的进程重启;二是系统层面,在无法避免频繁文件操作时,可以通过调整内核参数如 `vfs_cache_pressure` 来尝试缓解。整篇文章完整展现了从现象入手,借助工具抽丝剥茧,最终定位到内核缓存层面问题的精彩排查思路。

IT 累计浏览 1,935

ghost改掉默认首页

这篇讲的是如何在一个Ghost博客的域名下,同时运行PHP页面并替换默认首页。 作者遇到的实际需求是让同一域名既支持Ghost博客,又能运行PHP,且PHP页面作为首页。他没有选择复杂的插件或二次开发,而是用Nginx反向代理的经典思路巧妙解决:将Ghost改到8080端口运行,Nginx在80端口接收所有请求,并通过配置精准分流——所有`.php`请求交给PHP解释器处理,其余请求则代理回Ghost。 文章给出了完整的Nginx配置文件片段,清晰地展示了`location`块如何通过不同规则实现请求转发。针对如何让Ghost的博客列表出现在新的`/blog/`路径下,作者还演示了利用Ghost Public API和模板引擎的`{{#get}}`助手,新建静态页并修改主题文件来实现的步骤。 这是一份从端口规划、服务部署到前端模板修改的完整操作记录,对需要在同一Web服务器上混合部署不同应用(如Node.js与PHP)的开发者有直接的参考价值。

IT 累计浏览 2,183

iphp 框架增加 lazyload 特性

这篇讲的是iphp框架如何通过引入lazyload特性来解决一个常见的性能优化问题。 作者从基类设计的便利性出发,指出现实中的痛点:为了使用方便,基类通常会一次性加载所有可能用到的属性到Context对象中。但这会导致不必要的数据库查询,造成性能浪费。为了解决这个问题,作者实现了`Context::lazyload()`方法。 核心思路非常巧妙:它允许开发者声明一个属性,并绑定一个回调函数。这个属性只有在第一次被实际访问时,才会触发回调函数去执行真正的数据加载(比如查询数据库)。如果整个请求流程中该属性从未被使用,则完全不会产生开销。文章通过一个具体的`AppController`示例清晰地展示了这一机制:`account`属性被延迟加载,只有在子类中需要用户账户信息时,才会去查询,否则不会发生任何数据库请求。 通过这种方式,iphp框架将资源的加载控制权交给了实际的使用场景,在保持代码简洁性的同时,显著提升了应用的响应速度和资源利用效率。

IT 累计浏览 1,842

Joomla反序列化漏洞的查漏补缺

当2015年Joomla曝出高危的反序列化漏洞时,安全社区迅速展开了分析。但这篇来自绿盟科技的技术复盘,却质疑了当时主流分析中的一个共识——“漏洞源于Joomla自定义了SESSION序列化机制”。作者通过源码分析指出,Joomla虽然注册了自定义的session处理函数,但其write方法并未改变PHP默认的序列化格式(键名+竖线+serialize值)。问题根源不在于此。 文章随后将矛头指向了更底层的问题:PHP本身的SESSION序列化处理器配置。它引用ryat的经典研究,说明当系统配置中写入SESSION(如php_serialize处理器)与读取SESSION(如php处理器)使用了不同的处理器时,会导致数据解析出错,从而触发反序列化对象注入。Joomla的漏洞正是利用了这种配置不一致。 这篇文章的价值在于“查漏补缺”,它引导读者跳出对应用层“奇技淫巧”的讨论,重新审视PHP底层机制本身可能埋下的坑。对于安全研究者和开发者而言,这是一个重要的提醒:漏洞的根源有时藏在更基础的依赖配置之中。

IT 累计浏览 3,008

PHP扩展迁移为兼容PHP7记录

这篇讲的是PHP7扩展开发中,由于内核API的多项变更,在迁移旧版扩展代码时需要处理的兼容性问题。作者详细记录了多个具体函数签名的变化与修正方法。 核心问题在于PHP7对底层进行了重构。很多常用函数如`add_assoc_stringl`、`RETURN_STRINGL`的参数个数减少了;`zval`变量的内存分配方式从堆(使用`ALLOC_INIT_ZVAL`)改为栈(直接声明`zval sarray_l;`)。此外,类型系统也发生了变化,例如布尔类型`IS_BOOL`被拆分为`IS_TRUE`和`IS_FALSE`,相关的宏`Z_BVAL`和`Z_TYPE_PP`也不再存在。 文章还解决了一些编译错误,例如缺少`INT64_MAX`定义时需要手动添加`#include `和相关宏定义;对于字符串,需使用`ZSTR_VAL()`宏将新的`zend_string`类型转换为传统的`char*`;在创建对象时,需要自定义一个`fetch_object`函数来替代旧的`zend_object_store_get_object`。 对于正在迁移或维护PHP扩展的开发者来说,这些来自一线的“踩坑”记录,清晰地指出了代码调整的具体方向,提供了实用的排查和修改参考。

IT 累计浏览 3,661

PHP7扩展开发之hello word

这篇讲的是如何从零开始构建一个PHP7扩展,并让PHP脚本调用其中的函数输出“hello word”。作者以最简功能为例,拆解了扩展开发的核心步骤:从使用 `ext_skel` 工具生成骨架代码,到修改 `config.m4` 配置文件启用扩展,再到编写 C 代码实现 `say` 函数并将其注册到PHP函数表中。 整个过程清晰展示了扩展从代码到加载的完整链条,尤其是 `config.m4` 中注释配置的选择,以及函数注册这一步骤,是理解PHP扩展工作原理的关键。文章最后给出了编译安装和测试验证的完整命令,并附上了源码下载,适合想动手实践PHP底层开发的读者按图索骥。

IT 累计浏览 1,999

非侵入式监控PHP应用性能监控分析

这篇讲的是如何在不触碰业务代码的前提下,对PHP应用进行性能监控。作者从“非侵入”这个实际需求出发,给出了从易到难的两种可行路径。 对于基础的请求耗时监控,最简单的方式是分析Nginx日志。文章清晰解读了日志中两个关键字段的区别:`$request_time`是端到端的总耗时,而`$upstream_response_time`则精准反映后端PHP处理的耗时。只需关注后者,就能快速定位PHP服务本身的性能瓶颈。 如果要深入分析单个请求内部的性能热点,文章详细介绍了使用xhprof扩展的完整方案。它不仅提供了xhprof的安装与配置步骤,其亮点在于展示了一套“无侵入”的部署技巧:通过Nginx的`auto_prepend_file`或php.ini配置,让监控脚本自动加载,实现了对业务代码的零修改。同时,方案还内置了按URL和超时时间智能采样的逻辑,避免了全量监控带来的性能开销。 整篇文章从日志层面的快速概览,到代码执行层面的精准剖析,形成了一套层次分明的监控方法论,为PHP开发者提供了实用的性能分析工具箱。

IT 累计浏览 2,979

白话PHP7扩展开发之创建对象

这篇讲的是在PHP7扩展开发中如何创建一个对象。作者很巧妙地将这个过程比喻为一个孩子从“出生”到“成长”的完整历程,让底层C语言的实现步骤变得直观易懂。 文章将创建对象拆解为几个清晰的阶段:首先定义`zend_class_entry`这个“原型”,相当于“办准生证”;接着用`INIT_CLASS_ENTRY`给对象“取名”并声明方法;然后通过`zend_register_internal_class`完成“上户口”登记。这之后,才是为对象“培养”能力——包括使用`zend_declare_property_*`系列方法定义属性(教授知识),以及通过`zend_function_entry`数组来注册具体的方法(培养行为能力)。 文章的亮点在于,它没有停留在概念阐述,而是紧贴每一个比喻阶段,给出了对应的、可运行的C代码片段。从声明内存属性到定义一个能接收参数的`learn`方法,最终汇聚成一份完整的扩展源代码。文末还附上了PHP端的调用示例和输出结果,让整个流程形成闭环。对于想动手实践的读者,作者直接提供了完整的源代码下载链接。

IT 累计浏览 4,741

让PHP7达到最高性能的几个Tips

这篇讲的是PHP 7性能调优的实战经验。作者(鸟哥)指出,尽管PHP 7性能相比前代已有大幅提升,但通过一系列精准的配置和编译优化,还能进一步榨取其潜力。文章提供了五个具体可操作的Tips。 核心建议包括:**务必启用Zend Opcache**(PHP 7未启用时已比PHP 5.6启用后快,但开启后仍有收益);**使用GCC 4.8以上版本编译**,可获得约5%的性能提升;**配置HugePage**以减少TLB Miss;以及开启**Opcache File Cache**(实验性)和针对特定项目使用**PGO(Profile Guided Optimization)** 进行定制化编译优化。 这些方案从基础配置到高阶编译技巧层层递进,作者通过WordPress等实例说明了PGO等优化如何为特定应用带来量身定制的性能提升,为追求极致PHP性能的开发者提供了清晰的技术路线。

IT 累计浏览 2,220

让你的PHP7更快之Hugepage

这篇讲的是PHP7的RC4版本如何通过启用Hugepage特性来提升执行性能。作者从虚拟内存分页的基础问题出发,指出默认4KB页面在地址转换时需要频繁查表,CPU的TLB缓存有限,导致Cache Miss拖慢效率;而启用2MB的Hugepage能减少TLB条目数,间接降低这种开销。文章核心是指导读者实操:编译PHP7时保持默认选项(不要加-disable-huge-code-pages),在php.ini中配置opcache.huge_code_pages=1,并通过sysctl分配系统Hugepages。作者的测试显示,在WordPress上能稳定获得2%~3%的QPS提升,效果显著。 不过,文章也提到

IT 累计浏览 2,943

nodejs中文md5与php结果不一致

作者在做流量接口时遇到了一个典型的跨语言互操作问题:Node.js和PHP对同一段中文字符串进行MD5加密,竟然产生了不同的结果,直接导致签名校验失败。而英文字符串则能通过,说明问题根源并不在算法本身。 经过排查,确认这是字符编码差异导致的经典坑点。Node.js的`crypto`模块在计算哈希时,如果没有显式指定输入字符串的编码,默认可能使用与PHP不同的字符集进行字节转换,从而生成不同的MD5值。文章给出了一个简洁的修复方案:在调用`instance.update()`方法时,第二个参数明确传入`'utf8'`,强制使用统一的UTF-8编码。 这个小坑的解决成本虽低,但排查时容易让人迷惑。作者通过实践验证了显式编码指定的必要性,确保了不同语言栈间哈希结果的一致性,为处理多语言环境的签名验证提供了直接参考。

IT 累计浏览 3,310

线上PHP问题排查思路与实践

这篇文章来自一位资深工程师在技术大会上的分享,系统地梳理了线上PHP问题的排查方法论。作者从最让用户头疼的“裸奔错误页面”切入,指出工程师需要看到502错误背后PHP-FPM进程失效等深层原因。 其核心思路是一个清晰的四步闭环:先恢复服务(通过摘机、回滚、重启或降级等手段),再保留现场(像警察保护案发现场一样记录日志与系统状态),接着排查问题(结合PHP内核、网络协议等知识和工具分析数据),最后验证结果。作者强调,恢复与保留往往同步进行,例如用gcore保存进程core文件后立即重启。 文章还分享了三个来自不同层面的实战案例,包括用tcpdump排查MySQL TPS飙升、追查导致CPU100%的PHP进程,以及一个由echo引发的系统崩溃。文末附有PPT下载,可供深入研习这套从理论到实践的完整排查框架。

IT 累计浏览 3,288

在PHP中使用协程实现多任务调度

这篇讲的是如何用 PHP 5.5 引入的生成器与协程特性,来实现协作式多任务调度。文章先从迭代生成器(如用 `xrange` 替代 `range` 避免大数组占内存)说起,阐明了生成器本质是一种“可中断的函数”,`yield` 既是中断点也是通信端口。 在此基础上,作者进一步解释了协程如何通过 `send()` 方法实现双向通信。但文章的真正重点是最终的多任务调度方案:作者定义了一个 `Task` 类来包装协程,通过一个 `beforeFirstYield` 标志位巧妙解决了首次调用时可能跳过第一个 `yield` 值的隐患。另一个 `Scheduler` 类则负责管理这些任务,用一个队列来调度它们的执行。 整个实现的巧妙之处在于,它将“协程主动让出控制权(通过 `yield`)”这一特性,转化为“任务协作”的核心机制,从而在单线程内模拟出并发运行多个任务的效果。文章最后点明,这种协作模式完全依赖任务自身的良好协作,这与操作系统中可能强制切换的抢占式多任务形成了鲜明对比。对于想在 PHP 中实现轻量级并发或理解协程底层思想的开发者,这是一个非常清晰且动手性很强的范例。

IT 累计浏览 6,867

nginx上,http状态200响应,PHP空白返回的问题

这篇讲的是在Nginx+PHP-FPM环境中,一个颇为诡异的故障:PHP脚本返回HTTP 200状态码,但页面内容却完全为空白。作者从朋友的一个求助问题出发,记录了完整的排查与解决过程。 故障排查从怀疑PHP扩展冲突开始,但尝试关闭xdebug等扩展后问题依旧。通过`strace`分析系统调用,作者捕捉到了关键的线索——FastCGI请求包中,竟然缺少了必需的`SCRIPT_FILENAME`变量。这导致PHP-FPM无法定位和执行真正的PHP脚本文件。 文章随后深入PHP-FPM源码,解释了当`SCRIPT_FILENAME`缺失时,其内部的处理逻辑正是直接返回一个空的响应体。问题的根源随之清晰:Nginx在将请求转发给PHP-FPM时,没有正确传递这个关键变量。最终,通过调整Nginx的FastCGI配置,确保`SCRIPT_FILENAME`被正确设置,问题得以解决。这篇记录不仅解决了一个具体问题,也揭示了Nginx与PHP-FPM交互协议中一个容易被忽略的细节,对于排障思路的梳理很有启发。

IT 累计浏览 3,524

良好的书写规范提高PHP代码执行效率

这篇讲的是 PHP 开发中那些容易被忽略的编码习惯如何显著影响代码执行效率。作者从最基础的字符串引用开始,对比了单引号与双引号的性能差异——前者因不解析变量而更快。接着深入到函数调用、循环结构与变量操作等细节,比如用 `isset()` 替代 `strlen()` 检查字符串长度、`++$i` 比 `$i++` 更快(因指令数更少),以及循环内避免声明大变量等具体建议。 文章的核心在于揭示了“书写规范”背后隐藏的性能代价。例如,它指出递增对象属性比递增局部变量慢3倍,而未定义的局部变量递增速度则慢了近10倍。这些量化对比让优化方向变得非常清晰。此外,内容也超越了代码层面,提及了服务器配置(如开启 mod_deflate)、使用 memcached 缓存以及精简面向对象设计等架构性建议。 总的来说,它系统地梳理了从微观语法到宏观结构的一系列性能优化点,强调了许多看似微小的“规范”选择,实则是提升PHP应用响应速度和资源利用效率的关键。

IT 累计浏览 2,307

php 跨域 form提交 2种方法

这篇讲的是如何解决PHP开发中一个常见但棘手的问题:如何实现跨域的表单数据提交。作者从安全策略限制了直接跨域访问的现实背景出发,提供了两种实用的解决方案。 第一种是纯服务端方案,核心是封装一个基于PHP curl的函数。它模拟了客户端发起POST请求的过程,直接在服务器端完成数据的跨域递交。文章中贴出了具体的函数代码,展示了如何拼接参数、设置curl选项并获取返回值,思路清晰直接。 第二种则是当前更主流的前端+后端配合方案。前端通过引入jquery.form.js插件,用ajaxSubmit方法异步提交表单,从而绕过浏览器的同源策略。关键点在于后端PHP代码需要配合设置`Access-Control-Allow-Origin`响应头,明确允许来自指定域名的跨域请求。文章也贴心地给出了允许所有域名或仅允许特定域名的两种写法示例。 总的来说,文章对比了两种风格的实现路径:一种是服务端“代理转发”的经典思路,另一种是前后端协商、利用现代浏览器CORS机制的方案。开发者可以根据项目的实际环境和技术栈,选择更合适的一种来实现跨域数据提交。

IT 累计浏览 2,209

nginx的SCRIPT_NAME, PATH_INFO多了index.php问题

这篇讲的是nginx配置中一个常见的坑:在设置反向代理后,PHP获取到的`SCRIPT_NAME`和`PATH_INFO`变量不正确,把整个URI路径都带上了。比如访问`/index.php/site/login`时,`SCRIPT_NAME`本应是`index.php`,却拿到了完整的路径字符串。 作者定位到问题出在正则表达式定义的`location`块配置不完整。核心解决思路是,需要将请求的URI明确拆解为“脚本文件名”和“附加路径信息”两部分。通过新增一个专门匹配`.php($|/)`的`location`块,并利用正则捕获组`"^(.+.php)(/.+)"`,就能精准地把`index.php`赋值给`$script`,把后面的`/site/login`赋值给`$path_info`。 最终,通过`fastcgi_param`指令将正确拆解后的值传递给PHP处理,使得`$_SERVER['SCRIPT_NAME']`和`$_SERVER['PATH_INFO']`能获得预期的值,保证了框架路由能正常工作。这个配置方法清晰地展示了如何在nginx层面解决路径解析歧义。

IT 累计浏览 1,433

php正则修饰符整理

这篇讲的是PHP正则表达式中那些容易被忽略却至关重要的修饰符。作者从实际开发经验出发,系统梳理了i、m、s、x、e、U等十余个修饰符的功能与适用场景。 文章重点辨析了几个常用修饰符的关键差异:比如`i`忽略大小写、`m`让`^`和`$`能匹配行首行尾、`s`让点号能匹配换行符、`e`则允许对匹配结果执行代码。同时,它也提醒了一些注意事项,例如在启用`m`时`D`修饰符会被忽略。 特别值得关注的是,作者指出了`u`修饰符(强制UTF-8编码)在UTF-8环境中可能引发特定Bug,并给出了相关警告。这些细节是理解PHP正则底层行为的关键。 虽然这些修饰符在日常开发中未必频繁使用,但精准理解它们,能让你在处理复杂文本匹配时写出更简洁、高效的正则表达式。