สอน codeigniter วิธีย้ายไฟล์จาก host เดิม ไป host ใหม่

php-codeigniter-framework
php-codeigniter-framework

สอน codeigniter วิธีย้ายไฟล์จาก host เดิม ไปอยู่ host ใหม่ ด้วย codeigniter

สอน codeigniter วิธีย้ายไฟล์จาก host เดิม ไปอยู่ host ใหม่
ท่านเคยประสบปัญหาเหล่านี้ไช่ไหมครับ เปลี่ยนโฮสติ้งทีหนึ่ง ต้องใช้โปรแกรม FTP ดาวน์โหลดไฟล์ลงมาไว้
ในเครื่องก่อน ดาวน์โหลดเสร็จ ต้องอัพไฟล์ขึ้นไปที่โฮสใหม่อีก ปัญหาเหล่านั้นจะหมดไปถ้าท่านใช้ CI

ใน CI Framework มี Library ที่ชื่อว่า FTP ที่ทำให้เราสามารถอัพโหลดไฟล์ขึ้นไปยังโฮสติ้งที่เราใช้บริการอยู่

$this->load->library('ftp');




วิธีใช้งาน

การใช้งาน ftp ใน codeigniter ก็ง่ายแสนง่ายครับ เพียงแค่เรามี ftp account ก็สามารถใช้งานได้เลย
ตัวอย่างการใช้งาน เริ่มต้นเลยให้โหลด ftp library เข้ามาใช้งานใน Controller ที่เราต้องการ

<?php
class Ftp_upload extends CI_Controller
{
    function __construct(){
        parent::__construct();
		$this->load->library('ftp');
    }

จากนั้นก็ตั้งค่า ftp account คือ IP, username, password และ port ให้กับตัวไลบรารี
ใช้เมธอด connect ทดสอบว่าสามารถเชื่อมต่อไปยัง server ได้หรือไม่

<?php
class Ftp_upload extends CI_Controller
{
    function __construct(){
        parent::__construct();
		$this->load->library('ftp');
    }
	public function index()
	{
		
		$config['hostname'] = 'ใส่ไอพีนะ ไม่ไช่ localhost';
		$config['username'] = 'ใส่ ftp username';
		$config['password'] = 'ใส่ ftp password';
		$config['port']     = 21; // ใส่ port ปกติ ftp จะใช้พอร์ต 21 ตรวจสอบเองว่าไช่ไหม
		$config['debug']	= TRUE;
        $this->ftp->connect($config); // ลองเชื่อมต่อดู ได้ไหม

ทดสอบดึงรายชื่อไฟล์ใน public_html มาดู อย่าลืมใส่เครื่องหมาย / (ทับ หรือ slash)
ข้างหน้า public_html directory นะ

print_r($this->ftp->list_files('/public_html/'));

ทีนี้มาลองอัพโหลดไฟล์จากโฮสที่เราติดตั้ง CI ไปโฮสใหม่ของเรา จะใช้คำสั่งประมาณนี้
– พารามิเตอร์ตัวแรกคือ path ของไฟล์บนโฮสเรา
– พารามิเตอร์ตัวที่สองคือ path ของไฟล์ที่เราจะให้ไปอยู่บนโฮสใหม่ ต้องมี /public_html/ อยู่หน้าไฟล์
– พารามิเตอร์ตัวที่สามคือ mode สำหรับการอัพโหลดมีให้เลือก คือ ‘auto’,’binary’,’ascii’
ซึ่งท่านสามารถอ่านข้อมูลเพิ่มเติมเกี่ยวกับข้อแตกต่างระหว่าง FTP แบบ ascii และ binary ได้ที่นี่
– พารามิเตอร์ตัวที่สี่คือ กำหนด permission ของไฟล์บนโฮสใหม่

$this->ftp->upload('ไฟล์บนโฮสเก่า', '/public_html/ไฟล์ไปโฮสใหม่', 'ascii', 0775);




วิธีย้ายพร้อมกันหลายไฟล์

ถ้าต้องการย้ายพร้อมกันหลาย ๆ ไฟล์ ให้โหลด directory helper เข้ามาช่วย

$this->load->helper('directory');

จากนั้นใช้คำสั่ง directory_map เพื่อลิสรายชื่อไฟล์ในโฟลเด้อทั้งหมดมา
คำสั่ง directory_map จะรีเทิร์นค่า กลับมาเป็น array

$list_file = directory_map('./uploads/'); // ดึงไฟล์ทั้งหมดที่อยู่ในโฟลเด้อ upload มาทั้งหมด

จากนั้นใช้คำสั่ง count เพื่อนับจำนวน array และใช้คำสั่ง for loop วนอัพโหลดทีละไฟล์

$list_file = directory_map('./uploads/');
for($i=0;$iftp->upload($file, '/public_html/'.$file, 'ascii', 0775);
}

แต่ถ้าวน loop ซะขนาดนี้ php script ต้องเกิด timeout เป็นแน่แท้
ให้ใช้คำสั่ง set_time_limit เพื่อกำหนดให้ php script ทำงานแบบ unlimit timeout
เพื่อรอให้อัพโหลดไฟล์ทั้งหมดให้เสร็จก่อน

ini_set('max_execution_time', 0);
set_time_limit(0);

ในท้ายที่สุดแล้วเราจะได้ Controller คลาสสำหรับอัพโหลดไฟล์ผ่านคำสั่ง FTP หน้าตาประมาณนี้ครับ

<?php
class Ftp_upload extends CI_Controller
{
    function __construct(){
        parent::__construct();
		$this->load->library('ftp');
		$this->load->helper('directory');
		ini_set('max_execution_time', 0);
		set_time_limit(0);
    }
	public function index()
	{
		
		$config['hostname'] = 'ใส่ไอพีนะ ไม่ไช่ localhost';
		$config['username'] = 'ใส่ ftp username';
		$config['password'] = 'ใส่ ftp password';
		$config['port']     = 21; // ใส่ port ปกติ ftp จะใช้พอร์ต 21 ตรวจสอบเองว่าไช่ไหม
		$config['debug']	= TRUE;
        $this->ftp->connect($config); // ลองเชื่อมต่อดู ได้ไหม
		
		$list_file = directory_map('./uploads/');
		for($i=0;$i<count($list_file);$i++){
			$file = 'uploads/'.$list_file[$i];
			$this->ftp->upload($file, '/public_html/'.$file, 'ascii', 0775);
		}
		
		$this->ftp->close();
	}
}
?>

ท่านนักพัฒนาทั้งหลายสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการอัพโหลดไฟล์ FTP class
ของ Codeigniter Framework ได้ที่ codeigniter FTP