Tag: php internals

PHP数组语法/运算符?

在PHP中编写关联数组的语法时,我们执行以下操作 $a = array(‘foo’ => ‘bar’); 我很好奇=>语法的关系,或者可能是运算符。 这是否与ZE中哈希表中使用的某种引用有关,或者与C使用的某种后续右移或引用有关? 我想我只是想知道这个语法的真正根本目的,它是如何与用于处理数组的ZE和/或php扩展相关,它如何与编译前C的书面函数相关,或者如果我只是不知道是什么我在说:)

__memcpy_sse2_unaligned – 这是什么意思?

在处理我的编译器时,我遇到了这个错误: Program received signal SIGSEGV, Segmentation fault. __memcpy_sse2_unaligned () at ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:33 我如何获得此处出现问题的详细信息? 我从回溯中知道它是一个记忆线导致它,但我如何看待内存是如何对齐的? 我怎么知道它应该如何对齐? 该项目是一个带有LLVM后端的编译器,使用Zend / PHP运行时和OCaml垃圾收集器,因此有很多问题可能出错。 我怀疑这条线是问题的一部分: zend_string *str = (zend_string *)caml_alloc(ZEND_MM_ALIGNED_SIZE(_STR_HEADER_SIZE + len + 1), 0); 其中caml_alloc是Zend源代码中的pemalloc 。 在执行10,000个字符串连接时会发生段错误。 这是valgrind的输出: ==7501== Invalid read of size 8 ==7501== at 0x4C2F790: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7501== by 0x4D7E58: subsetphp_concat_function (bindings.c:160) ==7501== by 0x4D7F52: foo (llvm_test.s:21) ==7501== […]

如何将数组作为Object属性添加到PHP扩展中声明的类?

我希望我的PHP扩展声明一个等效于以下PHP的类: class MyClass { public $MyMemberArray; __construct() { $this->MyMemberArray = array(); } } 我正在按照“ 高级PHP编程 ”和“ 扩展和嵌入PHP ”中的示例进行操作,并且我能够在PHP_MINIT_FUNCTION声明一个具有整数属性的PHP_MINIT_FUNCTION 。 但是,当我使用相同的方法在PHP_MINIT_FUNCTION声明一个数组属性时,我在运行时收到以下错误消息: PHP Fatal error: Internal zval’s can’t be arrays, objects or resources in Unknown on line 0 高级PHP编程的第557页有一个例子,说明如何声明一个创建数组属性的构造函数,但示例代码不能编译(第二个“对象”似乎是多余的)。 我修复了错误并将其修改为我的代码: PHP_METHOD(MyClass, __construct) { zval *myarray; zval *pThis; pThis = getThis(); MAKE_STD_ZVAL(myarray); array_init(myarray); zend_declare_property(Z_OBJCE_P(pThis), “MyMemberArray”, sizeof(“MyMemberArray”), myarray, ZEND_ACC_PUBLIC […]

哪里可以找到“低内存”和“空闲CPU周期”调用,在unset()上触发垃圾回收?

我经常发现在解释PHP unset()不会立即触发“垃圾收集”时使用以下引用的引用,但只有当它看起来合适时(强调我的): unset()正如它的名字所说 – 取消设置一个变量。 它不会强制立即释放内存。 PHP的垃圾收集器会在看到拟合时执行它 – 尽快意图,因为无论如何都不需要那些CPU周期 ,或者在脚本耗尽内存之前 ,无论先发生什么。 如果你正在做$ whatever = null; 那么你正在重写变量的数据。 您可能会更快地释放/缩小内存,但它可能会更快地从真正需要它们的代码中窃取CPU周期,从而导致更长的总体执行时间。 我想知道这个“低内存”和“自由CPU周期”触发垃圾收集的C代码是如何工作的,以及它是否在PHP 5.2.x和PHP 5.3+之间有所不同。 所以我下载了PHP 5.2.17的C源文件,并尝试找到正确的代码部分。 也许我只是失明,或者我的C技能太低,但我找不到这样的代码。 有人能指出我正确的C文件吗? 编辑 : 在搜索上述引用的例子时,我意识到一些奇怪的东西。 一些示例,如https://stackoverflow.com/a/584982/693207 ,通过使用以下URL对php.net上的评论引用此引用: http : //us2.php.net/manual/en /function.unset.php#86347 。 浏览此URL仅显示unset()手册的顶部。 评论#86347不见了。 检查返回机器显示,该评论DID存在于2008年10月,但在2012年9月或之后的某个时间消失(原因未知)。 也许这句话是,而且一直都是,这是完全错的? 或者有谁在那里,谁能指出我正确的C文件?

如何在C中编写PHP模块

我怎样才能在C中编写自己的模块? 可能吗 ?

阅读Zend Engine API代码:##(双哈希)是什么意思?

出于好奇,我正在阅读Zend Engine API代码并在#define中遇到了相当多的##。 例如,在/usr/lib/php5/Zend/zend_API.h: #define ZEND_FN(name) zif_##name #define ZEND_MN(name) zim_##name ##(双哈希)符号在这两行中意味着什么?