我在服务器日志中发现一个 PHP 错误,内容如下:
[02:09:27 UTC] PHP 致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000] [2002] 没有这样的文件或目录”,位于 /var/www/include/db_connect.php:7
堆栈跟踪:
`#0 /var/www/include/db_connect.php(7): PDO->__construct('mysql:dbname=my...', 'apache', '123...')
进一步检查发现,该错误发生在服务器启动时。日志包含以下相关行:
02:09:22 systemd[1]: Starting The Apache HTTP Server...
02:09:22 systemd[1]: Starting MariaDB database server...
02:09:22 systemd[1]: Starting The PHP FastCGI Process Manager...
02:09:24 systemd[1]: Started The Apache HTTP Server.
02:09:25 mysqld_safe[713]: Logging to '/var/log/mariadb/mariadb.log'.
02:09:25 mysqld_safe[713]: Starting mysqld daemon with databases from /var/lib/mysql
02:09:25 systemd[1]: Started The PHP FastCGI Process Manager.
02:09:28 NetworkManager[579]: <info> startup complete
02:09:28 systemd[1]: Started MariaDB database server.
既然 PHP 错误发生在第 27 秒,即 Apache 启动三秒后,那么为什么 PHP 会抱怨找不到文件?无论如何,是否应该反转 Apache、PHP-FPM 和 MariaDB 的启动顺序,以便最后启动 Apache?
答案1
虽然 PHP 错误发生在 Apache 启动三秒后,但 MariaDB 启动完成前仍有一秒的时间。
查看 PHP 文件的第 7 行可能会有所帮助db_connect.php
。我敢打赌它正在尝试使用套接字连接到数据库,并且由于数据库尚未创建套接字,因此您会收到错误No such file or directory
。
我猜你这里只有一台服务器运行所有东西,而不是一个具有独立数据库和 Web 层的池。因此,在服务器重新启动时,你的网站会关闭,并且在数据库启动之前,前几个请求也会失败。如果你想提高正常运行时间,你将需要某种集群。如果你只是想防止错误发生,请确保在启动 Apache 之前数据库已启动。实现此目的的方法取决于你的发行版。