2012-02-27 35 views
6

मैं php में fopen() के माध्यम से खोले गए फ़ाइल में डेटा का एक बड़ा हिस्सा लिखने की कोशिश कर रहा हूं। मैं जिस प्रोटोकॉल रैपर का उपयोग कर रहा हूं वह ftp है, इसलिए फ़ाइल php कोड चलाने वाले सर्वर से दूरस्थ है। जिस फ़ाइल को मैं लिख रहा हूं वह विंडोज सर्वर पर है।php fwrite() फ़ाइल को स्ट्रिंग डेटा लिखना समाप्त नहीं करता है, क्यों?

मैंने सत्यापित किया कि फ़ाइल वास्तव में मेरे PHP कोड द्वारा बनाई गई है, लेकिन समस्या यह है कि फ़ाइल के भीतर डेटा या तो मौजूद नहीं है (0 केबी) या फाइल को लिखना समय-समय पर बंद हो जाता है। निश्चित नहीं है कि यह मामला क्यों है।

यहाँ कोड मैं आपरेशन से निपटने के लिए उपयोग कर रहा हूँ है:

$file_handle = fopen($node['ftp'].$path_to_lut, "wb", 0, $node['ftp_context']); 
include_once($file); 

if ($file_handle) 
{ 
    fwrite($file_handle, $string); //$string is inside included $file 
    fclose($file_handle); 
} else { 
    die('There was a problem opening the file.'); 
} 

इस कोड को ठीक काम करता है जब मैं अपने स्थानीय मशीन पर होस्ट है, लेकिन जब मैं इसे अपने webhost (रैकस्पेस बादल) पर अपलोड करें, यह विफल रहता है। इससे मुझे विश्वास होता है कि यह रैकस्पेस पर मेरे सर्वर की कॉन्फ़िगरेशन से संबंधित एक मुद्दा है, लेकिन यह जानना चाहता हूं कि मेरे PHP कोड में ऐसा कुछ भी है जो मैं इसे और अधिक मजबूत बनाने के लिए कर सकता हूं।

किसी भी विचार को सुनिश्चित करने के लिए कि वास्तव में रिमोट मशीन को स्ट्रिंग लिखना समाप्त हो गया है?

धन्यवाद!

ठीक है, मैं कोड है कि इतनी तरह फाइल करने के लिए लिखते हैं बदल दिया है:

if ($file_handle) 
{ 
    if ($bytesWritten = fwrite($file_handle, $string)) { 
     echo "There were " . $bytesWritten . " bytes written to the text file."; 
    } 

    if (!fflush($file_handle)) { 
     die("There was a problem outputting all the data to the text file."); 
    } 

    if (!fclose($file_handle)) { 
     die("There was a problem closing the text file."); 
    } 

} else { 

    die("No file to write data to. Sorry."); 

} 

क्या अजीब बात है कि गूंज बयान निम्नलिखित से पता चलता है:

वहाँ 10330 बाइट्स के लिए लिखा थे पाठ फ़ाइल।

और फिर भी, जब मैं एफ़टीपी के माध्यम से टेक्स्ट फ़ाइल आकार को सत्यापित करता हूं तो यह 0K होने के लिए दिखाता है और फ़ाइल के अंदर डेटा वास्तव में छोटा कर दिया जाता है। मैं कल्पना नहीं कर सकता कि इसे एफ़टीपी सर्वर से ही करना है क्योंकि यह काम करता है अगर PHP को रैकस्पेस क्लाउड पर किसी अन्य मशीन के अलावा होस्ट किया जाता है।

** अद्यतन ** मैंने एक रैकस्पेस क्लाउड प्रतिनिधि से बात की जिसने उल्लेख किया कि यदि आप अपने सर्वर से ftp करने जा रहे हैं तो उन्हें निष्क्रिय एफटीपी की आवश्यकता होती है। मैं निष्क्रिय एफटीपी कनेक्शन को संभालने के लिए रिमोट सर्वर सेटअप करता हूं, और सत्यापित किया है कि निष्क्रिय एफटीपी अब ओएसएक्स ट्रांसमिट एफटीपी क्लाइंट के माध्यम से रिमोट सर्वर पर काम करता है। मैं कहा:

ftp_pasv($file_handle, true); 

fopen के तुरंत बाद() बयान है, लेकिन मैं कह रहा मैं एक वैध संसाधन ftp_pasv को नहीं प्रदान की थी() PHP से कोई त्रुटि मिलती है। मैं कैसे सुनिश्चित कर सकता हूं कि PHP द्वारा बनाई गई FTP साइट का कनेक्शन PASV है और सक्रिय नहीं है और अभी भी fwrite() का उपयोग करता है? संयोग से, मैंने देखा है कि विंडोज मशीन रिपोर्ट करता है कि मेरे PHP कोड द्वारा लिखी गई फाइल डिस्क पर 4096 बाइट है। यह उस राशि से परे कभी नहीं मिलता है। इससे मुझे समस्या निवारण के लिए output_buffering php value 65536 में बदलना पड़ा, लेकिन इससे समस्या को ठीक नहीं किया गया। । ।

