proc_open()无法解析Windows上的localhost

时间:2015-10-06 16:17:34

标签: php pdo

我遇到了批量通讯发送用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))

好哇!感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

Solutuion在这里找到:http://php.net/manual/en/function.proc-open.php#117912

  

对于那些发现使用$ cwd和$ env选项导致的人   proc_open失败(窗口)。您将需要通过所有其他服务器   环境变量;

有用的用户稍微有点错误,他们把$ _SERVER放在一个数组中。这对我有用:

locations/urls.py

答案 1 :(得分:0)