Я ищу решение, которое позволяет сценарию PHP отправлять несколько команд при появлении соответствующего запроса. Когда следующий код выполняется из оболочки:
root@host [~]# /usr/local/bin/grads-2.0.2/bin/grads -b
Этот результат приводит к:
Grid Analysis and Display System (GrADS) Version 2.0.2
Copyright (c) 1988-2011 by Brian Doty and the
Institute for Global Environment and Society (IGES)
GrADS comes with ABSOLUTELY NO WARRANTY
See file COPYRIGHT for more information
Config: v2.0.2 little-endian readline printim grib2 netcdf hdf4-sds hdf5 opendap-grids,stn geotiff shapefile
Issue 'q config' command for more detailed configuration information
Landscape mode? ('n' for portrait):
Как видите, скрипт ожидает ввода y / n. Когда вводится y / n, получается следующий вывод:
Landscape mode? ('n' for portrait): y
GX Package Initialization: Size = 11 8.5
Running in Batch mode
ga->
Затем сценарий ожидает дальнейших команд, пока он не может быть завершен с помощью команды ‘quit’. ‘quit’ приводит к следующему выводу:
ga-> quit
No hardcopy metafile open
GX package terminated
root@host [~]#
Однако моя проблема возникает, когда я пытаюсь сделать это через PHP. Мой код выглядит следующим образом:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);
$cwd = '/';
$process = proc_open('/usr/local/bin/grads-2.0.2/bin/grads -b', $descriptorspec, $pipes, $cwd);
if (is_resource($process)) {
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], 'y');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
// It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock
$return_value = proc_close($process);
}
Тем не менее, это вывод сразу:
Grid Analysis and Display System (GrADS) Version 2.0.2
Copyright (c) 1988-2011 by Brian Doty and the
Institute for Global Environment and Society (IGES)
GrADS comes with ABSOLUTELY NO WARRANTY
See file COPYRIGHT for more information
Config: v2.0.2 little-endian readline printim grib2 netcdf hdf4-sds hdf5 opendap-grids,stn geotiff shapefile
Issue 'q config' command for more detailed configuration information
Landscape mode? ('n' for portrait): GX Package Initialization: Size = 11 8.5
Running in Batch mode
ga-> [EOF]
No hardcopy metafile open
GX package terminated
Как видите, скрипт движется без ожидания ввода … какие изменения мне нужно внести в код PHP, чтобы это исправить? Любая помощь будет принята с благодарностью … мои команды отлично работают в командной строке, так что это единственное, что сдерживает мое приложение.
Я не могу помочь с PHP, но если вы вызываете грады с «-blx» вместо «-b», тогда он автоматически запустится в альбомном режиме и завершится, когда ваша команда будет завершена. Параметр -l устраняет необходимость ввода данных пользователем, когда GrADS запрашивает режим «Ландшафт», а -x указывает, что он должен завершить работу. Вы можете добавить ‘c’, за которым следует имя команды или сценария. Например:
# /usr/local/bin/grads -blxc 'q config'
Запустит грады в ландшафтном режиме, выполнит команду, которая выводит информацию о конфигурации, а затем выйдет. Команда «q config» может быть заменена именем скрипта. Документация по параметрам командной строки для GrADS находится по адресу http://iges.org/grads/gadoc/gradcomdgrads.html
Других решений пока нет …