Случайный код выхода 1 после обновления, используя php proc_open для выполнения узла & npm
Я действительно не могу понять это.
Что может быть причиной того, что мой локальный хост Wamp иногда выдает ошибку (код выхода 1) при обновлении страницы?
Тот же сценарий, то же исполнение... но по какой-то причине время от времени я получаю exitcode 1
И мой тест с npm list
считает, что его текущий рабочий каталог находится в папке установки Apache (я серьезно не знаю, откуда он это взял...)
Этот вопрос немного сложно объяснить словами, поэтому вот захват GifCam:
================================================== ===
================================================== ===
Я пробовал кучу разных вещей, чтобы изолировать, где проблема может быть:
- Пробовал разные браузеры (Firefox, Chrome и IE 11).
- Установка новой версии Wamp (была на 32-битном Wamp, теперь Wamp64).
- Переход с PHP 5.6.16 на PHP 7.0.0.
- Пытаюсь закрыть все
proc_open
трубы после того, как это называется.
Некоторые заметки / наблюдения:
- Работает на Windows 7 64bit (bootcamped).
- Установка Apache происходит на диске C: (жесткий диск).
- Проект PHP работает на диске W: (SSD).
- апача
/www/
папка содержит символическую ссылку, указывающую наW:\_WWW\
, - NodeJS установлен на диске C:.
- Ошибка возникает чаще всего после того, как я внесу изменения в скрипт PHP или узел js. После нескольких обновлений он работает нормально (на более регулярной основе).
Я склоняюсь к тому, что есть вероятность, что это вызвано символической ссылкой, но я искал известные подобные проблемы в сети, и ничто, кажется, не близко к этому.
Вот пример кода:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>CMS</title>
</head>
<body>
<a href='?node=npm&node_args=list'>Click to run "npm list"</a><br/>
<pre>
<?php
if(!isset($_GET['node'])) die();
function trace($msg) { echo "$msg\n"; }
$errorFile = "./.node-errors.txt";
$descriptorspec = [
0 => ["pipe", "r"], // stdin is a pipe that the child will read from
1 => ["pipe", "w"], // stdout is a pipe that the child will write to
2 => ["file", $errorFile, "a"] // stderr is a file to write to
];
$nodeCommand = $_GET['node'];;
if(isset($_GET['node_args'])) {
trace("NodeJS Args: " . $_GET['node_args'] . "\n\n");
$nodeArgs = $_GET['node_args'];
} else {
$nodeArgs = '';
}
//??? test
//$nodeCommand $nodeArgs
$process = proc_open("npm list", $descriptorspec, $pipes, getcwd());
if (is_resource($process)) {
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[0]);
//fclose()
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
if ($return_value !== 0) {
trace("ERROR: command returned $return_value");
echo file_get_contents($errorFile);
//file_put_contents($errorFile, ''); //Clear the error
} else {
trace("===============================\nCompleted server-side command.");
}
}
?>
</pre>
</body>
</html>
Есть идеи?
ОБНОВИТЬ:
В случае, если это стоит упомянуть - проект, в котором я работаю, управляется версией (Git), и обычно у меня открыт рабочий стол Github. Может быть, это вызывает проблемы при мониторинге изменений файлов? Собираюсь держать это закрытым завтра...