2013-02-14 2 views
1

PHP mysqldump를 사용하기 위해 PHP 스크립트를 사용하기 전에 전체 데이터베이스를 백업하고 싶다. 이 같은 성공적인 있다면 mysqldump가 파일을 생성 할 수 없을 때 shell_exec()가 에러를 반환하지 않는다.

나는() shell_exec와 mysqldump는 명령을 실행하고 확인하려 :

$command = 'mysqldump -u username -ppassword database > /path/database.sql'; 
$result = shell_exec($command); 

if(!is_null($result)) { 
    echo 'Error during backup'; 
else { 
    echo 'Database saved'; 
    // rest of the php script to modify the database (create/drop tables etc) 
} 

하지만 $ 결과가 나는 경로를 제공하는 경우에도, alwas null 인 것으로 나타났습니다 파일을 작성할 수 없습니다 (기존 디렉토리가 없거나 쉘 프롬프트에서 권한이 거부되어야하는 항목).

무엇이 누락 되었습니까? the manual에서

답변

3

이것은 나를 위해 일한 : 그런 경우에는 당신이 a different PHP function이 필요하지만, 당신은 그 메커니즘을 이용해야한다 "exec()"도 사용하십시오

$command = "mysqldump -u$username -p$password database > /home/yourusername/public_html/database.sql"; 
exec($command,$result, $output); 

if($output != 0) { 
    echo 'Error during backup'; 
}else { 
    echo 'Database saved'; 
    // rest of the php script to modify the database (create/drop tables etc) 
} 
+1

'system()'의 두 번째 인자가 스크립트 출력이 아니라면 리턴 값입니다. 이름은 제쳐두고, 당신의 코드는 괜찮지 만, 나는 미래의 독자들에게 혼동을 피하기 위해 그것을 분명히해야한다고 생각했다. –

+0

안녕하세요. 6 행에 구문 오류가 있습니다 (괄호가 없습니다). – Tegos

1

:

:

돌아 오류가하지만, 당신이 파일에 스크립트의 출력을 리디렉션

발생한 경우 실행 명령 또는 NULL에서
의 출력 값

mysqldump -u username -ppassword database > /path/database.sql 
              ^^^^^^^^^^^^^^^^^^^^ 

가능합니다 (실제로는 알지 못합니다) 그쪽으로 t mysqldump는 표준 반환 코드를 생성한다 (여기서 0OK을 의미하고 다른 것은 error을 의미한다).

$command = 'mysqldump -u username -ppassword database > /path/database.sql'; 
system($command, $output); 

if($output != 0) { 
    echo 'Error during backup'; 
else { 
    echo 'Database saved'; 
    // rest of the php script to modify the database (create/drop tables etc) 
} 
+0

답장을 보내 주셔서 감사합니다. 스크립트의 출력을 리디렉션하면 문제의 원인이 될 수 있다고 생각하지 않았습니다. 나는 임원과 노력했지만 $ 출력은 어떻게 든 일관성이없고 신뢰할 수 없으며 http://stackoverflow.com/a/10828773은 나를 시스템()으로 향하게했다. –

+0

@IamZesh -'$ output'이 아니라'$ return_var'가 강조되어 있습니다. 물론 그것이 작동하는지 여부는 mysqldump가 표준 반환 값을 생성하는지 여부에 달려 있습니다. 당신의 대답에서 볼 수 있습니다. –

1

당신은 -u 및 -p 사이의 모든 공백을 제거해야하며, 을 varialbes :

string exec (string $command [, array &$output [, int &$return_var ]]) 
                ^^^^^^^^^^^^^^^^