2012-03-28 76 views
8

问题,我有以下代码PHP proc_open在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) 

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

+2

它可以从cmd行工作吗?这可能会导致许可问题。 (这就是说,为什么不使用mysql扩展?:) – Pierre 2012-04-01 13:38:17

+0

嗯... PHP中的MySQL连接库?有趣的... – Xeoncross 2012-04-02 19:32:27

+0

你试过在路径env var中包含windows文件夹吗? – Michal 2012-04-03 17:21:34

回答

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来加载网络代码即失败。

相同的命令从命令行工作,很可能是因为命令行中的环境包含更多。

0

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

+0

我试过 – 2012-04-02 18:55:44

+0

,如果你telnet那个端口,它的内容是什么?或者,你无法到达港口? – danielpopa 2012-04-02 19:15:54

+0

那个端口上现在有 – 2012-04-02 19:39:54

1

proc_open的$ env参数取代当前环境,但是如果它为NULL,则使用当前进程的环境。

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

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

我在这里搜索我的方式寻找答案,这些信息明确帮助我找到解决方案。帮助原始海报可能太长,但也许它可以帮助下一个人。