PHP proc_open проблемы на окнах - PullRequest
8 голосов
/ 29 марта 2012

У меня есть следующий код

$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)

Почему опция порта игнорируется? Команда отлично работает в командной строке.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

Наблюдаемая ошибка

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 голос
/ 22 мая 2014

Аргумент $ env для proc_open заменяет текущую среду, но если она имеет значение NULL, используется среда текущего процесса.

Возможным решением будет использование putenv () для изменения текущей среды.вместо указания нового массива для $ env.Пусть наследование среды работает.

Я столкнулся с этой проблемой, в частности, с использованием компонента symphony / process для запуска процесса PHP.В Linux все работало нормально, но процесс не удался на серверах Windows без доступа к сети.Использование putenv () и NULL для $ env отлично работало в обоих случаях и решило проблему.Эффект функции putenv () действует только на время запроса, который его выдает, поэтому он должен быть безопасным, если ваши изменения не вызывают проблем с остальной частью вашего сценария или если в текущей среде есть вещи, которые не должны быть видныв открытом процессе.

Я гуглил свой путь здесь в поисках ответов, и информация определенно помогла мне найти решение.Возможно, слишком долго помогать оригинальному постеру, но, возможно, это может помочь следующему человеку.

0 голосов
/ 02 апреля 2012

попробуйте отключить брандмауэр или включить порт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...