2012-07-26 22 views
7

मेरे पास एक PHP स्क्रिप्ट है जो रिमोट सर्वर के MySQL कनेक्शन विवरण को पारित करती है और मैं इसे mysqldump कमांड निष्पादित करना चाहता हूं। मैं php exec() समारोह का उपयोग कर रहा ऐसा करने के लिए:PHP के माध्यम से mysqldump

<?php 
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql", $output); 
?> 

सही लॉगइन विवरण इसे करने के लिए पारित कर दिया जाता है, तो यह बिल्कुल ठीक काम करेंगे। हालांकि, मुझे की जांच करने में समस्या हो रही है यदि यह अपेक्षा के अनुसार निष्पादित करता है और यदि यह नहीं पता कि क्यों नहीं। $output सरणी खाली के रूप में लौटाता है, जबकि अगर मैं सीधे कमांड लाइन पर कमांड चलाता हूं तो एक संदेश मुद्रित होता है कि मुझे लॉगिन विफल रहा है। मैं ऐसे त्रुटि संदेशों को कैप्चर करना चाहता हूं और उन्हें प्रदर्शित करना चाहता हूं। ऐसा करने के बारे में कोई विचार क्या है?

उत्तर

11

अनुप्रेषित आप कार्यकारी समारोह के तीसरे पैरामीटर की जांच होनी चाहिए: &$return_var

$return_var = NULL; 
$output = NULL; 
$command = "/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name > /path-to-export/file.sql"; 
exec($command, $output, $return_var); 

यूनिक्स में परंपरा के अनुसार एक प्रक्रिया 0 के अलावा और कुछ देता है जब कुछ चला जाता है गलत

और इसलिए आप कर सकते हैं:

if($return_var) { /* there was an error code: $return_var, see the $output */ } 
+1

यहां लिंक है: http://php.net/manual/en/function.exec.php और मुझे लगता है कि यह इस तरह से बेहतर कहता है: "यूनिक्स में सम्मेलन के द्वारा एक प्रक्रिया कुछ गलत होने पर 0 से कुछ भी लौटाती है" :) –

+0

क्या यह जानने का कोई तरीका है कि $ return_var का प्रत्येक मूल्य क्या है, इसलिए मैं इसे एक सार्थक त्रुटि संदेश में अनुवाद कर सकता हूं? अनुमान लगाया जाएगा कि यह प्रत्येक कमांड के लिए अलग है। –

+0

यदि $ return_var शून्य के बराबर नहीं है, तो $ आउटपुट में त्रुटि कोड होना चाहिए, क्योंकि प्रोग्राम stderr में त्रुटि लिखते हैं जो आपके द्वारा फ़ाइल पर रीडायरेक्ट किए गए stdout से भिन्न होता है। 'अगर ($ return_var) {मरें ($ आउटपुट); } ' –

4

क्योंकि इस लाइन stdout उत्पादन > /path-to-export/file.sql इस कोशिश,

<?php 
exec("/usr/bin/mysqldump -u mysql-user -h 123.145.167.189 -pmysql-pass database_name", $output); 
/* $output will have sql backup, then save file with these codes */ 
$h=fopen("/path-to-export/file.sql", "w+"); 
fputs($h, $output); 
fclose($h); 
?> 
+0

थोड़ा दूर लाए जाने के लिए यदि आप मुझसे पूछें –

+0

मेरी मूल भाषा है, जिसमें अब तक अंग्रेजी से दूर है तुर्की है, कि क्या मुझे शक्तिशाली जवाब लिखने से रोकने के लिए है। जैसा कि वह कहता है कि $ आउटपुट खाली है, तो मैंने कहा कि इसका खाली क्यों है। $ आउटपुट stdout है और यदि वह ">" का उपयोग करता है (जिसका मतलब है कि फाइल को stdout को रीडायरेक्ट करना है) उसके पास आउटपुट नहीं होगा, और यह पूरी तरह तार्किक है। हालांकि, वहां भी stderr है, अगर इस मामले में कोई त्रुटि $ आउटपुट त्रुटि होगी, तब भी उसने stdout को फ़ाइल में रीडायरेक्ट किया था। अनुलेख उसने $ आउटपुट –

+0

से पूछा हाँ, मैं पूरी तरह से सहमत हूं, मेरा मतलब है कि ऐसा करने का एक आसान तरीका है :) –

3

मैं ठीक उसी समाधान के लिए देख रहा था, और मुझे याद है मैं था पहले से ही इस साल के पहले हल है, लेकिन इसके बारे में भूल गया।

यह पेज प्रश्न के लिए गूगल में अधिक है, यहाँ कैसे मैंने किया है:

