PHP Internals Book 中文版 – Zvals – 基础结构

基础结构一个 zval(“Zend value”的缩写)代表一个任意类型的 PHP 变量。所以,它很可能是 PHP 中最重要的数据结构,同时你将会频繁地使用它。本章节讲述zvals的基础概念及其使用方法。类型和值每一个 zval 都会存储某个值和其对应的类型。这点非常重要,因为 PHP 是一门动态类型语言,所以变量的类型只有当运行时才会确定,并不是在编译时就能够确定。此外,zval 的类型在其生命周期是可以改变的,所以如果这个 zval 在最初存储了一个整形,那么在之后的某个时间点他也可能会存储了一个字符串。 类型是存储在一个整形的标签中(一个 unsigned char 类型的变量)。它有 8 中类型的值,分别对应着 PHP 中的 8 中变量类型。这些值可以用诸如 IS_TYPE 形式的常量来使用。比如:IS_NULL 对应 null 类型,IS_STRING 对应字符串类型。真实的值是存储在一个联合体中,如下所示... Read More

PHP Internals Book 中文版 – Zvals

Zval本章节的主题为用来表达 PHP 变量的 zval 数据结构。我们将会围绕 zvals 的概念和如何在扩展开发中使用两方面来进行阐述。目录基础结构类型和值访问宏赋值内存管理值语义和引用语义引用计数和写时复制分配并初始化 zval管理引用计数和 zval 销毁复制 zval分离 zval类型转换和操作符基础操作符比较类型转换 Read More

PHP Internals Book 中文版

