Artikel ini membawakan anda pengetahuan yang berkaitan tentang php+yac terutamanya tentang cara menggantikan memcache APCU dengan Yac. Rakan-rakan yang berminat boleh lihat di bawah.
yac cache
Yac ialah cache data pengguna memori yang dikongsi dan bebas kunci untuk PHP. Ia boleh digunakan untuk menggantikan APC atau memcached tempatan. Produk Niao Ge mestilah berkualiti tinggi
Keperluan
PHP 7 +
Pasang
$/path/to/phpize $./configure --with-php-config=/path/to/php-config $make && make install
Nota
Yac ialah cache tanpa kunci, anda harus cuba mengelak atau mengurangkan kebarangkalian berbilang proses menetapkan kunci yang sama
Yac Menggunakan crc separa, lebih baik anda susun semula kandungan cache untuk meletakkan bait (pembolehubah) paling ketara di kepala atau ekor
Sekatan
Kunci cache tidak boleh lebih besar daripada 48 (YAC_MAX_KEY_LEN) bait
Kandungan cache tidak boleh lebih besar daripada 64M (YAC_MAX_LE_NUE_RAW_RAW ) bait
Nilai cache termampat tidak boleh lebih besar daripada 1M 1M (YAC_MAX_VALUE_COMPRESSED_LEN) bait
konfigurasi ini
yac.enable = 1 yac.keys_memory_size = 4M ; 4M can get 30K key slots, 32M can get 100K key slots yac.values_memory_size = 64M yac.compress_threshold = -1 yac.enable_cli = 0 ; 是否使用cli启用yac,默认为0 yac.serializer = php ; yac2.2.0以来,yac使用的特定seralizer json(-- enable-json) 、msgpack(-- enable-msgpack) 或igbinary(-- enable-igbinary)
Malar
YAC_VERSION YAC_MAX_KEY_LEN = 48 ; if your key is longer than this, maybe you can use md5 result as the key YAC_MAX_VALUE_RAW_LEN = 64M YAC_MAX_VALUE_COMPRESSED_LEN = 1M YAC_SERIALIZER_PHP = 0 ; since yac-2.2.0 YAC_SERIALIZER_JSON = 1 ; since yac-2.2.0 YAC_SERIALIZER_MSGPACK = 2 ; since yac-2.2.0 YAC_SERIALIZER_IGBINARY = 3 ; since yac-2.2.0 YAC_SERIALIZER ; serializer according to yac.serializer, default is YAC_SERIALIZER_PHP
Beri perhatian kepada masalah yang akan berlaku di bawah cli
Jika cli digunakan, konfigurasi ini mesti didayakan untuk membolehkan cli-enable
<?php use Doraemon\pockets\datebase\ShareCache; //实例化缓存封装类 $cache = new ShareCache('test'); //设置缓存 $cache->set([1,2,3,5,6]); //获取缓存 $a = $cache->get(); //备注 1.由于yac的缓存是共享的,所以在多个项目中使用时,需要注意key的唯一性,否则会出现缓存覆盖的情况 //备注 2.由于cli在执行后会自动退出,所以在cli中使用时,需要注意缓存的有效期,当再次执行时候换存是拿不到的 //例如 //例 //step 1 <?php use Doraemon\pockets\datebase\ShareCache; $cache = new ShareCache('test'); //设置缓存 $cache->set([1,2,3,5,6]); //php step1.php //执行后会自动退出,缓存失效 <?php use Doraemon\pockets\datebase\ShareCache; //step 2 $cache = new ShareCache('test'); //设置缓存 $arr = $cache->get(); var_dump($arr);// 空 //php step2.php //执行事后上一个进程已经退出,所以缓存失效
Kaedah
Yac::__construct
Yac::__construct([string $prefix = ""])
Pembina Yac, anda boleh menentukan awalan yang akan digunakan apabila melakukan set/get/delete Apabila diprapend pada sebarang kekunci
<?php $yac = new Yac("myproduct_"); ?>
Yac::set
Yac::set($key, $value[, $ttl = 0]) Yac::set(array $kvs[, $ttl = 0])
menyimpan nilai ke dalam cache Yac, kunci adalah unik kepada cache, jadi Menyimpan nilai kedua dengan kunci yang sama akan menimpa nilai asal.
Kembalikan benar jika berjaya, palsu jika ralat berlaku (jika tiada ingatan, cas write right tidak boleh diperolehi)
<?php $yac = new Yac(); $yac->set("foo", "bar"); $yac->set( array( "dummy" => "foo", "dummy2" => "foo", ) ); ?>
Nota:
Jika Yac 2.1, yang mungkin gagal jika perbalahan cas gagal, anda mungkin perlu melakukan perkara berikut:
while (!($yac->set("important", "value")));
Yac::get
Yac::get(array|string $key[, &$cas = NULL])
Dapatkan pembolehubah storan daripada cache . Jika tatasusunan diluluskan, setiap elemen diambil dan dikembalikan. Mengembalikan nilai pada kejayaan, palsu pada ralat
<?php $yac = new Yac(); $yac->set("foo", "bar"); $yac->set( array( "dummy" => "foo", "dummy2" => "foo", ) ); $yac->get("dummy"); $yac->get(array("dummy", "dummy2")); ?>
Yac::delete
Yac::delete(array|string $keys[, $delay=0])
Memadamkan pembolehubah yang disimpan daripada cache. Jika kelewatan ditentukan, nilai akan dipadamkan selepas $delay saat.
Yac::flush
Yac::flush()
Batalkan semua item sedia ada serta-merta. Ia sebenarnya tidak mengeluarkan sebarang sumber, ia hanya menandakan semua item sebagai tidak sah.
Yac::info
Yac::info(void)
Dapatkan maklumat cache
<?php .... var_dump($yac->info()); /* will return an array like: array(11) { ["memory_size"]=> int(541065216) ["slots_memory_size"]=> int(4194304) ["values_memory_size"]=> int(536870912) ["segment_size"]=> int(4194304) ["segment_num"]=> int(128) ["miss"]=> int(0) ["hits"]=> int(955) ["fails"]=> int(0) ["kicks"]=> int(0) ["slots_size"]=> int(32768) ["slots_used"]=> int(955) } */
<?php namespace Test\Cache use Yac; use RuntimeException; /** * 共享缓存类 * Date: 2023/2/22 * Time: 16:13 * docs: */ class ShareCache { public bool $isEnable = true; public string $key = ''; /** * * 共享内存块实例化。 */ public function __construct($key) { if (!extension_loaded("yac")) { $this->isEnable = false; throw new RuntimeException('yac 扩展不存在!'); } if (!$key) { throw new RuntimeException('key 不能为空!'); } $this->key = md5($key); } /** * * 获取共享内存块的值。 */ public function get() { if ($this->isEnable) { return (new Yac('db_'))->get($this->key); } throw new RuntimeException('yac is not enable ,skip getCache'); } /** * * 设置共享内存块的值。 */ public function set($var): bool { if ($this->isEnable) { return (new Yac('db_'))->set($this->key, $var, 3600); } throw new RuntimeException('yac is not enable ,skip setCache'); } /** * * 删除共享内存块的值。 */ public function del(): bool { if ($this->isEnable) { return (new Yac('db_'))->delete($this->key); } throw new RuntimeException('yac is not enable ,skip delCache'); } /** * * 获取共享内存块的信息。 */ public function info(): array { if ($this->isEnable) { return (new Yac('db_'))->info(); } throw new RuntimeException('yac is not enable ,skip info'); } /** * * 清空共享内存块的值。 */ public function flush(): bool { if ($this->isEnable) { return (new Yac)->flush(); } throw new RuntimeException('yac is not enable ,skip flush'); } }
Pembelajaran yang disyorkan: "Tutorial video PHP 》
Atas ialah kandungan terperinci Cache kongsi PHP Yac menggantikan memcache APCU!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!