• 【译】理解数组在PHP内部的实现(给PHP开发者的PHP源码-第四部分)

    原文:https://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

    欢迎来到”给PHP开发者的PHP源码”系列的第四部分,这一部分我们会谈论PHP数组在内部是如何表示和在代码库里使用的。

    为了防止你错过了之前的文章,以下是链接:

    第一部分:给PHP开发者的PHP源码-源码结构

    第二部分:理解PHP内部函数的定义

    第三部分:PHP的变量实现

    Read more...
  • 【译】PHP的变量实现(给PHP开发者的PHP源码-第三部分)

    原文:http://blog.ircmaxell.com/2012/03/phps-source-code-for-php-developers_21.html

    在”给PHP开发者的PHP源码”系列的第三篇文章,我们打算扩展上一篇文章来帮助理解PHP内部是怎么工作的。在第一篇文章,我们介绍了如何查看PHP的源码,它的代码结构是怎样的以及一些介绍给PHP开发者的C指针基础。第二篇文章介绍了函数。这一次,我们打算深入PHP最有用的结构之一:变量。

    进入ZVAL

    在PHP的核心代码中,变量被称为ZVAL。这个结构之所以那么重要是有原因的,不仅仅是因为PHP使用弱类型而C使用强类型。那么ZVAL是怎么解决这个问题的呢?要回答这个问题,我们需要认真的查看ZVAL类型的定义。要查看这个定义,让我们尝试在lxr页面的定义搜索框里搜索zval。乍一眼看去,我们似乎找不到任何有用的东西。但是有一行typedef在zend.h文件(typedef在C里面是一种定义新的数据类型的方式)。这个也许就是我们要找的东西,再继续查看。原来,这看起来是不相干的。这里并没有任何有用的东西。但为了确认一些,我们来点击_zval_struct这一行。

    struct _zval_struct {
    /* Variable information */
    zvalue_value value; /* value */
    zend_uint refcount__gc;
    zend_uchar type; /* active type */
    zend_uchar is_ref__gc;
    };
    

    Read more...
  • 【译】理解PHP内部函数的定义(给PHP开发者的PHP源码-第二部分)

    原文:https://nikic.github.io/2012/03/16/Understanding-PHPs-internal-function-definitions.html

    欢迎来到”给PHP开发者的PHP源码”系列的第二部分。

    在上一篇中,ircmaxell说明了你可以在哪里找到PHP的源码,它的基本目录结构以及简单地介绍了一些C语言(因为PHP是用C语言来写的)。如果你错过了那篇文章,在你开始读这篇文章之前也许你应该读一下它。

    在这篇文章中,我们谈论的是定位PHP内部函数的定义,以及理解它们的原理。

    如何找到函数的定义

    作为开始,让我们尝试找出strpos函数的定义。

    尝试的第一步,就是去PHP 5.4根目录然后在页面顶部的搜索框输入strpos。搜索的结果是一个很大的列表,展示了strpos在PHP源码中出现的位置。

    Read more...
  • 【译】给PHP开发者的PHP源码-第一部分-源码结构

    原文:http://blog.ircmaxell.com/2012/03/phps-source-code-for-php-developers.html

    作为一个开发者,我发现在我的日常工作中越来越多地查看PHP的源码。在为了弄清楚奇怪的边界问题和为什么某些问题应该发生的却没有发生而去理解背后究竟发生了什么事情的时候非常有用。在文档缺失、不完整或者错误的情况下也很有用。因此,我已经决定通过一系列的文章来分享我学到的知识,给予PHP开发者们足够的知识去真正阅读PHP的C语言源码。你并不需要有C语言的基础(我们会总结一些基础),但如果有的话会更有帮助。

    这是这个系列的第一篇文章。在这篇文章,我们会谈论PHP程序的基础:在哪里找到它,基本的代码结构和一些最基础的C语言概念。需要说明的是,这一系列文章的目标是获得源码的阅读理解能力。这意味着为了过一下某些点,某些概念会被简化而不是太复杂的描述。这不会给阅读造成明显的差异,但如果你想为源码做贡献,则还有更多的知识需要补充。在我做简化的时候,我会尽量指出这些简化。

    Read more...
  • 在OpenSUSE下编译安装Nginx

    下载源码

    在nginx官网上选择稳定的版本Nginx。解压到/usr/local/src/目录。

    笔者使用的是nginx-1.9.9。

    准备工作

    进入/usr/local/src继续操作)

    编译安装pcre库

    下载:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

    安装:

    Read more...
  • 【PDO扩展】lastInsertId函数返回0的原因

    问题

    在使用PHP的PDO扩展插入数据的时候,有时候需要获取到最后插入记录的ID作为返回信息。要怎么才能实现这个需求呢?

    lastInsertId函数

    使用PDO的lastInsertId函数。

    但是,最近在使用的过程中发现有时候lastInsertId函数返回的是0。为什么会这样呢?

    先来看看lastInsertId函数在PHP手册上的说明。

    Read more...
  • 【译】更快的方式实现PHP数组去重

    原文:Faster Alternative to PHP’s Array Unique Function

    概述

    使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组。这个函数大多数情况下都能工作得很好。但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些。

    有一个比较好而且更快的函数array_flip()来替代使用array_unique()函数来创建唯一的数组。这个魔法般的函数会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,你会得到跟array_unique()函数一样的结果。

    更快的方式实现PHP数组去重

    Read more...
  • 迟到的2015总结

    2015年,是真正出来参与工作的一年,没有激昂的情绪,没有忙成狗的节奏,但有健康的生活,有充实的生活。

    工作

    这一年,结束了学生生涯。毕业了。开始真正出来工作了,从实习第一天起,导师就跟我说,团队准备做一个从无到有的项目,要做好加班的心里准备,顿时吓得我开始发慌了。刚开始确实疯狂加班加了一个月,一个多月后项目上线了,由于各种原因,项目要交接出去了。原有团队也走了好几个,最后连主管都走了。后来团队就准备交接项目,然后接手其他项目,交接过程中比较漫长,中途找了一些业余时间研究了一些东西,分别有知乎爬虫切换Hosts项目设计模式学习与实现。总的来说,这一年的进步比起自己在学校的时候要大,但是比起工作任务很多的小伙伴们,还是进步地太慢了。

    Read more...
  • 如何在openSUSE42.1下编译安装PHP7

    首先推荐一篇文章PHP 7 Release Date Arrived: Will Developers Adopt PHP 7? - PHP Classes blog

    里面说到是否会去使用PHP7,就个人而言,我是毫不犹豫地使用的,但是生产环境就不是我说了算,所以只能自己在自己的开发环境里更新PHP的版本。那么,你呢?

    笔者使用的是Linux的openSUSE42.1发行版,Yast里面还没有PHP7的安装包,于是乎只能自己手动编译安装了。作为一个PHP开发者,我是非常希望能够学会编译安装PHP7的,之前试过几次,但是每次安装都要上网找各种资料,于是乎,这次安装成功后就想把自己的安装过程以及遇到的问题记录下来,方便以后查阅和分享给需要的人。

    下载源码并解压

    进入正题,要编译安装PHP7,首先当然要下载PHP7的源码。你可以到github上clone,也可以到PHP官网下载。下载后解压到/usr/local/src目录,并将目录重命名为php7。进入目录。

    Read more...
  • 【nginx配置】nginx做非80端口转发

    一个场景

    最近在使用PHP重写一个使用JAVA写的项目,因为需要查看之前的项目,所以要在本地搭建一个Tomcat来跑JAVA的项目。搭建成功后,因为Tomcat监听的端口是8080,因此,访问的URL前缀是localhost:8080,每次访问项目的时候都要先输入这一串内容,感觉比较繁杂,所以想着将其变成localhost来访问,但是这样的话就是访问80端口了,要达到目的,就得做端口转发。笔者见识比较少,暂时想到的是使用Nginx/Apache等程序做转发。如果有更好的方案,欢迎指教。

    Read more...