Как открыть приложение через php и perl? - PullRequest
2 голосов
/ 20 февраля 2012

Я пытаюсь распечатать сгенерированные формы / квитанции через PHP (принтеры будут установлены на сервере, я не пытаюсь печатать на локальном принтере пользователя). Я решил попробовать следующую методологию:

В PHP:

  1. Создайте файл PDF и сохраните его на сервере.
  2. Вызовите Perl-скрипт для печати указанного PDF-файла.

IN perl:

  1. Используйте system(), чтобы «открыть» Reader и напечатать указанный PDF-файл без вывода сообщений.

Что работает:

  • Я могу создавать PDF-файлы на PHP.
  • Я могу вызвать Perl-скрипт.
    • Если в скрипте есть ошибки, они сообщают в окно браузера. То есть: если я намеренно изменяю пути к файлам, он терпит неудачу и сообщает о соответствующей причине.
  • функции, такие как printf, работают нормально, так как вывод отображается в браузере.
  • Точно такой же сценарий perl (с упомянутой ниже «неработающей» строкой) работает правильно при выполнении из командной строки или IDE.

Что не работает:

  • В perl: system('"C:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe" /N /T "C:\\test.pdf" 0-XEROX');

Что происходит:

  • НИЧЕГО! Я не получаю ошибок. Просто отказывается открывать Adobe Reader. Весь код ниже этой строки, кажется, работает нормально. Это как функция игнорируется. Я не понимаю, почему, но я попробовал несколько вещей.

Что я пробовал:

  • Изменены разрешения AcroRd32.exe на Everyone - Full Control.
  • Вывести $? после вызова system(). Это 1, но я не знаю, что означает 1 в этом случае.
  • Проверено, что в php нет списка disable_functions (хотя я думаю, что это не связано, так как shell_exec, кажется, работает, так как часть кода perl запущена).
  • Различные другие конфигурации, которые, по крайней мере, привели меня к тому, что я могу подтвердить, что PHP фактически вызывает скрипт perl, он просто не запускает вызов system().

Другая информация:

  • Apache 2.2.1.7
  • PHP 5.35
  • Perl 5.12.3 для MSWin32-x86-multi-thread
  • WampServer 2.1

Я в растерянности, и, хотя кажется, что это проблема с Apache / permissions, я не могу быть уверен. Мой опыт работы с Apache ограничен, и большая часть того, что я нахожу в сети, это команды linux, которые не работают в моей среде.

1 Ответ

1 голос
/ 20 февраля 2012

Попробуйте это:

my @args = ('C:/Program Files (x86)/Adobe/Reader 10.0/Reader/AcroRd32.exe');
if (system(@args) != 0) {
    # Can't run acroread.  Oh Noes!!!
    die "Unable to launch acrobat reader!\n";
}

Суть system () состоит в том, что она выполняет две разные функции в зависимости от числа и типа (аргументов), которые она получает.Если аргумент является массивом или если имеется несколько аргументов, Perl предполагает, что первая - это программа, запускаемая с остальными в качестве аргументов, и запускает саму программу.

Если, однако, это всего лишь одна строка, Perlобрабатывает это по-другому.Он запускает ваш интерпретатор командной строки (обычно CMD.EXE в Windows) в строке и позволяет ему делать то, что он хочет с ним.Это становится проблематичным довольно быстро.

Во-первых, и Perl, и оболочка выполняют различные виды интерполяции строки (например, заменяют '//' на '/', разбивают на символы пробел и т. Д.), И это оченьлегко потерять след того, что делает что.Я нисколько не удивлен, что ваша команда не работает - есть так много вещей, которые могут пойти не так.

Во-вторых, трудно точно знать, какая оболочка действительно запускается в Windows или чтоизменения, которые Perl вносит в него в первую очередь.В Unix это обычно не имеет значения - каждая оболочка делает более или менее то же самое с помощью простых команд.Но в Windows вы могли бы запустить raw CMD.EXE, GNU Bash или какую-нибудь промежуточную программу, которая обеспечивает поведение, похожее на оболочку Unix.А поскольку существует несколько различных портов Perl для Windows, он вполне может измениться, если вы переключитесь.

Но если вы используете форму массива, все останется в Perl и больше ничего не произойдет.

Кстати, документация для system () и $? здесь и здесь .Это стоит прочитать.

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