2012-03-28 14 views
8

tengo el siguiente códigoproblemas PHP proc_open en las ventanas

$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"; 

Y la salida que se ve es

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

¿Por qué la opción de puerto que está siendo ignorado? El comando funciona perfectamente bien en la línea de comando.

+2

¿funciona desde la línea de cmd? Podría ser un problema de permiso. (Dicho esto, ¿por qué no usar la extensión mysql? :) – Pierre

+0

Hmmm ... ¿una biblioteca de conexión MySQL en PHP? Interesante ... – Xeoncross

+0

¿has intentado incluir la carpeta de Windows en una ruta env var? – Michal

Respuesta

3

visto el error

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

se eleva por MySQL, por lo que el proceso de MySQL en realidad comenzó.

Este error corresponde a CR_IPSOCK_ERROR, e imprime la causa raíz subyacente del problema: 10106.

Una búsqueda rápida da:

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

y en particular:

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. 

no creo que esto tiene algo que ver con el número de puerto que se "hizo caso omiso", e incluso menos problemas de firewall

Parece que el entorno creado por proc_open es lo suficientemente bueno para iniciar el proceso de mysql, pero aún no lo suficiente como para llamar al LoadLibrary desde ese proceso, para cargar el código de red, es decir, está fallando.

El mismo comando funciona desde la línea de comandos, muy probablemente porque el entorno en la línea de comandos contiene mucho más.

0

trate de desactivar el firewall o habilitar el puerto

+0

He intentado con ese –

+0

si telnet ese puerto, ¿en qué contenido está? o, no puedes llegar al puerto? – danielpopa

+0

No hay ahora en ese puerto –

1

El argumento $ env para proc_open reemplaza el entorno actual, pero si es NULL, se utiliza el entorno del proceso actual.

Una posible solución sería usar putenv() para cambiar el entorno actual en lugar de especificar una nueva matriz para $ env. Deja que la herencia del entorno funcione.

Encontré este problema específicamente utilizando el componente symphony/process para iniciar un proceso PHP. Todo funcionó bien en Linux, pero el proceso falló en los servidores de Windows sin acceso a la red. El uso de putenv() y NULL para $ env funcionó bien en ambos casos del SO, y resolvió el problema. El efecto de putenv() solo dura la duración de la solicitud que lo emite, por lo que debe ser seguro a menos que los cambios causen problemas con el resto de la secuencia de comandos, o hay cosas en su entorno actual que no deberían verse. en el proceso abierto.

Busqué en Google aquí buscando respuestas, y la información definitivamente me ayudó a encontrar una solución. Probablemente ha sido demasiado tiempo para ayudar al póster original, pero tal vez pueda ayudar a la siguiente persona.

Cuestiones relacionadas