2012-03-28 16 views
8

Ho il seguente codicePHP proc_open problemi sulle finestre

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

E l'uscita ottengo è

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

Perché l'opzione di porta viene ignorata? Il comando funziona perfettamente sulla riga di comando.

+2

funziona dalla linea cmd? Potrebbe un problema di autorizzazione. (detto questo, perché non usare l'estensione mysql? :) – Pierre

+0

Hmmm ... una libreria di connessione MySQL in PHP? Interessante ... – Xeoncross

+0

hai provato ad includere la cartella windows in un percorso env var? – Michal

risposta

3

L'errore visto

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

è sollevato da MySQL, in modo che il processo di mysql effettivamente iniziato.

Questo errore corrisponde al CR_IPSOCK_ERROR, e viene stampato la causa principale alla base del problema: 10106.

Una rapida ricerca dà:

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

ed in particolare:

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. 

Io non credo che questo abbia a che fare con il numero di porta di essere "ignorata", e anche meno problemi con il firewall.

Sembra che l'ambiente creato da proc_open sia sufficiente per avviare il processo mysql, ma non ancora completo, in modo che le chiamate a LoadLibrary all'interno di tale processo, per caricare il codice di rete in particolare, stiano fallendo.

Lo stesso comando funziona dalla riga di comando, molto probabilmente perché l'ambiente nella riga di comando contiene molto altro.

0

cercare di disattivare il firewall o abilitare la porta

+0

Ho provato quello –

+0

se telnet quella porta, quale contenuto è acceso? oppure, non puoi raggiungere il porto? – danielpopa

+0

Esiste ora quella porta –

1

L'argomento $ env per proc_open sostituisce l'ambiente corrente, ma se è NULL, viene utilizzato l'ambiente del processo corrente.

Una possibile soluzione sarebbe utilizzare putenv() per modificare l'ambiente corrente invece di specificare un nuovo array per $ env. Lascia che l'ereditarietà dell'ambiente funzioni.

Ho riscontrato questo problema in particolare utilizzando il componente symphony/process per avviare un processo PHP. Tutto ha funzionato bene in linux, ma il processo ha avuto esito negativo nei server Windows senza accesso alla rete. L'uso di putenv() e NULL per $ env ha funzionato bene in entrambi i casi del sistema operativo e ha risolto il problema. L'effetto di putenv() dura solo per la durata della richiesta che lo emette, quindi dovrebbe essere sicuro a meno che le tue modifiche non causino problemi con il resto del tuo script, o ci siano cose nell'ambiente corrente che non dovrebbero essere viste nel processo aperto.

Ho cercato qui la mia ricerca di risposte e l'informazione mi ha sicuramente aiutato a trovare una soluzione. Probabilmente è stato troppo lungo per aiutare il poster originale, ma forse può aiutare la persona successiva.

Problemi correlati