<?php 
define("BACKUP_PATH", "/full/path/to/backup/folder/with/trailing/slash/"); 

$server_name = "your.server.here"; 
$username  = "your_username"; 
$password  = "your_password"; 
$database_name = "your_database_name"; 
$date_string = date("Ymd"); 

$cmd = "mysqldump --hex-blob --routines --skip-lock-tables --log-error=mysqldump_error.log -h {$server_name} -u {$username} -p{$password} {$database_name} > " . BACKUP_PATH . "{$date_string}_{$database_name}.sql"; 

$arr_out = array(); 
unset($return); 

exec($cmd, $arr_out, $return); 

if($return !== 0) { 
    echo "mysqldump for {$server_name} : {$database_name} failed with a return code of {$return}\n\n"; 
    echo "Error message was:\n"; 
    $file = escapeshellarg("mysqldump_error.log"); 
    $message = `tail -n 1 $file`; 
    echo "- $message\n\n"; 
} 
?> 

यह --log त्रुटि = है [/ path/to/त्रुटि/log/फ़ाइल] mysqldump का हिस्सा है कि मैं हमेशा के बारे में भूल जाओ!

+0

मैंने इस जवाब की कोशिश की लेकिन इसे काम नहीं कर सका। मैं एक स्थानीय WAMP सर्वर चला रहा हूं और जिस निर्देशिका में मैं चल रहा हूं वह 'www/test/index.php' है। मैंने 'BACKUP_PATH' को"/test/"पर सेट किया है और मैंने" mysqlydump_error.log "नामक एक फ़ाइल बनाई है और उसे" परीक्षण "निर्देशिका में रखा है। मुझे त्रुटि संदेश मिल रहा है, लेकिन यह कोई त्रुटि प्रदर्शित नहीं करता है और त्रुटि लॉग भी खाली है। मैंने यह सुनिश्चित कर लिया है कि मेरे उपयोगकर्ता को अनुमति भी है। मदद? –

+0

अब मुझे दिखाई देने के लिए बैकअप फ़ाइल मिल सकती है, लेकिन यह खाली है। –

+0

@AndrewFox, [रिक] (http://stackoverflow.com/users/4392819/rick) कहता है 'क्या आपके कॉन्फ़िगरेशन के आधार पर पथ/www/test/या संभवतः/var/www/test/नहीं होना चाहिए? निर्देशिका से एक पीडब्ल्यूडी करें जिसे आप लॉग फ़ाइल रखना चाहते हैं और इसे पीछे की ओर स्लैश के साथ रखें। ' –

3

मुझे मिला समाधान मुझे उप-खोल में कमांड चलाने के लिए है और फिर stderrstdout पर आउटपुट करना है। इस तरह, $output अच्छी तरह से आबादी है।

अर्थात:

exec("(mysqldump -u$username -p$password $database $tables > $dump_name) 2>&1", $output, $result); 

var_dump($result); 
echo "<br />"; 
var_dump($output); 
echo "<br />"; 

उत्पादन:

int(6)

array(1) { [0]=> string(46) "mysqldump: Couldn't find table: "table_name"" }

आशा है कि यह मदद करता है!

1

exec()stdout ला रहा है जो फ़ाइल पर रीडायरेक्ट किया गया है, हमारे पास फ़ाइल में आंशिक या अनुपलब्ध परिणाम है और हम नहीं जानते कि क्यों। हमें stderr और exec() से संदेश प्राप्त करना है, ऐसा नहीं कर सकता है। कई समाधान हैं, सभी पहले से ही पाए गए हैं इसलिए यह सिर्फ सारांश है।

  1. Solution from Jon: mysqldump से त्रुटियों लॉग इन करें और उन्हें अलग से संभाल (हर आदेश के लिए आवेदन नहीं कर सकते हैं)।
  2. फ़ाइलों को अलग करने के लिए आउटपुट रीडायरेक्ट करें, यानी।mysqldump ... 2> error.log 1> dump.sql और पिछले समाधान में त्रुटि लॉग को अलग से पढ़ें।
  3. Solution from JazZ: डंप को एक सबहेल के रूप में लिखें और सबहेल के stderr को stdout पर रीडायरेक्ट करें जो $output चर में php exec() डाल सकता है।
  4. Solution from Pascal: के बजाय proc_open() का उपयोग बेहतर करें क्योंकि हम stdout और stderr अलग-अलग (सीधे पाइप से) प्राप्त कर सकते हैं।
0

.sql फ़ाइल में डेटाबेस निर्यात प्राप्त करने के लिए कोड के नीचे लिखें।

<?php exec('mysqldump --user=name_user --password=password_enter --host=localhost database_name > filenameofsql.sql'); ?>