yac扩展

yac扩展

yac扩展是鸟哥写的一个php扩展,达到跟memcache类似的缓存效果,但是,却有很大的不同。下面,说一下感受。

yac安装

安装很简单,基本上是php常用的安装扩展的那一套。直接从pecl找到源码,下载安装即可。安装好后,记得要在php.ini制定 .so格式扩展的位置,如果需要配置,可以在.ini中指定。

使用

既然缓存嘛,就是常用的那一套,setgetdelete之类的。

$yac = new Yac();
$yac->set('scc',[1,2,3]);
var_dump($yac->get('scc'));
$yac->delete('scc');

生命周期

由于是php扩展,所以必须要知道php的生命周期,才能更好的使用它。

php 模块初始化——请求初始化——执行脚本——请求结束——模块执行结束。

上述5个阶段,如果是php-fpm模式的话,模块初始化、模块执行结束阶只在php-fpm最开始执行时,执行一次,然后进程复制,所有的请求,都省略了模块的执行。

对于yac扩展,在模块初始化进行分配yac存储空间、模块执行结束阶回收yac已分配的空间。这样,如果fpm如果不重启,变量能实现缓存。

那么说一下,为啥php在cli模式运行,为啥不能用到yac的缓存。

其实说,用不到yac缓存,那是错误的,只是不能共享。如在 php yac1.php设置了一个缓存的变量,然后yac1.php执行结束后,由于经历了模块初始化、跟模块结束阶段,在模块结束,自然要回收空间。

所以,再次执行php yac1.php的时候,由于上次执行已回收了yac分配的空间,这次执行,在模块初始化的时候,又重新分配了新的空间,所以内容为空。

那么,还有一种情况,如果yac1.php中设置一个缓存,但是利用sleep不退出改进程,然后重新执行一个php yac2.php进程,然后尝试读取yac1.php中设置的缓存,那么能读取到吗?答案是,还是读取不到。可能是,因为它们是两个进程,分配的yac空间,不是同一个,所以,读不到。

那么,既然,两个进程无法共享yac空间,为啥php-fpm的能共享呢?

回答这个问题,要明白,php-fpm的进程,实际上是由master进程复制而来,而master进程中,已经分配好了yac的空间,子进程,当然能共享,该空间。所以,猜测,如果一个子进程销毁掉了,其不会触发模块结束,否则就回收掉了yac的内容空间。子进程,应该执行的是,请求初始化——脚本执行——请求结束阶段过程,如果销毁,就销掉了呗。而主进程,应该在销毁的时候执行,多了模块初始化、模块结束阶段过程。

那么,如果cli模块下,真的想用yac来在多个进程共享,如果共享呢?按着前面的叙述,自己复制出子进程,那么能在这种情况下达到共享的目的。

优缺点

  • yac的优点

    首先,它是用php扩展实现的缓存,所以,在语言方面,能很方便的调用,不负责。不需要额外搭设缓存中间件服务。配置好扩展即可。

  • 缺点

    其实,缺点也比较明显,那就是yac扩展只能单机使用,而不能多机共享。这个也是无法改变的事实。所以,使用场景比较有限,而且,只能作为php的缓存,而不能用到其他语言上。除了单机服务,其他的,要用到,感觉非常不好用吧。

总结,感觉用处不达。除了想学学如何写php扩展,和个人博客上使用。