最近在做一个go和php之间进程通信的项目,想利用 共享内存来实现数据共享。
技术本身并不复杂,GO利用cgo绑定c的shm函数,PHP本身就有这个扩展,只要编译的时候--enable-shmop即可。
但在实际过程中发现总是没办法获取到共享内存,后面仔细检查了一下发现是 ftok的实现不同。
C 里面ftok第二个参数是int, 而php里面是字符串。
最后在网上找了一段php实现 的ftok才解决问题,特此记录下来。
function myftok($pathname, $proj_id)
{
$st = @stat($pathname);
if (!$st) {
return -1;
}
$key = sprintf("%u", (($st['ino'] & 0xffff) | (($st['dev'] & 0xff) << 16) | (($proj_id & 0xff) << 24)));
return $key;
}