** अद्यतन भाग DUEX **

रैकस्पेस बादल साइटें उत्पाद पर अपने आभासी सर्वर पर समस्या निवारण करना भी मुश्किल साबित हो क्योंकि वे काफी व्यवस्थापक अधिकार नहीं करते हैं किया गया था। मैंने रैकस्पेस के क्लाउड सर्वर उत्पाद पर एक बहुत छोटा क्लाउड सर्वर बनाया और उस बिंदु पर सबकुछ कॉन्फ़िगर किया जहां मैं अभी भी fwrite() के साथ एक ही त्रुटि देख रहा हूं। यह सुनिश्चित करने के लिए कि मैं उस सर्वर से दूरस्थ सर्वर पर एक फ़ाइल लिख सकता हूं, मैंने क्लाउड सर्वर पर अपने बैश खोल के भीतर मूल ftp आदेशों का उपयोग किया था। यह ठीक काम किया। इसलिए, मुझे लगता है कि fwrite() के php कार्यान्वयन के भीतर एक बग है, और यह शायद किसी प्रकार के डेटा थ्रॉटलिंग मुद्दे के कारण है।जब मैं अपने स्थानीय वातावरण से रिमोट सर्वर पर लिखता हूं जो रैकस्पेस क्लाउड सर्वर पर जो पेशकश की जाती है उससे तुलना में धीमी गति से उछाल आया है, तो यह ठीक काम करता है। क्या लिखने की गति को प्रभावी ढंग से कम करने का कोई तरीका है? सिर्फ ':)

** अद्यतन भाग III *

तो askin, मैं @a उदास दोस्त से सुझाव ले लिया और एक समारोह किसी एक नई फ़ाइल में लिख सकते हैं और इसे भेजने के लिए कोशिश कर रहा है मदद कर सकता है कि लागू किया अपनी संपूर्णता में बंद FTP के माध्यम से:

function writeFileAndFTP($filename=null, $data=null, $node=null, $local_path=null, $remote_path=null) 
{ 

    // !Determin the path and the file to upload from the webserver 
    $file = $local_path.'/'.$filename; 


    // !Open a new file to write to on the local machine 
    if (!($file_handle = fopen($file, "wb", 0))) { 
     die("There was a problem opening ".$file." for writing!"); 
    } 


    // !Write the file to local disk 
    if ($bytesWritten = fwrite($file_handle, $data)) { 
     //echo "There were " . $bytesWritten . " bytes written to " . $file; 
    } 

    // !Close the file from writing 
    if (!fclose($file_handle)) { 
     die("There was a problem closing " . $file); 
    } 

    // !Create connection to remote FTP server 
    $ftp_cxn = ftp_connect($node['addr'], $node['ftp_port']) or die("Couldn't connect to the ftp server."); 

    // !Login to the remote server 
    ftp_login($ftp_cxn, $node['user'], getPwd($node['ID'])) or die("Couldn't login to the ftp server."); 

    // !Set PASV or ACTIVE FTP 
    ftp_pasv($ftp_cxn, true); 


    // !Upload the file 
    if (!ftp_put($ftp_cxn, $remote_path.'/'.$filename, $file, FTP_ASCII)) { 
     die("There was an issue ftp'ing the file to ".$node['addr'].$remote_path); 
    } 

    // !Close the ftp connection 
    ftp_close($ftp_cxn); 

} 
+0

'include_once ($ फ़ाइल);' - जहां कि कोड है? ; ' – hakre

+0

यह ऐसा दिखाई देता है? (उपयोगकर्ता नाम/पासवर्ड हटाएं)। – ariestav

+0

क्या' var_dump ($ नोड [ 'ftp_context']) करता है, '' उत्पादन $ स्ट्रिंग "एक स्ट्रिंग के बारे में 20 लाइनों लंबे" =: – hakre

उत्तर

4

स्ट्रिंग fwrite की लंबाई एक ही बार में लिख सकते हैं कुछ प्लेटफार्मों पर सीमित है (जिसके कारण यह लिखा बाइट की संख्या देता है)। आप इसे लूप में चलाने का प्रयास कर सकते हैं, लेकिन बेहतर विचार है कि file_put_contents का उपयोग करें, जो गारंटी देता है कि पूरी स्ट्रिंग लिखी जाएगी।

http://www.php.net/manual/en/function.file-put-contents.php

+0

दिलचस्प, सूचक के लिए धन्यवाद। जिज्ञासा से बाहर, क्या एक अपाचे निर्देश है जिसे मैं fhite() के लिए डेटा की सीमा बदलने के लिए .htaccess फ़ाइल में सेट कर सकता हूं? – ariestav

+0

संदिग्ध) प्लस, यदि आप FTP का उपयोग कर रहे हैं, तो मुझे लगता है कि यह नेटवर्क के बारे में अधिक है। क्या file_put_contents काम करते थे? –

+0

अब जांच कर रहा है। । । – ariestav