我有一个脚本,它在后台工作,并通过unix套接字接受连接。
所以,我写了另一个连接到第一个脚本的脚本
我已经从CLI检查了它,一切正常。
No such file or directory。
调用socket_connect
函数时抛出此异常
听起来没有套接字文件。但确实存在。此时我可以使用此脚本连接到此套接字,但仅限于CLI。
有什么想法吗?
更新
这是代码:
$filepath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'checkerd.sock';
$socket = socket_create(AF_UNIX, SOCK_STREAM, null);
$result = socket_connect($socket, $filepath, 0);
if ($result === false) {
print_r(socket_strerror(socket_last_error()));
}
答案 0 :(得分:1)
所以,我找到了答案:
systemd
有一个功能"私人tmp"。它将/ tmp(和/ var / tmp)安装为每个进程的私有文件系统。
我的套接字服务器是从控制台运行的(代表php cli)。这就是为什么当我将客户端作为控制台脚本运行时,我能够连接到它。这就是为什么当从php-fpm(另一个进程)运行时,相同的脚本没有看到套接字文件。
解决方法是禁用php-fpm的私有tmp:
我已创建/etc/systemd/system/php-fpm.service.d/private-tmp.conf
内容:
[Service]
PrivateTmp=false
php-fpm必须在此之后重启。