你看到的是 PHP 内核中文版,翻译自 PHP Internals Book。为什么要翻译对技术的饥渴对英语的热爱方便汉语作为母语的人学习交流官方网站PHP Internals BooGithub(更新最快https://github.com/huxiaoxu2019/php-internals-book-in-chines关于作者Hu Xiaox内容目录IntroductioUsing the PHP build systeBuilding PHBuilding PHP extensionCreating PHP extensionZvalBasic structurMemory managemenCasts and operationImplementing functionHashtableBasic structurHashtable APSymtable and array AP... Read More

工作效率之动态 IP 域名化篇

在公司里,RD 们不免会使用一些代理服务来进行抓包操作。那么就需要获取代理服务器(一般为自己的电脑)的内网 IP。然而,这个内网 IP 并不是固定不变的。所以,每次配置代理 IP 时就略显麻烦。那么,下面就来聊聊如何解决这个尴尬,提升效率。方案将非固定 IP 实时解析到域名中。利用阿里云的域名解析开发者 API 进行定时的更新。其中的定时用本机(Mac)的 Launchd 实现(类似 Linux 下的 Crontab)。原材料Mac(或者 Windows 但本文仅谈及 Mac 配置方法域名(如 ihuxu.com如果没有域名可以到 freenom.com 中注册一个免费域名,然后将其 DNS 切到阿里云免费的 DNS 云解析服务中即可。阿里云账号利用阿里云提供开发者的 DNS 管理相关的 AP步骤下载阿里云 SDK & 编写代码库:https://github.com/ali... Read More

小型网站架构降 Apache 与 MySQL 内存占用比率

前言这篇文章以我的阿里云服务器为例(你眼前的博客正是搭在这个服务器上),阐述下小型网站(Linux+Apache+MySQL+PHP)对于内存利用率提升的配置方法的一个点。正文我的服务器是阿里云的,在一年前由于数据库(MySQL)频繁内存不足宕机就“潇洒”地升级了配置到2G内存。所以,目前机器的配置如下CPU: 1核内存: 2048 MB操作系统: CentOS 6.5 32位公网IP: 115.28.36.19带宽计费方式: 按固定带宽当前使用带宽: 1Mbp同时,正常使用情况下的内存使用情况如下linux 内存 mysql 与 apache 占用图中显示 MySQL 占用 440m,Apache 占用 44m。当然,这是MySQL 服务和 Apache 服务刚刚重启后的情况。实际的内存占用会比这大,因为随着业务的进行,会进行 Cache 的累积,最后导致整体的使用内存增大。下面分别调整 MySQL 和 Apache 的配置文件。... Read More

在 Linux 下通过 strace 与 lsof 命令排查 PHP 异常进程

在有些时候,会遇到 PHP 进程异常卡死的情况。面对这种情况,首先考虑到的就是分析代码进行优化改进,或者重启进程。但是,这种方式来排查不一定能找到根本原因。因为有些时候异常 PHP 进程卡死的原因可能是非常奇葩的问题,比如外部资源异常如 DB、Redis 或第三方 API 等。上一次关于超级话题签到提醒定时任务 PHP 进程异常的处理,问题竟然出现在外部的 DB 的链接上。由于网络原因导致读取 DB 没有响应卡死。这一次情况比较严重,超级话题积分系统的计算有一部分是通过 Trigger(类似队列)接受全站数据进行积分计算与入库。由于用户反馈问题,来到队列机查看进程情况。如下$ ps -ef | grep Trigger | grep Commenwww 10693 1 7 16:06 ? 00:04:09 /usr/local/bin/php /path/cli.php request... Read More

自从有了她,再也不怕断签了:超级话题签到提醒

前言在解决了上一次关于超级话题积分bug后,又接到超级话题签到提醒的产品需求。这是一篇偏于技术实现的文章,讲述的比较笼统,业务围绕超级话题的签到提醒进行展开。如果,您对超级话题签到提醒的技术背景与实现感兴趣,那么这篇文章希望对你有帮助。当然,如果你是某个超级话题的超级粉丝,比如鹿晗,张艺兴,但是发现断签了。那么我非常替你感到“痛心”,因为目前超级话题没有补签功能。当然,如果你觉得是因为系统问题导致没有连续签到,那么你可以通过超级话题的官方反馈方式进行反馈来解决问题。当然,我劝你这么做之前一定要三思。因为,通过我排查的经验而言,基本山是由于你们(用户)把时间搞错了,而导致没有续签。而且,目前的签到提醒功能会在每天晚上提醒你签到的哦产品最近,在忙活超级话题的签到提醒产品的开发。首先,这是第一次比较热切的关注用户反应的产品。虽然说,对于产品的参与和认知并没有多么深入的理解,但是愈发的觉得这件事... Read More

PHP 的 Traits:到底是祸害还是好得飞起?

在 2012 年 3 月初,PHP 团队宣布了 5.4 版本的发布。程序员们对这次的发布已期待许久,因为这一次的升级带来了很多特性的加入。其中,最受追捧的是 Traits。为了构建这次发布的版本,Shammer C 特意为此撰写了一篇文档:如何使用 PHP 的 Traits,我强烈的建议您在读这篇文章之前拜读一下,因为这篇文章需要读者能够对 Traits 有一定的基础了解。Traits 已经被 PHP 社区广泛的接受,最为关键的是因为它包含了其他 Java、C++ 和 Python 编程语言的特性。除此之外,Traits 也被广大的网友们神化了。那些程序员狂砍这种特性将给他们的项目带来多么大的益处,尤其指出它是能够替代面向对象(OOP)继承的特性。然而,Traits 真的有那么神奇么?难道真的能对 PHP 开发有所促进么?还是败絮其中呢?PHP 的 Traits 是个祸害从表面上来看,由于... Read More

深入 MySQL 用户自定义变量:使用详解及其使用场景案例

一、前言在前段工作中,曾几次收到超级话题积分漏记的用户反馈。通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上。计数器的值会影响用户当前行为所获得积分的大小。比如,当用户在某超级话题下连续第 n(n 即计数器的值)次进行转发帖子时,将会获得与 n 相关的分数。然而,在第一次改进后问题依然存在。所以,这次在之前的基础上,通过使用 MySQL 变量的途径来解决该问题。二、到底 MySQL 的变量分哪几类?MySQL变量一共分为两大类:用户自定义变量和系统变量。如下用户自定义变量局部变量会话变量系统变量会话变量全局变量本文涉及的内容为用户自定义会话变量,若对其他分类无感,请点击这里。PS:用户定义的会话变量和系统定义的会话变量有什么区别?局部变量局部变量一般用于 SQL 的语句块中,比如存储过程中的 begin 和 end 语句块。其作用域仅限于该语句块内。生命周期也仅限于该存储过... Read More

基于 libgit2 C 语言库的 php-git 扩展 fix bug 辛酸史

前言这是一篇极其没有节(nei)操(rong)的文章。除非你真的无聊,请不要阅读,否则后果自负正文最近,在忙活微博话题组的日构建工具。工具主要的功能并不算复杂。写着写着,外面雨过天晴,居然还放起爆竹了,什么鬼。构建工具的主要功能正如介绍中所述的那样,提取产品、测试等基本信息、提取版本库(git)信息、检查(编译)源文件、自动部署项目与发送邮件等。在提取 git 库信息时,相对于之前利用 shell_exec PHP 原生函数提取 svn 信息的方式,打算利用扩展来提取信息。一来更规范、更有效率(微乎其微),二来专业。缺点是相对而言部署环境麻烦,因为需要安装 git 扩展到当前 php 运行环境中来。但是,万万没想到官方推荐的 php-git 扩展库开发版本已有3年没有维护了。索性用吧,又能怎样。安装还算顺利,由于公司开发机没有 cmake,yum 源也不可用,懒得配置,直接 downlo... Read More