问题标签 [php-internals]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - 在编译期间检测 PHP 是否正在使用给定的扩展名进行编译
我正在尝试为 PHP 构建一个扩展。在遵循 Sara Golemon 的书之后,我有了一个基本扩展,我可以将其编译为共享模块,此外,我可以沿着 PHP 本身静态编译它。
现在我想修改 PHP 解释器以拦截特定的内部函数调用并将这些调用传达给我的扩展。我只想在我的扩展使用 PHP 静态编译时才这样做——否则解释器构建过程应该生成一个未修改的 PHP 二进制文件。我的理解是我应该使用 C 预处理器。然而,为了实现我的目标,我需要一个预处理器标志,它只会在 PHP 配置为使用我的扩展进行编译时引发(即 ./configure --enable-myextension)。不幸的是,我找不到这样的标志,配置脚本似乎也没有设置。
我应该在这里说,我已经尝试在我的扩展程序代码中设置 preprossessor 标志,但这不起作用。我的扩展在构建过程的后期首次被触及(即大致在解释器核心之后),并且在编译大量解释器代码时,我在那里设置的标志是不活动的。
有什么想法吗?以上听起来合理吗?
php - 通过引用传递的 PHP 局部变量能否在函数外部可靠地存在?
基本上在使用大型数组的情况下,null
如果发生错误,则很方便传回,因为如果$array = null
then$array[] = 1
是[ 1 ]
并且null
也可以在可调用的上下文中使用,即。function (array $array = null)
将接受null
为可接受的值。基本上null
很方便,因为如果您有错误处理代码,您可以轻松地将其识别为错误,但如果您不在乎,也可以轻松忽略它。
在大多数情况下,这是相当直接的,但是有一个极端情况,PHP 并不真正支持它,那就是在不一定接受引用但需要的函数上下文中传回引用时有时传回 null,但有时传回引用(大多数情况下这不是问题,因为您返回的是对实例变量的引用,但有时情况并非如此)。null
还有以非尴尬的方式调用具有值的函数的情况。
传递引用的原因显然是为了省去复制数组的麻烦(尤其是当它非常大时)。
以下“解决方案”...
有效,但是...
我的问题是PHP 是否保证在对局部变量的所有引用都被垃圾收集之前不会被垃圾收集?或者是未定义的行为。
php - 如何使 ZEND_BEGIN_ARG_INFO_EX 控制参数数量,传递给 PHP 扩展?
我正在使用 C 开发一个 PHP 扩展。到目前为止,我正在对参数进行正确验证,从 PHP 用户空间传递给扩展的函数。
该宏ZEND_BEGIN_ARG_INFO_EX
可用于向 Zend Engine 提供有关函数参数的信息。宏的第 4 个参数,命名为required_num_args
,让引擎自动控制参数的数量,免去了我的麻烦。但是,我找不到让它工作的方法:引擎总是在没有任何警告的情况下运行扩展的函数,即使 PHP 脚本没有传递足够的参数也是如此。
这是我对函数参数的定义:
这是我对函数的定义,由 PHP 扩展导出:
这是我的功能:
这是我运行的 PHP 脚本:
预期结果:PHP 显示错误/警告/异常,例如“没有足够的参数传递给函数”;该功能不执行。
实际结果:函数执行并返回true
。
如何正确配置函数参数结构,以便 Zend Engine 自动检查参数数量?还是我误解了宏中required_num_args
参数的目的?ZEND_BEGIN_ARG_INFO_EX
php - 将 Lame.h 与 PHP 扩展链接
我正在尝试开发我的第一个 php 扩展。它使用 Lame ,所以我安装了 liblame-dev lame.h 位于/usr/include/lame/
在我的 config.m4
它可以构建,但是 apache 启动时出现问题
解决方案
对我来说正确的行 config.m4 是
PHP_SUBST(MYEXTENSION_SHARED_LIBADD)
PHP_ADD_LIBRARY(mp3lame, 1,MYEXTENSION_SHARED_LIBADD)
php-internals - 尝试重新生成 zend_language_scanner.c
我正在尝试在 PHP 中添加一个新关键字(只是学习核心),所以我所做的是:向 zend_language_parser.y 添加一个新标记,在 unticket_statement 中使用它,编译 PHP,但它没有成功。似乎我需要在 zend_language_scanner.l 中添加这个新关键字(我通过这个文件中的另一个定义假设它)并在 re2c 的帮助下重新生成 zend_language_scanner.c。
但这是 re2c 给我的:
第 1004 行包含以下定义:
即使在未更改的 zend_language_scanner.l 文件上也会弹出此错误。
这是re2c -v
输出:re2c 0.13.5
有谁知道我怎样才能重新生成这个扫描仪或者我做错了什么?
php - php 扩展,用 C 编写的处理程序替换 PHP 类方法
我的经验水平:对 C 非常熟悉,对 PHP 很熟悉,对 Zend Engine 很陌生并且很沮丧(没有文档?)
我正在尝试编写我的第一个 PHP 扩展,我想知道以下是否可能。
说明我的目标的 PHP 代码:
另外,我知道我可以重写 foo 来调用扩展所公开的函数,但这对我来说并不有趣。我只是想知道上面的例子(PHP类不知道并且不与扩展合作)是否可行。
php - 捕获(外部)给定回调的内存消耗
问题
可以说我有这个功能:
我想调用它并能够检查它使用的最大内存量。
换句话说:memory_get_function_peak_usage($callback);
. 这可能吗?
我试过的
我使用以下值作为我的非单调递增$i
参数hog()
:
本质上是:
附上memory_get_usage()
输出:
如果我存储 的返回值hog()
,结果开始看起来更真实:
输出:
正如预期的那样,现在它向我显示了返回的内存量,但我需要使用的总内存。
使用register_tick_function()
:
我不知道,但事实证明,当你这样做时:
它不会为函数内的每一行、语句或代码块打勾hog()
,只针对declare
块内的代码 - 所以,除非函数在其中定义,否则这个选项是不行的。
与gc_*
功能混合:
我尝试使用 , 的组合(我必须说希望不大)gc_disable()
,gc_enable()
并gc_collect_cycles()
通过上面的两个实验来查看是否有任何改变 - 它没有。
php - 将php扩展编译成dll
最近几天我一直在尝试使用运算符重载扩展(pecl.php.net/package/operator),它最近显然已更新为与 5.3 和 5.4 兼容。
我尝试使用本指南在 Windows(64 位 Windows 7)中编译它,使用 PHP 5.4 和 Windows SDK 7.1 没有运气。因此,我尝试使用 PHP 5.3 和 Windows SDK 6.1 进行此操作,我可以使用配置“configure --disable-all --enable-cli --enable-operator”和“nmake”成功编译它。问题是它不会为运算符扩展生成 dll 文件,而是我得到的是 this,这对我来说显然没用。我想要的是一个可用于本地 WampServer 设置的 dll。
我在尝试使用 pecl.php.net 站点上的 operator-0.4.1 时遇到了致命错误,所以我从 git 存储库 (github.com/php/pecl-php-operator) 下载并编译,这就是生成了 .obj、.idb 和 .sbr 文件。
php - print_r() 将属性添加到 DateTime 对象
考虑以下代码示例:
从 PHP 5.3 开始,这会产生(类似于)以下输出:
但是下面的代码:
...只是发出一个错误:
为什么要将print_r()
这些属性“添加”到对象中?请注意,它们没有被定义为手册页DateTime
上类的一部分。