iniciando o visualizador tightvnc via php
-
21-12-2019 - |
Pergunta
Estou tentando iniciar o vncviewer no Raspberry Pi usando PHP, onde RPi é o cliente e meu servidor VNC executa o MS Windows.
Em PHP estou usando esse script para iniciar o vncviewer
$cmd="echo password | vncviewer -autopass " .$ip;
shell_exec($cmd);
Funciona quando executo apenas o shell script do RPi, mas quando tento no PHP recebo este erro:
Error: Can't open display:
Existe alguma solução alternativa para esse erro?
Solução
Se você estiver usando o X11, provavelmente precisará configurar seu DISPLAY
variável.
Clientes X11 (programas) que precisam abrir janelas em um servidor X11 (display) usam esta variável para determinar onde o cliente deve encontrar o servidor.O modelo cliente/servidor é usado aqui porque o servidor fornece recursos de exibição de janela para o cliente.
X inclui a capacidade de exibir janelas em servidores remotos em uma rede, embora 99,9% do tempo você exiba coisas na tela principal da máquina que executa o programa, então normalmente, DISPLAY=localhost:0.0
.
O problema é que se DISPLAY
é não definido, um programa não sabe onde abrir suas janelas, mesmo se houver um servidor X rodando na mesma máquina.E quando os programas são executados por cron
ou os scripts de inicialização do sistema ou qualquer coisa que não tenha sido iniciada pelo próprio X (incluindo um script PHP executado pelo seu servidor web), eles geralmente não têm DISPLAY
definido para qualquer coisa.
Então ..como você observou nos comentários, definindo DISPLAY=:0
dirá ao vncviewer para onde enviar suas janelas.Esta é uma forma abreviada de DISPLAY=localhost:0.0
.O nome do host, se excluído, será considerado localhost.E a .0
no final refere-se ao número da tela, cujo padrão também é zero.Confira a Documentação X para mais detalhes.
E como você também observou nos comentários, no ambiente onde o X está sendo executado (ou seja, DISPLAY
já está definido), você pode precisar executar xhost +
para permitir que programas não iniciados pelo X abram janelas.
Para definir uma variável de ambiente em PHP, use algo como:
putenv("DISPLAY=:0");
antes do código que inicia o VNC.