Contoh terperinci tentang cara PHP mencipta memori kongsi untuk mengurangkan beban

藏色散人
Lepaskan: 2023-04-11 08:30:02
ke hadapan
3976 orang telah melayarinya

Artikel ini akan memperkenalkan kepada anda cara mencipta memori bersama dalam PHP untuk mengurangkan beban Di sini anda perlu memahami shmop fungsi Mari ikuti artikel untuk belajar~

PHP mempunyai dua set antara muka untuk ingatan. perkongsian. Satu ialah shm, yang sebenarnya perkongsian pembolehubah dan akan mensiri pembolehubah objek sebelum menyimpannya. Ia agak mudah digunakan, tetapi storan bersiri tidak bermakna untuk operasi capaian memori yang mengutamakan kecekapan. Yang satu lagi ialah shmop, yang biasa digunakan untuk Linux dan Windows, tetapi fungsinya lebih lemah daripada shm Pada Linux, fungsi ini dilaksanakan secara langsung dengan memanggil siri shm* fungsi, manakala pada Winodows, ia juga dilaksanakan oleh sistem enkapsulasi. fungsi membuat panggilan yang sama.

Untuk mencipta segmen memori kongsi, anda perlu menggunakan fungsi shmop, dan kemudian anda perlu mendayakan sambungan. [Pembelajaran yang disyorkan: Tutorial video PHP]

fungsi utama shmop

shmop_open (buat atau buka blok memori kongsi), shmop_write (tulis ke blok memori kongsi), shmop_read (baca data daripada blok memori kongsi), shmop_size (dapatkan saiz blok memori kongsi), shmop_close (tutup blok memori kongsi), shmop_delete (padam blok memori kongsi)

