Windows上的PHP proc_open问题

Ed *_*eal 8 php mysql 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";
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

ERROR 2004 (HY000): Can't create TCP/IP socket (10106)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*lff 3

看到的错误

ERROR 2004 (HY000): Can't create TCP/IP socket (10106)
Run Code Online (Sandbox Code Playgroud)

是由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.
Run Code Online (Sandbox Code Playgroud)

我认为这与端口号被“忽略”没有任何关系,甚至更少的防火墙问题。

看来创建的环境proc_open足以启动 mysql 进程,但还不够完整,无法调用LoadLibrary从该进程内调用(即加载网络代码)失败。

相同的命令可以在命令行中运行,很可能是因为命令行中的环境包含更多内容。