2012-02-27 22 views
6

Tôi đang cố viết một lượng lớn dữ liệu vào một tệp được mở qua fopen() bằng php. Các wrapper giao thức tôi đang sử dụng là ftp, do đó, tập tin là từ xa đến máy chủ chạy mã php. Tệp tôi đang ghi trên máy chủ Windows.php fwrite() không hoàn thành việc ghi dữ liệu chuỗi vào tệp, tại sao?

Tôi xác minh rằng tệp trên thực tế, được tạo bởi mã php của tôi, nhưng vấn đề là dữ liệu trong tệp không tồn tại (0KB) hoặc ghi vào tệp dừng sớm. Không chắc chắn tại sao lại như vậy.

Đây là mã tôi đang sử dụng để xử lý các hoạt động:

$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.'); 
} 

Mã này hoạt động tốt khi tôi lưu trữ nó trên máy tính cục bộ của tôi, nhưng khi tôi tải nó lên webhost của tôi (Rackspace Cloud), nó không thành công. Điều này khiến tôi tin rằng đó là một vấn đề liên quan đến cấu hình máy chủ của tôi tại Rackspace, nhưng muốn biết liệu tôi có thể làm gì với mã php của mình để làm cho nó mạnh mẽ hơn không.

Bất kỳ ý tưởng nào để đảm bảo fwrite thực sự hoàn tất việc ghi chuỗi vào máy từ xa?

Cảm ơn!

Được rồi, tôi đã thay đổi mã để viết đến tập tin như vậy:

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."); 

} 

gì là lạ là báo cáo kết quả tiếng vang cho thấy như sau:

Có 10330 byte ghi vào tệp văn bản.

Tuy nhiên, khi tôi xác minh kích thước tệp văn bản qua FTP, nó cho thấy là 0K và dữ liệu bên trong tệp, trên thực tế, bị cắt bớt. Tôi không thể tưởng tượng nó phải làm gì với chính máy chủ FTP vì nó hoạt động nếu PHP được lưu trữ trên một máy khác với máy tính trên Rackspace Cloud.

** CẬP NHẬT ** Tôi đã nói chuyện với đại diện Cloud của Rackspace, người đã đề cập rằng họ yêu cầu ftp thụ động nếu bạn truy cập ftp từ máy chủ của họ. Tôi thiết lập máy chủ từ xa để xử lý các kết nối FTP thụ động và đã xác minh rằng FTP thụ động hiện hoạt động trên máy chủ từ xa thông qua ứng dụng khách FTP của OSX Transmit. Tôi đã thêm:

ftp_pasv($file_handle, true); 

Ngay sau câu lệnh fopen(), nhưng tôi nhận được lỗi từ PHP nói rằng tôi không cung cấp tài nguyên hợp lệ cho ftp_pasv(). Làm thế nào tôi có thể đảm bảo rằng kết nối đến trang FTP mà PHP tạo ra là PASV và không ACTIVE và vẫn sử dụng hàm fwrite()? Ngẫu nhiên, tôi đã nhận thấy rằng máy Windows báo cáo rằng tệp đang được viết bởi mã PHP của tôi là 4096 byte trên đĩa. Nó không bao giờ vượt quá số tiền đó. Điều này khiến tôi thay đổi giá trị php output_buffering thành 65536 chỉ để khắc phục sự cố, nhưng điều đó cũng không khắc phục được sự cố. . .

** CẬP NHẬT PHẦN DUEX **

đáp thắc mắc trong vấn đề trên máy chủ ảo của tôi trên sản phẩm Rackspace đám mây Sites được chứng minh quá khó khăn vì họ không cung cấp đủ quyền admin. Tôi đã tạo một máy chủ đám mây rất nhỏ trên sản phẩm Cloud Server của Rackspace và cấu hình mọi thứ đến mức tôi vẫn thấy lỗi tương tự với fwrite(). Để đảm bảo rằng tôi có thể viết một tệp từ máy chủ đó đến máy chủ từ xa, tôi đã sử dụng các lệnh ftp cơ bản trong bash shell của tôi trên máy chủ đám mây. Nó hoạt động tốt. Vì vậy, tôi giả định rằng có một lỗi trong việc thực hiện php của fwrite(), và rằng nó có thể là do một số loại vấn đề điều chỉnh dữ liệu.Khi tôi ghi vào máy chủ từ xa từ môi trường cục bộ của mình có tốc độ tăng chậm so với những gì được cung cấp trên máy chủ Cloud Rackspace, nó hoạt động tốt. Có cách nào để giảm tốc độ ghi hiệu quả không? Chỉ cần askin' :)

** CẬP NHẬT PHẦN III *

Vì vậy, tôi đã đề nghị từ @a dude buồn và thực hiện một chức năng mà có thể giúp ai đó cố gắng để viết vào một tập tin mới và gửi nó tắt toàn bộ thông qua 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 ($ file);' - mã đó ở đâu? – hakre

+0

Có vẻ như sau: '$ string =" một chuỗi dài khoảng 20 dòng ";' – ariestav

+0

'var_dump ($ node ['ftp_context']);' output là gì? (xóa tên người dùng/mật khẩu). – hakre

Trả lời

4

chiều dài của chuỗi fwrite có thể viết trong một đi được giới hạn trên một số nền tảng (đó là lý do tại sao nó trả về số byte bằng văn bản). Bạn có thể thử chạy nó trong một vòng lặp, nhưng một ý tưởng tốt hơn là chỉ cần sử dụng file_put_contents, đảm bảo rằng toàn bộ chuỗi sẽ được viết.

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

+0

Thú vị, cảm ơn con trỏ. Trong tò mò, có một chỉ thị apache tôi có thể thiết lập trong một tập tin htaccess. Để thay đổi giới hạn của dữ liệu cho fwrite()? – ariestav

+0

Doubtful) cộng với, nếu bạn đang sử dụng ftp, đó là nhiều hơn về mạng, tôi đoán. File_put_contents có hoạt động không? –

+0

kiểm tra ngay bây giờ. . . – ariestav

Các vấn đề liên quan