我有以下代码
$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)
为什么忽略端口选项?该命令在命令行上运行良好。
答案 0 :(得分:3)
看到的错误
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
,即加载网络代码,正在失败。
同样的命令可以从命令行运行,很可能是因为命令行中的环境包含更多。
答案 1 :(得分:1)
proc_open的$ env参数替换当前环境,但如果为NULL,则使用当前进程的环境。
一种可能的解决方案是使用putenv()来改变当前环境,而不是为$ env指定一个新数组。让环境继承有效。
我特意使用symphony / process组件启动PHP进程时遇到了这个问题。一切都在Linux中工作正常,但在没有网络访问权限的Windows服务器中,该过程失败。对于$ env使用putenv()和NULL在两种操作系统情况下都能正常工作,并解决了这个问题。 putenv()的效果仅持续发出请求的持续时间,因此它应该是安全的,除非您的更改导致脚本的其余部分出现问题,或者当前环境中存在不应该看到的内容在开放的过程中。
我在google搜索答案,这些信息肯定帮助我找到了解决方案。帮助原始海报可能太长了,但也许它可以帮助下一个人。
答案 2 :(得分:0)
尝试关闭防火墙或启用端口