xdebug

PHP 垃圾回收机制详解

余生颓废 提交于 2020-11-11 08:22:58
前言:之前对PHP的GC只是了解了个大概,这次详细了解下PHP的垃圾回收机制(GC)。    介于网上大部分都是PHP5.X的GC,虽然 php5 到 php7 GC部分做出的改动较小,但我觉得还是一起写下来比较好 一、原理 php5和php7的垃圾回收机制都是利用引用计数 二、 php5和php7不同点 1、PHP5标量数据类型会计数,PHP7标量数据类型不再计数,不需要单独分配内存 2、PHP7的zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。 3、PHP7的复杂数据类型(比如数组和对象)的引用计数由其自身来存储。 三、变量在zval的变量容器中结构 zval中,除了存储变量的类型和值之外,还有is_ref字段和refcount字段 1、is_ref:是个bool值,用来区分变量是否属于引用集合。 2、refcount:计数器,表示指向这个zval变量容器的变量个数。 四、PHP5.3标量在zval容器例子 注意:php5.3中 将一个变量 = 赋值给另一个变量时,不会立即为新变量分配内存空间,而是在原变量的zval中给refcount加1。 只有当原变量或者发生改变时,才会为新变量分配内存空间,同时原变量的refcount减 1 。 当然,如果unset原变量,新变量直接就使用原变量的zval而不是重新分配。 &引用赋值时,原变量的is_ref 加1.

PHP的垃圾回收机制详解

柔情痞子 提交于 2020-10-21 21:02:07
最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制。本文参考了PHP手册。 在理解PHP垃圾回收机制(GC)之前,先了解一下变量的存储。 php中变量存在于一个zval的变量容器中。结构如下: 类型 值 is_ref refcount zval中,除了存储变量的类型和值之外,还有is_ref字段和refcount字段。 is_ref:是个bool值,用来区分变量是否属于引用集合。什么意思呢,你可以这么认为:表示变量是否有一个以上的别名。 refcount:计数器,表示指向这个zval变量容器的变量个数。 两者之间有这么一个默认关系:当refcount值为1时,is_ref的值为false。因为refcount为1,此变量不可能有多个别名,也就不存在引用了。 安装xdebug拓展之后,可以利用xdebug_debug_zval打印出zval容器详情。 这里有一点需要注意,将一个变量 = 赋值给另一个变量时,不会立即为新变量分配内存空间,而是在原变量的zval中给refcount加1。 只有当原变量或者发生改变时,才会为新变量分配内存空间,同时原变量的refcount减 1 。当然,如果unset原变量,新变量直接就使用原变量的zval而不是重新分配。 &引用赋值时,原变量的is_ref 变为1,refcount 加1. 如果给一个变量

PHP系列之钩子

て烟熏妆下的殇ゞ 提交于 2020-10-02 12:53:48
PHP 提供的钩子 PHP 和 Zend Engine 为扩展提供了许多不同的钩子,这些扩展允许扩展开发人员以 PHP userland 无法提供的方式控制 PHP 运行时。 本章将展示各种钩子和从扩展钩子到它们的常见用例。 钩子到 PHP 功能的一般模式是 PHP 核心提供的扩展覆盖函数指针。然后扩展函数通常执行自己的工作并调用原始 PHP 核心函数。使用此模式,不同的扩展可以覆盖同一个钩子而不会导致冲突。 挂钩到函数的执行 userland和内部函数的执行由Zend引擎中的两个函数处理,您可以用自己的实现替换这两个函数。覆盖此钩子的扩展的主要用例是通用函数级评测、调试和面向方面的编程。 钩子在 Zend/zend_execute.h 中定义: ZEND_API extern void (*zend_execute_ex)(zend_execute_data *execute_data);ZEND_API extern void (*zend_execute_internal)(zend_execute_data *execute_data, zval *return_value); 如果要覆盖这些函数指针,则必须在 Minit 中执行此操作,因为 Zend Engine 中的其他决策是根据指针是否被覆盖这一事实提前做出的。 覆盖的通常模式是这样的: static void (

PHP7 CLI attempts to load xdebug twice - “Cannot load Xdebug - it was already loaded”

此生再无相见时 提交于 2020-08-21 07:10:05
问题 After upgrading Ubuntu from 14.04 to 16.04, PHP CLI started complaining about xdebug: $ php -v Cannot load Xdebug - it was already loaded PHP 7.0.13-0ubuntu0.16.04.1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.13-0ubuntu0.16.04.1, Copyright (c) 1999-2016, by Zend Technologies with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans There is only one .ini file: $ ls -la /etc/php/7.0/cli/conf.d/ |

去除php7编译安装的模块sqlite3

我是研究僧i 提交于 2020-08-18 21:45:28
去除php7编译安装的模块,这里以sqlite3为例 SQLite3 扩展自 PHP 5.3.0 起已默认启用。 允许在编译时使用 --without-sqlite3 禁用之 背景 我在开发项目的时候需要使用php连接加密的sqlite数据库,但是php默认编译的sqlite扩展不支持连接加密的sqlite数据库,因此我必须把编译安装的sqlite3移除掉,安装支持连接加密的sqlite数据库的扩展 前提 假设你已经编译安装好了php7,且在编译安装php7的时候未显示禁止 --without-sqlite3,导致这个模块已经被编译安装进php,满足这个前提下,再来看这篇文章 如果不知道如何编译安装php7,请参考这篇文章 centos7编译安装php7 查看文章的过程中,一定要注意各个命令的操作路径,需要将这些路径替换成你自己开发环境中的路径,切记 文章中 php7.1 命令只是对 php 命令的一个软连接,如果不清楚,请仔细阅读这篇文章 centos7编译安装php7 查看php安装好的模块 [root@localhost ~]# php7.1 -m [PHP Modules] bcmath Core ctype curl date dom fileinfo filter ftp gd gettext hash iconv json libxml mbstring mcrypt

PhpStudy+Xdebug调试超时500解决方法 Apache2.4调试时间太短的问题

三世轮回 提交于 2020-08-15 10:47:00
PhpStudy+Apache(Fastcgi)+Xdebug调试时间过长出现500时解决方法,有时再用xdebug调试程序时,由于调试时间过长会出现500服务器错误的现象,根本原因在于apache默认的连接时间过短导致。 PhpStudy+Apache(Fastcgi)+Xdebug调试时间过长出现500时解决方法 一 . 问题现象 有时再用xdebug调试程序时,由于调试时间过长会出现500服务器错误的现象,根本原因在于apache默认的连接时间过短导致。 二 . 适用于 中间件:Apache(Fastcgi) 错误日志为:End of script output before headers 三 . 解决方法 1.打开apache配置文件注释掉如下,并添加一行。 # Various default settings Include conf/extra/httpd-default.conf 将注释去掉 Include conf/extra/httpd-fcgid.conf 添加此行 2. 更改httpd-default.conf如下内容 # Timeout: The number of seconds before receives and sends time out. # Timeout 3600 # # KeepAlive: Whether or not to