pangudashu / php7-internal

PHP7内核剖析
3.42k stars 883 forks source link

交流&吐槽 #3

Open pangudashu opened 7 years ago

whiteHat001 commented 7 years ago

这样看太抽象了,给些实际的gdb调试例子会好些

pangudashu commented 7 years ago

好的,后续会补充些 @whiteHat001

hihozhou commented 7 years ago

@pangudashu ,我最近在用C++写一个php扩展项目,我想要php扩展中的对象中的属性可以绑定到C++的对象属性,使得php中调用_get_set的时候可以同事修改C++对象的属性。 zend_update_property()可以更新PHP的对象属性,但是没有成功绑定C++的对象属性。 例如:

//PHP extension code:
PHP_METHOD(Car, __construct)
{
    Car *car = NULL;
    zval *object = getThis();
    car = new Car();
    car_object *obj = Z_PHP7OBJ_P(object);
    obj->car = car;
    zend_update_property_long(car_ce, getThis(), "speed", sizeof("speed")-1, obj->car->speed TSRMLS_CC);
}

PHP_METHOD(Car, accelerate)
{
    Car *car;
    car_object *obj =Z_PHP7OBJ_P(getThis());
    car = obj->car;
    if (car != NULL) {
        car->accelerate();
    }
}

PHP_METHOD(Car, getCurrentSpeed)
{
    Car *car;
    car_object *obj = Z_PHP7OBJ_P(getThis());
    car = obj->car;
    if (car != NULL) {
        RETURN_LONG(car->getCurrentSpeed());
    }
    RETURN_NULL();
}
//c++ code:
#include "car.h"

Car::Car() {
    this->speed = 0;
}

void Car::accelerate() {
    this->speed += 5;
}

int Car::getCurrentSpeed() {
    return this->speed;
}
//php code:
$car = new Car();
echo $car->speed;//echo 0
echo $car->getCurrentSpeed();// echo 0
$car->accelerate();
echo $car->speed;//echo 0,但是我想要的是5
echo $car->getCurrentSpeed();// echo 5

我在想,是不是php扩展中有提供宏可以实现,又或者在扩展中重写_get和_set的魔术方法,但是都不知道怎样去实现

hihozhou commented 7 years ago

@imaben @pangudashu 我也这么认为,让大家可以讨论讨论分享经验,我也可以帮人解答我知道的问题

JaguarJack commented 7 years ago

可以开个交流群吗?

LHRchina commented 7 years ago

感谢pangudashu的精心制作,会坚持读下去的

toxmc commented 7 years ago

readme中的交流群是微信的,怎么不用qq

zimuyang commented 7 years ago

赞!

secretgao commented 7 years ago

赞!

yunyu2019 commented 7 years ago

有的底层c代码段建议标注上文件出处,因为某些部分讲解代码跳跃性太大,需要全文件夹搜索代码出处

CraryPrimitiveMan commented 7 years ago

是不是可以考虑忽略具体实现的代码,写成大家易于理解的代码,效果会好一些。就像《Redis设计与实现》中,大部分代码都是作者用python简写的,便于大家理解。

pangudashu commented 7 years ago

@CraryPrimitiveMan 有些部分确实罗列了太多的源码不太容易理解,后面会优化删除非关键的实现,保留最核心的部分。这个项目最初的定位是作为PHP内核的开发手册,而不是一本科普性质的书,所以会尽可能全、细的介绍,希望让更多的人可以具备PHP内核的开发能力,而不仅仅是了解。

medmin commented 7 years ago

能搞一个gitbook之类的么,可以在线看,或者转化为pdf

yunyu2019 commented 7 years ago

@medmin 现在的文档是markdown的格式,可以git clone下来,转换成html,自己本机部署成web项目进行查看

whiteHat001 commented 6 years ago

再回来看发现作者都要出书了啊,恭喜大佬了

137-rick commented 6 years ago

盘古大叔,可否增加gdb调试发现php故障章节,如服务卡死,如何使用pstack strace gdb php7/.initgdb等信息

yunyu2019 commented 6 years ago

第三章opcache有两节内容什么时候放出来呢

tanhaipeng commented 6 years ago

能搞一个gitbook之类的么,可以在线看,或者转化为pdf

Littlesqx commented 6 years ago

环境 php 7.2 ,有没有同学告知下为何是 2 3 4

<?php
$a = [];
xdebug_debug_zval('a'); // refcount=2
$b = $a;
xdebug_debug_zval('a'); // refcount=3
$c = $a;
xdebug_debug_zval('a'); // refcount=4

另外,作者这本书有错误的地方,引用计数部分沿用了 php 5 的,其实 php 7 有改动:

前面已经介绍过PHP变量的内存管理,即引用计数机制,当变量赋值、传递时并不会直接硬拷贝,而是增加value的引用数,unset、return等释放变量时再减掉引用数

php 7 中基本类型不会增加引用数。鸟哥这篇文章才是正确的:深入理解PHP7内核之 Reference

pangudashu commented 6 years ago

@Littlesqx 引用计数是在第2章介绍的,第5章的主题不是引用计数,你贴的那段在那里只是泛指好吗。另外你贴的鸟哥这篇文章是关于“引用(reference)”的,而不是“引用计数(refcount)”

Littlesqx commented 6 years ago

@pangudashu 嗯,我仔细看了下,是我的问题,抱歉。

最简单的类型是 true、false、long、double、null,其中true、false、null 没有 value,
直接根据 type 区分,而long、double 的值则直接存在 value 中:zend_long、double,
也就是标量类型不需要额外的value指针。

这里已经说的很清楚了。

flymenn commented 6 years ago

大佬写的非常精辟。但是能不能给文件加上目录号码。。这样查的时候也方便。。

pakoneko commented 5 years ago

一个腾讯课堂上在线收费培训机构分发的公开课教材是这本书的内容,大叔应该跟这家没关系吧?😮感觉他们的讲师水平写不了这个

wistonehorse commented 5 years ago

大叔,写这个的时候是以php7.几为基础写的?

pangudashu commented 5 years ago

@wistonehorse 7.0.28

ksana-kami commented 4 years ago

我是来催更的~求协程那章

huanghantao commented 4 years ago

@ksana-kami

https://github.com/php-extension-research/study

这里有一个,可以先看着

ksana-kami commented 4 years ago

@huanghantao 收到。感谢🙏