PHP
文章平均质量分 75
stevsun
Keep calm and carry on
展开
-
PHP数组的底层结构
PHP数组数组是PHP中非常强大、灵活的一种数据类型,它的底层实现为散列表(HashTable,也称作:哈希表),除了我们熟悉的PHP用户空间的Array类型之外,内核中也随处用到散列表,比如函数、类、常量、已include文件的索引表、全局符号表等都用的HashTable存储。散列表是根据关键码值(Key value)而直接进行访问的数据结构,它的key - value之间存在一个映射函数,...转载 2020-03-27 22:41:27 · 2236 阅读 · 0 评论 -
PHP变量的底层结构
PHP变量变量是一个语言实现的基础,变量有两个组成部分:变量名、变量值,PHP中可以将其对应为:zval、zend_value,这两个概念一定要区分开,PHP中变量的内存是通过引用计数进行管理的,而且PHP7中引用计数是在zend_value而不是zval上,变量之间的传递、赋值通常也是针对zend_value。PHP中可以通过关键词定义一个变量:关键词定义一个变量:关键词定义一个变量:a;,...转载 2020-03-27 22:27:28 · 573 阅读 · 0 评论 -
PHP7扩展开发之依赖其他扩展
前言有的时候,我们的扩展要依赖其他扩展。比如,我们PHP的mysqli扩展就依赖mysqlnd扩展。这中情况下,我们怎么使用其他扩展呢?这个就是本文讲述的内容。 我们新建立一个扩展,名字叫 demo_dep , 依赖之前的say扩展。 在demo_dep扩展中,我们实现demo_say方法。这个方法调用say扩展的say方法。代码基础代码确保say扩展的头文件正确安装到了p转载 2018-01-10 23:47:27 · 1867 阅读 · 1 评论 -
PHP7扩展开发之使用静态库
前言在本文,我们将建立一个简单的lib静态库,并在扩展中进行封装调用。代码基础代码这个扩展,我们将在say扩展上增加show_site_ar()。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。代码实现建立lib库 增加hello.h文件。代码如下:#ifndef TEST转载 2018-01-10 23:39:28 · 1080 阅读 · 0 评论 -
PHP7扩展开发之函数方式使用lib库
前言首先说下什么是lib库。lib库就是一个提供特定功能的一个文件。可以把它看成是PHP的一个文件,这个文件提供一些函数方法。只是这个lib库是用c或者c++写的。使用lib库的场景。一些软件已经提供了lib库,我们就没必要再重复实现一次。如,原先的mysql扩展,就是使用mysql官方的lib库进行的封装。在本文,我们将建立一个简单的lib库,并在扩展中进行封装调用。代码转载 2018-01-10 23:27:39 · 906 阅读 · 0 评论 -
PHP7扩展开发之对象方式使用lib库
前言上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下:<?php$hello = new hello();$result = $hello->get();var_dump($result);?>我们将在扩展中实现hello类。hello类中将依赖lib库。代码基础代码这个扩展,我们将在say扩展上增加相转载 2018-01-10 20:44:41 · 993 阅读 · 0 评论 -
PHP7扩展开发之流操作
前言啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下:function list_dir($dir) { if (is_dir($dir) === false) { return; } $dh = opendir($dir);转载 2018-01-10 20:30:23 · 492 阅读 · 0 评论 -
PHP7扩展开发之配置项
前言我们经常使用的一些扩展,有的会在php.ini文件中会有一些配置项。这些配置项控制扩展的行为。如 opcache扩展,经常使用的配置项如下:[opcache]; 模块地址zend_extension=opcache.so; 开关打开opcache.enable=1; 开启CLIopcache.enable_cli=1; 可用内存, 酌情而定, 单位为:Mbopcache.memo转载 2018-01-10 20:25:34 · 1007 阅读 · 0 评论 -
PHP7扩展开发之函数调用
前言在这篇文章中我们将演示如何在扩展中调用函数,和调用对象的方法。代码示例如下:class demo { public function get_site_name ($prefix) { return $prefix."信海龙的博客\n"; }}function get_site_url ($prefix) { return $prefi转载 2018-01-10 12:46:42 · 1368 阅读 · 0 评论 -
PHP7扩展开发之类的创建
本篇文章主要将如何在扩展中创建一个对象。创建的对象的过程,其实和一个小孩出生,成长的过程有些类似。第一步,办准生证生孩子第一步,先办准生证。声明我要生孩子了。对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可。代码如下:zend_class_entry ce;zend_class_entry 是啥?可以认为它使一个原型,定义了一些对象应该有转载 2018-01-10 10:04:39 · 1020 阅读 · 0 评论 -
PHP7扩展开发之创建变量
前言在这篇博文中我们将演示如何在PHP扩展中创建一个变量。示例代码如下:<?phpclass demo {}$lng = 2;$str = "abc";$arr = array(1,'a' => 'b');$obj = new demo();var_dump($str);var_dump($arr);var_dump($obj);?>中间的三行我们将用PHP扩展来实现。代码基础代码这个转载 2017-01-03 14:14:38 · 1206 阅读 · 0 评论 -
PHP7扩展开发之常量定义
前言这次,我们将演示如何在PHP扩展中定义一个常量。要实现的PHP代码如下:<?php define("__ARR__", array('2', 'site'=>"www.bo56.com")); define("__SITE__", "www.bo56.com", true); define("say\__SITE__", "bo56.com"); var_du转载 2016-12-26 22:53:13 · 1219 阅读 · 0 评论 -
PHP7扩展开发之数组处理
前言这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下:<?phpfunction array_concat ($arr, $prefix) { foreach($arr as $key => $val) { if (isset($prefix[$key]) && is_string($val)转载 2016-12-06 11:38:44 · 2744 阅读 · 0 评论 -
PHP7扩展开发之字符串处理
前言这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下:<?phpfunction str_concat($prefix, $string) { $len = strlen($prefix); $substr = substr($string, 0, $len); if ($substr != $prefix) { return $prefix转载 2016-11-28 12:14:55 · 956 阅读 · 0 评论 -
深入理解PHP7之zval
PHP7已经发布, 如承诺, 我也要开始这个系列的文章的编写, 今天我想先和大家聊聊zval的变化. 在讲zval变化的之前我们先来看看zval在PHP5下面是什么样子。PHP5zval回顾在PHP5的时候, zval的定义如下:struct _zval_struct { union { long lval; double dval; stru转载 2016-11-23 19:47:10 · 2236 阅读 · 0 评论 -
深入理解PHP7之REFERENCE
REFERENCE上一章说过引用(REFERENCE)在PHP5的时候是一个标志位, 而在PHP7以后我们把它变成了一种新的类型:IS_REFERNCE. 然而引用是一种很常见的应用, 所以这个变化带来了很多的变化, 也给我们在做PHP7开发的时候, 因为有的时候疏忽忘了处理这个类型, 而带来不少的bug.最简单的情况, 就是在处理各种类型的时候, 从此以后我们要多考虑这种新的类型, 比如在PHP7转载 2016-11-23 19:22:08 · 1222 阅读 · 0 评论 -
PHP扩展迁移为兼容PHP7记录
PHP7扩展编写的时候,提供的一些内核方法和之前的PHP之前的版本并不能完全兼容。有不少方法参数做了调整。下面是在迁移过程中遇到的一些问题。记录下来,避免大家再踩坑。add_assoc_stringl方法参数改为四个。 add_assoc_stringl(parray, key, value, value_len); 迁移的时候,只要把最后一个参数删除即可。add_assoc_string方法参转载 2016-11-23 19:03:18 · 1148 阅读 · 0 评论 -
PHP7扩展开发之类型处理
前言这次,我们将演示如何在PHP扩展中如何对类型进行一些操作。如,判断变量类型。要实现的PHP代码如下:<?php function get_size ($value) { if (is_string($value)) { return "string size is ". strlen($value); } else if (is_a转载 2016-11-23 18:49:51 · 1187 阅读 · 0 评论 -
PHP7扩展开发之hello word
前言本文是以PHP7作为基础,讲解如何从零开始创建一个PHP扩展。本文主要讲解创建一个扩展的基本步骤都有哪些。示例中,我们将实现如下功能:<?phpecho say();?>输出内容:$ php ./test.php$ hello word在扩展中实现一个say方法,调用say方法后,输出 hello word。第一步:生成代码PHP为我们提供了生成基本代码的工具 ext_skel。这个工具在转载 2016-11-14 14:54:23 · 815 阅读 · 0 评论 -
PHP7扩展开发之传参与返回值
前言这次,我们将演示如何在PHP扩展中接受传入的参数和输出返回值。<?php function default_value ($type, $value = null) { if ($type == "int") { return $value ?? 0; } else if ($type == "bool") {转载 2016-11-14 14:47:16 · 2511 阅读 · 0 评论 -
PHP7扩展开发入门
下载PHP源代码要开发PHP扩展,需要先下载PHP的源代码,一方面是因为我们的扩展一般会用到PHP自身定义的函数和宏,另一方面我们可以利用官方提供的工具减少工作量。 我下载了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7.0.2.tar.gz。 解压源码压缩包, tar xzf php-7.0.2.tar.gz,我们现在只需要关注Zend和ext这两个目录。原创 2016-10-23 14:45:57 · 950 阅读 · 0 评论 -
PHP-FPM 多进程模型
PHP-FPM 提供了更好的 PHP 进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置。那么当我们谈论 PHP-FPM 多进程模型的时候,作为 PHPer 的你了解多少呢?首先,让我们一起看几个问题:①:PHP-FPM 启动进程的方式主要有哪几种,区别是什么?②:PHP-FPM,是主进程接收请求转给子进程,还是子进程单独接收请求并处理,如何验证?③:为何在 PHP-FPM 模式...转载 2020-02-06 17:41:55 · 832 阅读 · 0 评论 -
yii 标签用法(模板)
yii模板中的label标签labelEx($model,'name'); ?>编译后:项目名称 *yii模板中的文本标签textField($model,'name',array('size'=>60,'maxlength'=>128)); ?>编译后:<input size="60"maxlength="128" name="Project[name]" id=原创 2015-06-02 23:27:14 · 946 阅读 · 0 评论 -
Yii 框架里数据库操作详解
增:1 第一种$post=new Post;$post->title='sample post';$post->content='content for the sample post';$post->createTime=time();/$post->createTime=new CDbexpression_r('NOW()');$post->save(); $u原创 2015-06-02 23:27:11 · 775 阅读 · 0 评论 -
Yii CDbCriteria
注:$c = new CDbCriteria();是ActiveRecord的一种写法,使ActiveRecord更加灵活,而不是手册中DAO(PDO)和Query Builder。 这是Yii CDbCriteria的一些笔记和常用用法: 一、一个sql拼装的情况 $criteria = new CDbCriteria; $criteria->add原创 2015-06-02 23:27:09 · 377 阅读 · 0 评论 -
php 魔术方法
PHP5.0后,php面向对象提成更多方法,使得php更加的强大!! 一些在PHP叫魔术方法的函数,在这里介绍一下:其实在一般的应用中,我们都需要用到他们!!1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用。 Java代码 class Test { function __construct() { echo "before"; } } $t = new Test原创 2015-06-02 23:27:04 · 381 阅读 · 0 评论 -
PHP实现函数重载
本来php?name=PHP">PHP是不支持函数重载的!php 作为一种弱类型语言,本身不能像强类型如java ,c++那样,直接的实现重载。不过可以通过一些方法,间接的实现重载。1.可以使用func_get_args()和func_num_args()这两个函数实现函数的重载!!PHP代码: function rewrite() { $原创 2015-06-02 23:27:01 · 548 阅读 · 0 评论 -
浅谈PHP5中垃圾回收算法(Garbage Collection)的演化
前言PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完转载 2015-07-16 14:25:28 · 690 阅读 · 0 评论 -
PHP原理之内存管理中难懂的几个点
PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等.另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们转载 2015-07-16 19:35:06 · 584 阅读 · 0 评论 -
Cookie禁用了,Session还能用吗?
Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到S转载 2015-08-26 14:35:14 · 452 阅读 · 0 评论 -
PHP抓取远程图片到本地
<?phpfunction GetImage($url, $filename = "") { if ($url == "") { return false; } if ($filename == "") { $ext = strrchr ( $url, "." ); if ($ext != ".gif" && $ext !=转载 2015-08-26 14:17:57 · 1197 阅读 · 0 评论 -
PHP函数遍历一个文件夹下的所有文件和子文件夹
<?phpfunction my_scandir($dir){ $files = array(); if ( $handle = opendir($dir) ) { while ( ($file = readdir($handle)) !== false ) { if ( $file != ".." && $file != "." ) {原创 2015-08-26 14:54:01 · 1014 阅读 · 0 评论 -
启用php-fpm状态详解
php-fpm和nginx一样内建了一个状态页,对于想了解php-fpm的状态以及监控php-fpm非常有帮助。为了后续的zabbix监控,我们需要先了解php-fpm状态页是怎么回事。 1. 启用php-fpm状态功能# cat /usr/local/php-5.5.10/etc/php-fpm.conf | grep status_pathpm.status_path = /status默转载 2015-08-31 19:51:15 · 558 阅读 · 0 评论 -
PHP大数据加法
function add($a,$b){ $a = strrev($a); $b = strrev($b); $tmp = 0; $tmp_c = 0; $count = ''; $len = strlen($a)>strlen($b)?strlen($a):strlen($b); for($i=0;$i<$len;$i++){原创 2015-08-31 20:39:43 · 889 阅读 · 1 评论 -
PHP的执行过程
简介 先看看下面这个过程: 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的; PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口); PHP总共有三个模块:内核、Zend引擎、以及扩展层; PHP内核用来处理请求、文件流、错误处理等相关操作; Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;转载 2015-09-03 18:17:59 · 502 阅读 · 0 评论 -
PHP和Nginx的通信方式
前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式。两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。 配置指南 TCP配置方式 TCP通信配置起来很简单,三步即可搞定 第一步,编辑 /etc/nginx/conf.d/你的站点配置文件(如果使用的默认配置文件,修改/etc/nginx/sites-availab转载 2015-08-25 14:53:55 · 2510 阅读 · 0 评论 -
PHP开发中常见的安全问题详解和解决方法
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等) 这篇文章主要介绍了PHP开发中常见的安全问题详解和解决方法,详细介绍了例如Sql注入、CSRF、Xss、CC等攻击手段的背景知识以及解决方法,需要的朋友可以参考下 浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF 前言: 首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是转载 2015-09-09 20:34:06 · 1016 阅读 · 0 评论 -
PHP内核探索:变量类型的转换
PHP是弱类型的动态语言,我们已经知道了PHP的变量都存放在一个名为ZVAL的容器中, ZVAL包含了变量的类型和各种类型变量的值。 PHP中的变量不需要显式的数据类型定义,可以给变量赋值任意类型的数据, PHP变量之间的数据类型转换有两种:隐式和显式转换。 隐式类型转换 隐式类型转换也被称为自动类型转换,是指不需要程序员书写代码,由编程语言自动完成的类型转换。 在PHP中,我们经常遇到的隐式转转载 2015-09-03 19:49:04 · 530 阅读 · 0 评论 -
Yii框架relations的使用
通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。 前提条件 在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景 申明关系 两张表之间的关系无非三种:一对多;一对一;多对多; 在A原创 2015-09-15 23:30:34 · 703 阅读 · 0 评论 -
PHP防止SQL注入详解及防范
SQL 注入是PHP应用中最常见的漏洞之一。事实上令人惊奇的是,开发者要同时犯两个错误才会引发一个SQL注入漏洞。 一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。 对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的源转载 2015-09-19 17:43:56 · 351 阅读 · 0 评论