Answers:
我有同样的问题,下面我用它来选择要使用的PHP。 /usr/local/etc/php/7.2/bin/php bin/magento setup:di:compile
请参阅官方文档: SQLSTATE [HY000] [2002]没有此类文件或目录
这通常是由于与Web服务器相比,PHP命令行使用的PHP实例不同。特别mysql.sock
是在这种情况下,可能配置错误。
要确定您是否正在使用一个PHP实例:
输入以下命令:
php -i | grep 'php.ini'
这确定了PHP命令行界面(CLI)使用的设置。请注意php.ini
位置。
phpinfo.php
在您的网络服务器上设置一个。phpinfo.php
从一个php -i
。phpinfo.php
显示php.ini
您的Web服务器使用的文件。如果与PHP中的不同php.ini
,则必须使PHP CLI和Web服务器的所有PHP设置保持一致。
有关其他详细信息,请参阅Web服务器随附的文档。
我可以通过外壳程序使用几个版本的PHP-键入php并按tab显示我的自动完成功能知道哪些版本。
对我来说,PHP 5.4、5.5和5.6都可以正常工作,但是PHP 7找不到mysql.sock,并且由于该问题中讨论的“ SQLSTATE [HY000] [2002]没有这样的文件或目录错误”而崩溃。。
# Prints [ok]
echo "<?php print(new mysqli('localhost', 'root', 'root', 'mysql') ? '[ok]' : '[error]').PHP_EOL; ?>" | php-5.6.20
# Prints [error] and shows a warning
echo "<?php print(new mysqli('localhost', 'root', 'root', 'mysql') ? '[ok]' : '[error]').PHP_EOL; ?>" | php-7.0.8
要查看您的mysql服务器所在的套接字,请使用以下命令:
cat /etc/mysql/my.cnf | grep socket
就我而言,在我的无业游民的系统中安装了Percona Mysql之后,袜子套接字文件恰好位于这里:
/var/run/mysqld/mysqld.sock
(注意,它被称为mysqld,而不仅仅是mysql)
我有多个版本的php供您选择,这些命令向我展示了哪些有问题,哪些有问题:
对我来说,答案只是在流浪者置备程序脚本中包含代码以在/tmp/mysql.sock和/var/run/mysqld/mysqld.sock之间创建符号链接。
if [ ! -L /tmp/mysql.sock ]; then
echo "Creating symbolic link for php 7 to connect to mysql.sock"
ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock
fi
有了新的symlink,以前给出的测试脚本现在可以完美地用于所有版本的PHP,并且我可以在代码中使用localhost,而不必提供127.0.0.1 IP地址。