我遇到了批量通讯发送用PHP编写的后台脚本的麻烦。
我注意到通过浏览器运行php和通过php可执行文件之间存在很多差异。我假设这是因为可执行文件直接执行的php脚本与apache没有任何交互。 例如,我必须在调用脚本或将其解析为参数之前将DOCUMENT_ROOT设置为环境变量,因为未定义$ _SERVER [“DOCUMENT_ROOT”]。
现在,当我尝试通过PDO连接到我的数据库时,我遇到了这个问题。这是发生的事情:
C:/Users/hedge/Dev/PHPStorm/gpstudios/www/files/processes/send_newsletters.php hfBH6rCA 2>&1
log.js:137 Warning: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: No such host is known. in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php on line 42
Call Stack:
0.0003 126144 1. {main}() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:0
0.0016 155392 2. getConnection() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:14
0.0023 196416 3. Connection->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\inc\config.php:20
0.0023 196760 4. PDO->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php:42
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: No such host is known. ' in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php on line 42
PDOException: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: No such host is known. in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php on line 42
Call Stack:
0.0003 126144 1. {main}() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:0
0.0016 155392 2. getConnection() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:14
0.0023 196416 3. Connection->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\inc\config.php:20
0.0023 196760 4. PDO->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php:42
PHP Warning: PDO::__construct(): php_network_getaddresses: getaddrinfo failed: No such host is known. in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php on line 42
PHP Stack trace:
PHP 1. {main}() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:0
PHP 2. getConnection() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php:14
PHP 3. Connection->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\inc\config.php:20
PHP 4. PDO->__construct() C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php:42
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: No such host is known. ' in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php:42
Stack trace:
#0 C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php(42): PDO->__construct('mysql:host=loca...', '<redacted>', '<redacted>')
#1 C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\inc\config.php(20): Connection->__construct('localhost', '<redacted>', '<redacted>', '<redacted>')
#2 C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\processes\send_newsletters.php(14): getConnection()
#3 {main}
thrown in C:\Users\hedge\Dev\PHPStorm\gpstudios\www\files\class\Connection.php on line 42
似乎无法解析localhost,但它没有在日志中明确报告。
我该如何解决这个问题?
如果我用'127.0.0.1'替换PDO构造函数中的'localhost',它就可以了。显然问题在于解析localhost。 我正在使用proc_open()来启动脚本。我发现如果我通过CMD提示运行脚本,它就可以了。 它看起来像这样:start / B php C:\ Users \ hedge \ Dev \ PHPStorm \ gpstudios \ www \ files \ processes \ send_newsletters.php
问题似乎是proc_open然后......
修改
这个问题仍然没有得到解决,但我已经解决了它的根源:
proc_open($ cmd,[['pipe','r'],['pipe','w'],['pipe','w']],$ pipes,NULL,$ environment_variables); < / p>
问题是$ environment_variables,一个关联数组,它包含 - 你猜对了 - 环境变量。 我在php.net上遇到过这个问题:http://php.net/manual/en/function.proc-open.php#117912
对于那些发现使用$ cwd和$ env选项导致proc_open失败(windows)的人。您将需要传递所有其他服务器环境变量;
但是,即使我这样做,它仍然无法解析localhost。
编辑2
问题已解决。有用的用户在php.net上提供的代码使用了数组($ _ SERVER),实际上,你只需要$ _SERVER。 所以代码现在看起来像:
proc_open($cmd, [['pipe', 'r'],['pipe', 'w'],['pipe', 'w']], $pipes, NULL, array_merge($_SERVER, $environment_variables))
好哇!感谢大家的帮助。
答案 0 :(得分:1)
Solutuion在这里找到:http://php.net/manual/en/function.proc-open.php#117912
对于那些发现使用$ cwd和$ env选项导致的人 proc_open失败(窗口)。您将需要通过所有其他服务器 环境变量;
有用的用户稍微有点错误,他们把$ _SERVER放在一个数组中。这对我有用:
locations/urls.py
答案 1 :(得分:0)