我有一个在 Hyper-V 中运行的 Fedora 25 VM。该虚拟机用于在 Apache 上运行的 PHP 应用程序。它是最新的并且正在运行的所有东西。
连接到远程网站的简单 php 脚本在 Apache 中运行时失败,但在命令行中运行良好:
$host='tcp://www.shinyandnew.ca/';
$socket = stream_socket_client($host, $errno, $errstr, 10, STREAM_CLIENT_CONNECT, stream_context_create());
if (!$socket) {
print ("Unable to connect to ${host}: ${errno} ${errstr}\n");
} else {
print ("Connected to ${host} successfully \n");
fclose($socket);
}
错误是
php_network_getaddresses:getaddrinfo 失败:名称或服务未知
但是,虚拟机具有网络访问权限,并且 php 命令行一切正常。这表明这是一个 Apache 问题。另外:如果我重新启动 Apache,问题就会消失。
因此我的问题是:
如何强制 Apache 在重新启动后正确解析名称?如果我需要在每次网络更改后重新加载 Apache,这对于此安装来说是可以接受的(它是一个开发工作站):如何自动触发它以便它在启动时工作?有没有一个 systemd 方法可以做到这一点?
答案1
您不需要触发重新加载或重新启动。您只需要确保 Apache 不会启动,直到/etc/resolv.conf
由在引导程序中执行此操作的任何程序编写完成为止。 PHP bug 跟踪器的建议是使用 systemd 覆盖文件添加一个After=
扩展名,将相关服务命名为httpd.service
:
cd /etc/systemd/系统/ 安装-m 0755 -d httpd.d echo >> httpd.d/after.conf "[单位]" echo >> httpd.d/after.conf "After=network.service systemd-networkd.service network-online.target"
进一步阅读
- 伊玛卡瑟(2017-04-20)。 如果没有主机条目,stream_socket_client 会失败。错误#74483。 PHP 错误跟踪器。
答案2
将 Apache 重新加载脚本放入/etc/NetworkManager/dispatcher.d
文件夹中。来源:无线接口启动后在 Fedora 13 中启动时运行守护进程
或者从 Upstart conf 触发 Apache 配置重新加载。
我的意思是这样的
start on net-device-up
- 但这可能是 Ubuntu 特有的。