<?php
//创建一块共享内存
$shm_key = 0x4337b101;
$shm_id = @shmop_open($shm_key, &#39;c&#39;, 0644, 1024);
//读取并写入数据
$data = shmop_read($shm_id, 0, 1024);
shmop_write($shm_id, json_encode($data), 0);
$size = shmop_size($shm_id); //获取内存中实际数据占用大小
//关闭内存块,并不会删除共享内存,只是清除 PHP 的资源
shmop_close($shm_id);
Salin selepas log masuk

shmop_open (buat segmen memori)

Perkara pertama yang muncul dalam fungsi ini ialah parameter ID sistem. Ini ialah nombor yang mengenal pasti segmen memori yang dikongsi dalam sistem. Parameter kedua ialah mod capaian, yang hampir sama dengan mod capaian fungsi fopen. Anda boleh mengakses segmen memori dalam 4 mod berbeza:

Mod "a", yang membolehkan anda mengakses segmen memori baca sahaja, mod akses baca sahaja "c", yang mencipta segmen memori baharu, atau Jika segmen memori sudah wujud, cuba bukanya untuk membaca dan menulis
Mod "n", yang mencipta segmen memori baharu Jika kunci yang sama sudah wujud, penciptaan ini akan gagal penggunaan memori bersama.

Parameter ketiga ialah kebenaran segmen memori. Anda mesti memberikan nilai perlapanan di sini.

Parameter keempat menyediakan saiz segmen memori dalam bait. Memandangkan segmen memori kongsi yang digunakan adalah panjang tetap, panjang data mesti dikira semasa menyimpan dan membaca, jika tidak penulisan mungkin gagal atau nilai nol boleh dibaca. .

Perhatikan bahawa fungsi ini mengembalikan nombor ID yang boleh digunakan oleh fungsi lain untuk beroperasi pada segmen memori kongsi ini. ID ini ialah ID akses memori yang dikongsi, tidak seperti ID sistem, yang diluluskan sebagai parameter. Berhati-hati agar tidak mengelirukan kedua-duanya. Apabila gagal, shmop_open akan mengembalikan FALSE. Apabila mencipta blok memori, disyorkan untuk menggunakan pemalar dan bukannya pembolehubah untuk parameter utama, jika tidak, ia berkemungkinan menyebabkan kebocoran memori.

shmop_write (tulis data ke segmen memori)

Fungsi ini serupa dengan fungsi fwrite, yang mempunyai dua parameter: sumber aliran terbuka (dipulangkan oleh fopen) dan data yang ingin anda tulis. Fungsi shmop_write juga melaksanakan tugas ini.

Parameter pertama ialah ID yang dikembalikan oleh shmop_open, yang mengenal pasti blok memori kongsi yang anda kendalikan. Parameter kedua ialah data yang ingin anda simpan, dan parameter ketiga terakhir ialah kedudukan di mana anda ingin mula menulis. Secara lalai, kami sentiasa menggunakan 0 untuk menunjukkan tempat untuk mula menulis. Ambil perhatian bahawa fungsi ini mengembalikan FALSE pada kegagalan dan bilangan bait yang ditulis pada kejayaan.

shmop_read (baca data daripada segmen memori)

Membaca data daripada segmen memori kongsi adalah mudah. Apa yang anda perlukan ialah segmen memori terbuka dan fungsi shmop_read. Fungsi ini menerima beberapa parameter dan berfungsi seperti fread.

Sila beri perhatian kepada parameter di sini. Fungsi shmop_read akan menerima ID yang dikembalikan oleh shmop_open, yang sudah kita ketahui, tetapi ia juga menerima dua parameter lain. Parameter kedua ialah lokasi dalam segmen memori yang ingin anda baca, dan yang ketiga ialah bilangan bait yang anda ingin baca. Parameter kedua sentiasa boleh menjadi 0, menunjukkan permulaan data, tetapi parameter ketiga boleh menjadi masalah kerana kita tidak tahu berapa banyak bait yang ingin kita baca.

Ini sangat serupa dengan apa yang kami lakukan dalam fungsi fread, yang menerima dua parameter: sumber strim terbuka (dipulangkan oleh fopen) dan bilangan bait yang anda ingin baca daripada strim. Gunakan fungsi saiz fail (yang mengembalikan bilangan bait dalam fail) untuk membacanya sepenuhnya.

shmop_size (mengembalikan saiz sebenar data segmen memori)

Sebagai contoh, kami telah membuka ruang memori dengan panjang 100 bait, tetapi panjang sebenar daripada data yang disimpan hanyalah 90, maka nilai yang dikembalikan dengan menggunakan shmop_size ialah 90.

shmop_delete (padam segmen memori)

Fungsi ini hanya menerima satu parameter: ID memori kongsi yang ingin kami padamkan, Ini sebenarnya tidak memadamkan segmen memori. Ia menandakan segmen memori untuk pemadaman kerana segmen memori yang dikongsi tidak boleh dipadamkan semasa proses lain menggunakannya. Fungsi shmop_delete menandakan segmen memori untuk pemadaman, menghalang sebarang proses lain daripada membukanya. Untuk memadamkannya, kita perlu menutup segmen memori itu. Apabila mencipta blok memori, disyorkan untuk menggunakan pemalar dan bukannya pembolehubah untuk parameter utama, jika tidak, ia berkemungkinan menyebabkan kebocoran memori.

shmop_close(segmen ingatan rapat)

我们在对内存段进行读取和写入,但完成操作后,我们必须从它解除,这非常类似于处理文件时的 fclose 函数。打开包含一个文件的流并在其中读取或写入数据后,我们必须关闭它,否则将发生锁定。

简单测试结果查看

我是在LNMP环境下操作的,如果你也和我一样,在执行完简单的操作之后,可以使用linux命令查看一下地址和占用大小

# ipcs -m
[root@bogon ~]# ipcs -m

------ Shared Memory Segments --------
key  shmid  owner  perms  bytes  nattch  status  
0x00000000 0       gdm    600     393216   2   dest   
0x00000000 32769    gdm    600     393216   2   dest        
0x4337b101 884750   nobody   644     1024    0
Salin selepas log masuk

命令说明

key :共享内存的唯一的key值,共享内存通过该key来判断你读取的是哪一块内存。 owner:创建该共享内存块的用户 bytes:该内存块的大小 status:当前状态,如:dest,即将删除等。

项目实际应用小案例

/**
 * 将领技能
 */
class Generalskill_model extends CI_Model {<!-- -->

 private $_memory_key = 0x4337b001; //共享内存地址key
 private $_memory_size = 1048576;  //开辟共享内存大小 //最好根据实际数据长度大小定义。

 public function __construct() {<!-- -->
 parent::__construct();
 }

 public function get_skill_list() {<!-- -->
 $data = [];
 $shmid = @shmop_open($this->_memory_key, &#39;a&#39;, 0644, $this->_memory_size); 

 if ($shmid === FALSE) {<!-- -->
  $shmid = @shmop_open($this->_memory_key, &#39;c&#39;, 0644, $this->_memory_size); 
  $data = $this->return_skill_list();
  shmop_write($shmid, json_encode($data), 0); 
  @shmop_close($shmid);

  return $data;
 }
 $data = json_decode(preg_replace(&#39;/[\x00-\x1F\x80-\x9F]/u&#39;, &#39;&#39;, trim(shmop_read($shmid, 0, $this->_memory_size))), true);
 @shmop_close($shmid);
 return $data; 

 }

 public function return_skill_list() {<!-- --> //这里是一个超大的数组,其实就是把这个数组json化,然后存入共享内存段。 其实可以用redis等其他缓存...这里我就是为了不用redis等其他nosql才用的shmop
 return array (
=> 
 array (&#39;id&#39; => &#39;1&#39;,&#39;animation&#39; => &#39;13&#39;,&#39;skill_type&#39; => &#39;1&#39;,&#39;power_type&#39; => &#39;1&#39;,&#39;site&#39; => &#39;1&#39;,&#39;type&#39; => &#39;1&#39;,&#39;paramete&#39; => &#39;0&#39;,&#39;paramete2&#39; => &#39;0&#39;,&#39;paramete3&#39; => &#39;0&#39;,&#39;chance&#39; => &#39;0&#39;,&#39;ratio&#39; => &#39;1&#39;,
 ),
=> 
 array (&#39;id&#39; => &#39;2&#39;,&#39;animation&#39; => &#39;3&#39;,&#39;skill_type&#39; => &#39;2&#39;,&#39;power_type&#39; => &#39;1&#39;,&#39;site&#39; => &#39;1&#39;,&#39;type&#39; => &#39;1&#39;,&#39;paramete&#39; => &#39;0&#39;,&#39;paramete2&#39; => &#39;0&#39;,&#39;paramete3&#39; => &#39;0&#39;,&#39;chance&#39; => &#39;0&#39;,&#39;ratio&#39; => &#39;2&#39;,
 ),..........................................
Salin selepas log masuk

当然你要考虑的是,如果数据更新的话,那么内存段也要删除,并且更新数据…通过shmop_delete可以删除 。这就需要你们自己根据项目应用来考虑了

还有就是这篇文章只是为了简单的读,并没有出现复杂的读写,否则可能会出现进程互斥等意想不到的冲突如果复杂,那么就可以考虑信号量了。

Atas ialah kandungan terperinci Contoh terperinci tentang cara PHP mencipta memori kongsi untuk mengurangkan beban. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:jb51.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan