mysql - PHP proc\_open problemer på windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har følgende kode


$env=array('PATH'=>'C:Program FilesMySQLMySQL Server 5.1in',
           '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 "

Completed
";


Og den output jeg får er


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


Hvorfor ignoreres portindstillingen? Kommandoen fungerer perfekt godt på kommandolinjen.

Bedste reference


Fejlen set


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


er rejst af mysql, så mysql processen faktisk startede.


Denne fejl svarer til CR\_IPSOCK\_ERROR, og den udskriver den grundlæggende årsag til problemet: 10106.


En hurtig søgning giver:


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


og især:


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.


Jeg tror ikke, at dette har noget med portnummeret at blive 'ignoreret' og endnu mindre firewall-problemer.


Det ser ud som om miljøet, der er skabt af proc\_open, er godt nok til at starte mysql-processen, men alligevel ikke færdig nok, så at opkald til LoadLibrary fra den pågældende proces, for at indlæse netværkskoden nemlig, fejler .


Samme kommando fungerer fra kommandolinjen, sandsynligvis fordi miljøet i kommandolinjen indeholder meget mere.

Andre referencer 1


$ Env-argumentet til proc\_open erstatter det nuværende miljø, men hvis det er NULL, bruges miljøet i den aktuelle proces.


En mulig løsning ville være at bruge putenv () til at ændre det aktuelle miljø i stedet for at angive et nyt array for $ env. Lad miljøarven arbejde.


Jeg stødte på dette problem specifikt ved hjælp af symfonien/proceskomponenten for at starte en PHP-proces. Alt fungerede fint i Linux, men processen fejlede i Windows-servere uden adgang til netværk. Brug putenv () og NULL for $ env fungerede fint under begge OS-sager og løst problemet. Virkningen af ​​putenv () varer kun i varigheden af ​​den anmodning, der udsteder den, så det skal være sikkert, medmindre dine ændringer forårsager problemer med resten af ​​scriptet, eller der er ting i dit nuværende miljø, som ikke bør ses i den åbne proces.


Jeg googled min vej her på udkig efter svar, og oplysningerne hjalp mig definitivt til en løsning. Det har sandsynligvis været for længe at hjælpe den oprindelige plakat, men måske kan den hjælpe den næste person.

Andre referencer 2


Prøv at slukke din firewall eller aktivere port