PHP进程在窗口上打开问题


PHP proc_open problems on windows

我有以下代码

$env=array('PATH'=>'C:'Program Files'MySQL'MySQL Server 5.1'bin',
           'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC');
$cmd='mysql "--port=3306" "--host=127.0.0.1" "--user=root" "--password=xxxx" <"C:'Projects/script.sql" 2>&1';
print $cmd;
$proc = proc_open($cmd, $descriptorspec, $pipes, NULL, $env) or die("Cannot run $cmd");
while ($line=fgets($pipes[1])) print $line;
print "'n'nCompleted'n";

我得到的输出是

ERROR 2004 (HY000): Can't create TCP/IP socket (10106)

为什么端口选项被忽略?该命令在命令行上运行良好。

看到的错误

ERROR 2004 (HY000): Can't create TCP/IP socket (10106)

是由mysql引发的,因此mysql进程实际上已经启动。

此错误对应于CR_IPSOCK_ERROR,并打印出问题的根本原因:10106

快速搜索给出:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx

特别是:

WSAEPROVIDERFAILEDINIT
10106
Service provider failed to initialize.
The requested service provider could not be loaded or initialized. This error is returned if either a service provider's DLL could not be loaded (LoadLibrary failed) or the provider's WSPStartup or NSPStartup function failed.

我认为这与端口号被"忽略"无关,更不用说防火墙问题了。

proc_open创建的环境似乎足够好,可以启动mysql进程,但还不够完整,因此从该进程中调用LoadLibrary(即加载网络代码)失败。

同一个命令在命令行中起作用,很可能是因为命令行中的环境包含更多。

proc_open的$env参数将替换当前环境,但如果为NULL,则使用当前进程的环境。

一个可能的解决方案是使用putenv()来更改当前环境,而不是为$env指定一个新数组。让环境继承发挥作用。

我在使用symphony/process组件启动PHP进程时遇到了这个问题。在linux中一切都很好,但在没有网络访问的windows服务器中,这个过程失败了。对$env使用putenv()和NULL在这两种操作系统下都很好,并解决了问题。putenv()的效果只会持续到发出它的请求的持续时间,因此它应该是安全的,除非您的更改导致脚本的其余部分出现问题,或者当前环境中存在不应该在打开的进程中看到的内容。

我在谷歌上搜索了一下这里的答案,这些信息无疑帮助我找到了解决方案。可能已经花了很长时间来帮助最初的海报,但也许它可以帮助下一个人。

尝试关闭防火墙或启用端口