Печатать с помощью чашек, используя exec() в php?

Я хочу автоматически распечатать файл после нажатия кнопки на странице. Итак, я установил чашки на свой небольшой сервер Raspberry Pi Apache и создал код с PHP, который выглядит как...

$path = "/media/usb/test.pdf";
$message = exec('sudo lp -d <<PrinterName>> $path');

echo $message;

(Я заменил свой PrinterName)

Сейчас задание отправляется в чашки, но Статус "остановлен". Также размер задания в порядке, а количество страниц равно 0.

Я также попробовал запустить ту же команду прямо в терминале (без переменных), и все заработало.

Это проблема с разрешениями?


person sdsdfsdasaasd    schedule 31.12.2015    source источник
comment
Есть ли у пользователя вашего веб-сервера разрешение на выполнение команды? Как если бы вы использовали echo exec('whoami'); вы заметите, что пользователь отличается от того, что вы запускаете на фактическом экране терминала, который вы создаете   -  person Daryl Gill    schedule 01.01.2016
comment
Спасибо за Ваш ответ! exec('whoami') показывает мне www-данные, а в терминале показывает число пи. Должен ли я изменить владельца файла php на pi (sudo chown pi:pi /var/www/test.php)? Однако, если я сделаю это, exec('whoami') по-прежнему будет сообщать мне www-данные вместо pi.   -  person sdsdfsdasaasd    schedule 01.01.2016
comment
Просто изучите разрешения, используемые вашей командой. Никогда не давайте сценарию полные административные права. Это требует много боли   -  person Daryl Gill    schedule 01.01.2016
comment
На другой ноте. Вы можете запустить Cronjob для выполнения команды печати с информацией, хранящейся в базе данных. Это будет лучший подход   -  person Daryl Gill    schedule 01.01.2016


Ответы (2)


Если ваша командная строка отлично работает в терминале с полным путем, но не работает в командной строке PHP, это означает, что у вас есть правильные разрешения для печати вашего файла. Таким образом, проблема связана с вашим синтаксисом, использующим $path в вашей команде.

Использование простых кавычек вместо двойных кавычек в PHP-коде при включении переменной отображает не содержимое переменной, а переменную в виде текста.
Попробуйте следующее:

// Use
$message = exec("lp -d <<yourPrinter>> $path"); // This will display '/media/usb/test.pdf'
// instead of
$message = exec('lp -d <<yourPrinter>> $path'); // That will display '$path' (not correct)
person Kroan    schedule 30.06.2021

Проблема в том, что принтер не объявлен на сервере, с которого вы запускаете команду.

Проверить принтеры можно командой lpstat -d.

person Juan Utrera    schedule 03.01.2019