위에서 언급 한 것처럼 코드가 명령 줄에서 직접 작동하지만 PHP CLI이 아닌 것은 로그 파일 사용 권한 때문일 가능성이 큽니다. 즉, 올바른 사용 권한을 가진 로그 파일을 먼저 만들어야하며 거기에 출력을 작성해야합니다 !
예를 들어, (PHP가 아님)에서 로그 파일 buffer.txt
을 삭제하고 PHP 코드를 다시 실행하십시오. 파일이 존재하지 않으므로 대부분 작동하지 않습니다. 명령 줄에서 직접 명령을 실행하면 로그 파일 (buffer.txt
)이 특수 사용 권한 (읽기/쓰기뿐만 아니라 그룹 및 소유자 (Linux) 일 수도 있음)으로 만들어 짐을 기억하십시오. PHP가 파일을 만들 때 기본적으로 소유자/그룹에 nobody nobody
을 사용하고 다른 사용자가 만든 로그 파일 (명령 줄에서 동일한 명령을 실행했을 때)이 이미 있습니다 (관리자). 결과적으로 잘못된 파일 권한 때문에 PHP가이를 사용할 수 없다는 것을 확신 할 수 있습니다. 현재 로그 파일에 무엇이 있는지 확인하십시오. 소유자/그룹 Linux에서 ls -ls
을 실행하거나 Windows에서 DIR /Q
을 실행하여 아이디어를 얻으십시오.
PHP는 안전 모드에서 실행하지 마십시오. 결과적으로 exec
은 PHP is in safe mode 인 경우 비활성화되어 있기 때문에 예상대로 작동하지 않을 수 있습니다. PHP 안전 모드에서 실행 중일 때
shell_exec()
(역 따옴표의 기능적 등가물) 이 기능은 중지된다.
exec()
에서만 은 safe_mode_exec_dir 내에서 실행 파일을 실행할 수 있습니다. 실용적인 이유로 현재 실행 파일의 경로에 구성 요소가있는 것은 허용되지 않습니다. escapeshellcmd()
이이 함수의 인수에서 실행됩니다.
phpinfo()
기능을 사용하여 서버의 PHP 설정을 확인할 수 있습니다.
귀하의 코드는 오히려 다음과 같아야합니다
exec("$cmd 2>&1", $output);
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', $cmd);
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', implode("\n", $output));
그게 무슨 뜻 이죠? 2>&1
이라고 말하면 stderr
을 현재 stdout
으로 리디렉션합니다. stdout
이 콘솔로가는 경우 stderr
도 마찬가지입니다. stdout
이 파일로가는 경우 stderr
도 마찬가지입니다.
Windows의 경우 Using command redirection operators 또는 Linux의 경우 All about redirection 문서에서 명령 재 지정에 대해 자세히 읽어보십시오.
로그 변환 기능이 같을 수 :
그것은 당신이
만들 로그 파일이 쓰기 가능하고
올바른 사용 권한이 있는지 확인하는 것이 매우 중요합니다
function log_conversion($file_path, $text)
{
$file_dir = dirname($file_path);
if(!file_exists($file_dir) || !is_dir($file_dir) || !is_writable($file_dir))
return false;
$write_mode = 'w';
if(file_exists($file_path) && is_file($file_path) && is_writable($file_path))
$write_mode = 'a';
$handle = fopen($file_path, $write_mode);
if(!$handle)
return false;
if(fwrite($handle, $text. "\n") == FALSE)
return false;
@fclose($handle);
}
!
로그 파일이있을 경우 개인적으로 삭제하여 최근의 합리적인 로그 파일이 있는지 확인하십시오.
나는 이것 또는 작은 조정으로 작동 할 것입니다 내기!
작동하지 않는 경우 알려 주시면 자세히 설명 드리겠습니다.
$ 결과는 무엇입니까? –