laruence / php7-internal Goto Github PK
View Code? Open in Web Editor NEWUnderstanding PHP7 Internal articles
Understanding PHP7 Internal articles
署名,禁止盈利,相同方式分享?
或者署名,禁止盈利,禁止衍生
I'm confused about the naming 'interned string'. You'd better use 'interning string' or 'string interning'. ^_^
PS: I'm confused about it... interned string is available. https://en.wikipedia.org/wiki/String_interning
生产环境跑php7.0.7接近半年时间,最近突然报出错误,通过模拟请求,并用tcpdump抓包,发现php响应体中,有一定概率带post请求参数。
脚本tt.php
<?php
echo 'hhhhhhhhh'.PHP_EOL;
命令行:
curl -d "a=b&c=d" http://www.phptest.test/tt.php
hhhhhhhhh
curl -d "a=b&c=d" http://www.phptest.test/tt.php
hhhhhhhhh
curl -d "a=b&c=d" http://www.phptest.test/tt.php
a=b&c=dhhhhhhhhh
curl -d "a=b&c=d" http://www.phptest.test/tt.php
hhhhhhhhh
md的code引用是 ``` + language 就够了:
try_again:
swtich (Z_TYPE_P(zv)) {
case IS_TRING:
break;
case IS_ARRAY:
break;
...
case IS_REFERNCE:
zv = Z_REFVAL_P(zv); //解引用
goto try_again;
break;
}
能否先写个大纲
http://jpauli.github.io/2016/04/08/hashtables.html
一直没搞懂新的hashTable的冲突链在插入的时候是如何维护的
"首先这个结构体的大小是(在64位系统)24个字节, 我们仔细看这个zval.value联合体, 其中zend_object_value是最大的长板, 它导致整个value需要16个字节"
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
zend_ast *ast;
} value;
在union.str
中有两个成员, 字符型指针 val
占8个字节,整型 len
占4个字节,加上自动补齐。
str
结构体一共占16个字节。
所以,我的问题是:为什说 “zval.value
联合体, 其中zend_object_value
是最大的长板, 它导致整个value需要16个字节”。如果我的理解有错误,还请鸟哥纠正我。
I learnt to wrote a sample extension. I found nothing wrong before making install.
Installing shared extensions: /usr/share/php/lib/php/extensions/debug-non-zts-20151012/ cp: cannot stat 'modules/*': No such file or directory make: *** [install-modules] Error 1
I checked that there's a lot of files built after these steps. And I found nothing inside the modules directory, no .so file is inside.
Of course, I make clean it and then re-install it once again. But it's still the same. I have no idea what's wrong with it after googling.
So could you help me?
看了zval那一章,我对_zval_struct里面的type_info没理解是做什么用的。我理解type保存类型,u1.v.type_flag保存这个type是否可复制,可循环等属性。那么这里的type_info又是做什么用的呢?
hey,this is just a test message,
if you see this,
Congratulations!
maybe you don't even know that you've just passed the test right here right that moment,
coz you can see your own github repo-issues!
believe it or not , you really can see it!
:(
typedef union _zend_value {
zend_object *obj;
zend_class_entry *ce;
} zend_value;
struct _zend_object {
zend_class_entry *ce;
};
I want to know that the different of them and how to use them efficiently?
I can see a lot of stars and watches this repository, I'm intending to look into the PHP7 codebase, so this sounded like a good resource. Will you be adding content to this repository any soon?
I had found this repo by following @laruence from php/php-src@php-7.0.0RC1...master commits.
感觉鸟哥的视频是个不错的参考,http://www.imooc.com/learn/469
zval *a;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &a) == FAILURE)
{
RETURN_NULL();
}
ZVAL_LONG(&(a->value.ref->val),110)
这样可以改写引用的值,但是感觉不太雅观,有没有内核api呢
(gdb) bt
#0 strlen () at ../sysdeps/x86_64/strlen.S:106
#1 0x00000000007be335 in format_converter (odp=0x7fff6e1d0f90, fmt=0xd5a491 "s(%d) : Freeing 0x%.8lX (%zu bytes), script=%s\n", ap=0x7fff6e1d0ff0)
at /home/jihanzhuang/Downloads/php-7.0.8/main/snprintf.c:993
#2 0x00000000007bedcf in strx_printv (ccp=0x7fff6e1d0fec,
buf=0x7fff6e1d1360 "[Sat Aug 13 21:02:14 2016] Script: '/home/jihanzhuang/code/Pinyin/tests/pinyin.php'\n", len=512,
format=0xd5a490 "%s(%d) : Freeing 0x%.8lX (%zu bytes), script=%s\n", ap=0x7fff6e1d0ff0) at /home/jihanzhuang/Downloads/php-7.0.8/main/snprintf.c:1248
#3 0x00000000007bf07a in ap_php_snprintf (buf=0x7fff6e1d1360 "[Sat Aug 13 21:02:14 2016] Script: '/home/jihanzhuang/code/Pinyin/tests/pinyin.php'\n", len=512,
format=0xd5a490 "%s(%d) : Freeing 0x%.8lX (%zu bytes), script=%s\n") at /home/jihanzhuang/Downloads/php-7.0.8/main/snprintf.c:1293
#4 0x00000000007b9768 in php_message_handler_for_zend (message=4, data=0x7fff6e1d2410) at /home/jihanzhuang/Downloads/php-7.0.8/main/main.c:1444
#5 0x0000000000851cad in zend_message_dispatcher (message=4, data=0x7fff6e1d2410) at /home/jihanzhuang/Downloads/php-7.0.8/Zend/zend.c:998
#6 0x000000000081cf06 in zend_mm_check_leaks (heap=0x7f2a6c000040) at /home/jihanzhuang/Downloads/php-7.0.8/Zend/zend_alloc.c:2129
#7 0x000000000081d268 in zend_mm_shutdown (heap=0x7f2a6c000040, full=0, silent=0) at /home/jihanzhuang/Downloads/php-7.0.8/Zend/zend_alloc.c:2201
#8 0x000000000081e113 in shutdown_memory_manager (silent=0, full_shutdown=0) at /home/jihanzhuang/Downloads/php-7.0.8/Zend/zend_alloc.c:2637
#9 0x00000000007ba6e0 in php_request_shutdown (dummy=0x0) at /home/jihanzhuang/Downloads/php-7.0.8/main/main.c:1856
#10 0x000000000091b7ec in do_cli (argc=2, argv=0x1b55310) at /home/jihanzhuang/Downloads/php-7.0.8/sapi/cli/php_cli.c:1141
#11 0x000000000091c068 in main (argc=2, argv=0x1b55310) at /home/jihanzhuang/Downloads/php-7.0.8/sapi/cli/php_cli.c:1344
## core文件的信息,是在format_converter函数中,s是不能访问的地址,程序直接strlen导致的错误。
(gdb) list
case 's':
case 'v':
s = va_arg(ap, char *);
if (s != NULL) {
s_len = strlen(s);
if (adjust_precision && precision < s_len) {
s_len = precision;
}
}
请问有什么办法可以更好地排查问题。
when start?
为什么首次echo会使内存用量增加32字节,无论echo内容有多少字节,只增加32字节?
@laruence, It would be great, if you could please release the posts / content in English as well, so that it can be easily read and understood by more people, including me.
It confuses me when I allocate a string with the length from a constant int or size_t variable. It'll make memory leak.
On the other hand, it works well when I allocate it with a number. What's going on with it?
`
PHP_FUNCTION(aa_encrypt64) {
const char *key = ""; // base64
char *str = NULL;
char *datetime = NULL;
char *private_key = NULL;
const size_t rtn_len = 32;
char rtn[rtn_len]; // char rtn[rtn_len] leaves memory leak
int argc = ZEND_NUM_ARGS();
size_t str_len;
size_t datetime_len;
size_t private_key_len;
if (zend_parse_parameters(argc, "sss", &str, &str_len, &datetime, &datetime_len, &private_key, &private_key_len) == FAILURE)
return;
md5(str, rtn);
RETURN_STRINGL(rtn, rtn_len);
}
PHP_FUNCTION(aa_decrypt64)
{
`
PHP_FUNCTION(aa_encrypt64) {
const char *key = ""; // base64
char *str = NULL;
char *datetime = NULL;
char *private_key = NULL;
size_t rtn_len = 32;
char rtn[32]; // char rtn[rtn_len] leaves memory leak
int argc = ZEND_NUM_ARGS();
size_t str_len;
size_t datetime_len;
size_t private_key_len;
if (zend_parse_parameters(argc, "sss", &str, &str_len, &datetime, &datetime_len, &private_key, &private_key_len) == FAILURE)
return;
md5(str, rtn);
RETURN_STRINGL(rtn, rtn_len);
}
好久没有更新了,我看walu的phpbook里面有和PHP 7不兼容的地方,不太好找相关的资料,等您这篇做对照呢。多谢鸟哥
PHP7深入解析?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.