PHP 스크립트를 외부 편집기로 탈출하고 나중에 반환하려면 어떻게합니까?

StackOverflow https://stackoverflow.com/questions/126005

문제

특히 특정 시점에서 사용자의 입력이 필요한 PHP 명령 줄 스크립트가 있습니다. 외부 편집기 (예 : VI)를 실행하고 스크립트를 재개하기 전에 편집기가 실행을 완료 할 때까지 기다릴 수 있기를 원합니다.

내 기본 아이디어는 임시 파일을 사용하여 편집을 수행하고 나중에 파일의 내용을 검색하는 것이 었습니다. 라인을 따라 무언가 :

$filename = '/tmp/script_' . time() . '.tmp';

get_user_input ($filename);

$input = file_get_contents ($filename);
unlink ($filename);

PHP 명령 줄 스크립트에서는 이것이 불가능하다고 생각되지만 동일한 효과를 달성하기 위해 사용할 수있는 일종의 쉘 스크립팅 트릭이 있기를 바랍니다.

다른 스크립팅 언어에서 이것이 어떻게 달성 될 수 있는지에 대한 제안도 환영받는 것 이상입니다.

도움이 되었습니까?

해결책

편집기 출력을 터미널로 리디렉션 할 수 있습니다.

system("vim > `tty`");

다른 팁

방금 시도해 보았고 Windows에서 잘 작동하므로 VI 또는 Linux에서 원하는 앱으로 복제 할 수 있습니다.

핵심은 그 것입니다 exec() 메모장 (이 경우)이 실행되는 동안 PHP 프로세스를 중단합니다.

<?php

exec('notepad c:\test'); 
echo file_get_contents('c:\test');

?>

$ php -r test.php

편집 : 시도와 BSTARK가 지적한 것처럼, 메모장 테스트가 새 창을 발사하므로 모든 것이 정상이지만, 콘솔 모드에서 실행되는 모든 편집기는 터미널이 첨부 할 수 없기 때문에 실패합니다.

즉, 나는 Linux 상자에서 exec('nano test'); echo file_get_contents('test'); 그리고 그것은 VI만큼 나쁘게 실패하지 않으며 아무것도 표시하지 않고 실행됩니다. 물건을 입력하고 "ctrl-x, y"를 눌러 파일을 닫고 저장 한 다음 PHP 스크립트를 계속하고 작성한 내용을 표시했습니다. 어쨌든 .. 나는 적절한 해결책을 찾았으므로 새로운 대답이 들어올 것입니다.

VI를 터미널 PHP에 연결하는 것이 가능한지 모르겠지만 빠르고 쉬운 솔루션은 동일한 터미널에서 화면 편집기를 사용하지 않는 것입니다.

Ed와 같은 라인 편집기를 사용하거나 시스템 ( "xterm -e vi")과 같은 새 창을 열 수 있습니다 (터미널 앱의 이름으로 xterm을 대체).

추가로 편집 : Perl에서 System ( "VI")은 Fance Pipelining/Buffering PHP의 종류를 수행하지 않기 때문에 시스템 ( "VI")은 작동합니다.

따라서 파일을 작성한다는 아이디어는 우리가 미친 것을 시도하게하는 반면 쉬운 해결책이있는 것 같습니다 :)

<?php

$out = fopen('php://stdout', 'w+');
$in = fopen('php://stdin', 'r+');

fwrite($out, "foo?\n");
$var = fread($in, 1024);
echo strtoupper($var);

Fread () 호출은 무언가 (1024 바이트 또는 줄의 끝)를받을 때까지 PHP 프로세스를 중단하여 다음을 생성합니다.

$ php test.php
foo?
bar <= my input
BAR
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top