PHP5和PHP7的垃圾回收机制有什么不同
php5和php7的垃圾回收机制都是利用引用计数,由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的。今天我们就来学习一下PHP5和PHP7的垃圾回收机制的不同。
php5和php7的垃圾回收机制都是利用引用计数
我们先来看看什么叫做引用计数:
由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的
每个PHP的变量都存在于一个叫做zval的容器中,一个zval容器,除了包含变量名和值,还包括两个字节的额外信息,一个叫做'is_ref',是个布尔值,用来表示这个变量是否属于引用集合,通过这个字节,我们php才能把普通变量和引用变量区分开来.第二个额外字节就是'refcount',用来表示指向这个容器的变量的个数
我们在PHP中定义一个变量
$name='看看';
我们现在可以使用xdebug_debug_zval()函数来获得函数内变量的相关信息
xdebug_debug_zval('name'); //输出 name:(refcount=1,is_ref=0)='new String' 现在我们把$name赋值给$money $money = $name;
再来查看一下:
xdebug_debug_zval('name'); //输出 name:(refcount=2,is_ref=0)='new String'
这时候我们会看到refcount的字段的值增加了1,代表现有两个变量指向了相同的一个名字叫做name的aval容器
根据引用计数的规则,当这个refcount=0的时候,php就会把这个容器当做垃圾进行回收.
同样我们执行
unset($name); //一样也会把name容器的引用计数设置为0
以上的结论只是针对标量类型的,下面我们来看看负责类型的
数组:
$person=['name'=>'请欢','age'=>19]; var_dump(xdebug_debug_zval('person')); 在PHP5输出: person: (refcount=1, is_ref=0), array (size=2) 'name' => (refcount=1, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19
在PHP7中输出:
person: (refcount=2, is_ref=0) array (size=2) 'name' => (refcount=1, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19
由此可见,对于复杂的数据类型,PHP5和PHP7的引用计数算法是不一样的
我们来试试循环引用的情况
在上面代码的基础上,添加一行代码
$person['hello'] = $person['name']
在PHP7中输出:
person: (refcount=1, is_ref=0) array (size=3) 'name' => (refcount=3, is_ref=0)string '看看' (length=6) 'age' => (refcount=0, is_ref=0)int 19 'hello' => (refcount=3, is_ref=0)string '看看' (length=6)
在PHP5中输出:
person: (refcount=1, is_ref=0), array (size=3) 'name' => (refcount=2, is_ref=0),string '看看' (length=6) 'age' => (refcount=1, is_ref=0),int 19 'hello' => (refcount=2, is_ref=0),string '看看' (length=6)
小总结:
PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。最基础的变化就是 *zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:*
*简单数据类型不需要单独分配内存,也不需要计数;*
*不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;*
*由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;*
推荐学习:php视频教程
Atas ialah kandungan terperinci PHP5和PHP7的垃圾回收机制有什么不同. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara php5 dan php8 adalah dari segi prestasi, struktur bahasa, sistem jenis, pengendalian ralat, pengaturcaraan tak segerak, fungsi perpustakaan standard dan keselamatan. Pengenalan terperinci: 1. Peningkatan prestasi Berbanding dengan PHP5, PHP8 mempunyai peningkatan besar dalam prestasi PHP8 memperkenalkan pengkompil JIT, yang boleh menyusun dan mengoptimumkan beberapa kod pelaksanaan frekuensi tinggi, dengan itu meningkatkan kelajuan berjalan; PHP8 memperkenalkan beberapa struktur dan fungsi bahasa baharu PHP8 menyokong parameter yang dinamakan, membenarkan pembangun menghantar nama parameter dan bukannya susunan parameter, dsb.

Untuk menyelesaikan pemalam yang tidak menunjukkan isu yang dipasang dalam PHP 7.0: Semak konfigurasi pemalam dan dayakan pemalam. Mulakan semula PHP untuk menggunakan perubahan konfigurasi. Semak kebenaran fail pemalam untuk memastikan ia betul. Pasang kebergantungan yang hilang untuk memastikan pemalam berfungsi dengan betul. Jika semua langkah lain gagal, bina semula PHP. Punca lain yang mungkin termasuk versi pemalam yang tidak serasi, memuatkan versi yang salah atau isu konfigurasi PHP.

Dalam php5, kita boleh menggunakan fungsi fsockopen() untuk mengesan port TCP. Fungsi ini boleh digunakan untuk membuka sambungan rangkaian dan melakukan beberapa komunikasi rangkaian. Tetapi dalam php7, fungsi fsockopen() mungkin menghadapi beberapa masalah, seperti tidak dapat membuka port, tidak dapat menyambung ke pelayan, dsb. Untuk menyelesaikan masalah ini, kita boleh menggunakan fungsi socket_create() dan fungsi socket_connect() untuk mengesan port TCP.

Cara memasang sambungan mongo dalam php7.0: 1. Buat kumpulan pengguna dan pengguna mongodb 2. Muat turun pakej kod sumber mongodb dan letakkan pakej kod sumber dalam direktori "/usr/local/src/" 3. Masukkan direktori "src/" 4. Buka zip pakej kod sumber 5. Buat direktori fail mongodb 6. Salin fail ke direktori "mongodb/" 7. Buat fail konfigurasi mongodb;

Penyelesaian biasa untuk persekitaran pelayan PHP termasuk memastikan versi PHP yang betul dipasang dan fail yang berkaitan telah disalin ke direktori modul. Lumpuhkan SELinux buat sementara waktu atau selama-lamanya. Semak dan konfigurasikan PHP.ini untuk memastikan sambungan yang diperlukan telah ditambah dan disediakan dengan betul. Mulakan atau mulakan semula perkhidmatan PHP-FPM. Semak tetapan DNS untuk isu penyelesaian.

Punca dan penyelesaian untuk kesilapan Apabila menggunakan PECL untuk memasang sambungan dalam persekitaran Docker Apabila menggunakan persekitaran Docker, kami sering menemui beberapa sakit kepala ...

Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

Cara menukar port 80 dalam php5: 1. Edit nombor port dalam fail konfigurasi pelayan Apache; mula berjalan pada port baru berjalan pada port.
