آموزش کار با FTP در PHP همراه با مثال و کد

به کمک FTP می‌توانیم یک یا چند فایل را بین دو سرور منتقل کنیم. این فایل‌ها میی‌تواند داده‌های مهم، فایل‌های سایت یا بکاپ‌های سایت باشد. در این آموزش با نحوه اتصال به سرور FTP در PHP، دانلود و آپلود فایل‌ها و بررسی وضعیت انتقال آن‌ها آشنا خواهید شد.با استفاده از توابع و روش‌های معرفی‌شده، به راحتی می‌توانید فایل‌ها را از یک سرور به سرور دیگر منتقل کرده و از کامل بودن انتقال و صحت داده‌ها اطمینان حاصل کنید.

FTP (مخفف File Transfer Protocol) یک پروتکل شبکه است که برای انتقال فایل‌ها بین کامپیوترها از طریق اینترنت یا شبکه‌های محلی استفاده می‌شود. FTP به ما این امکان را می‌دهد که فایل‌ها را به سرور آپلود کرده یا از آن دانلود کنیم. این پروتکل در کار با سرورهای وب، آپلود سایت‌ها یا بکاپ‌گیری از داده‌ها بسیار کاربردی است.

در این آموزش با نحوه اتصال به FTP در PHP آشنا می‌شویم. نکته‌ها و تابع‌هایی که برای دانلود یا آپلود فایل از یا به سرور لازم است را با مثال‌های کاربردی مطرح می‌کنم.

در این آموزش فقط با استفاده از کدهای PHP نحوه کار با FTP را پیش می‌بریم. شما می‌توانید از پکیج‌های کار با FTP نیز استفاده کنید. (مثلاً پکیج nicolab/php-ftp-client که با کامپوزر قابل نصب است.)

اتصال به FTP در PHP

برای اتصال به FTP از تابع ftp_connect() در PHP استفاده می‌کنیم. این تابع به یک سرور متصل شده و امکان دسترسی به آن را به ما می‌دهد.

این تابع، آدرس سرور را به‌عنوان آرگومان ورودی دریافت می‌کند. آدرس سرور می‌تواند به صورت Domain یا Sub Domain و یا IP باشد. در قطعه کد زیر، متغیری به نام $ftp_server تعریف می‌کنم تا از آن برای آدرس سرور FTP استفاده کنم.

<?php $ftp_server = "ftp.example.com";  $ftp_conn = ftp_connect($ftp_server);

این تابع یک شیء FTP Connection به ما می‌دهد که می‌توانیم از آن در دستورهای بعدی استفاده کنیم. این شیء را در متغیری به نام $ftp_conn قرار داده‌ام. (اگر نمی‌دانید شیء چیست، آموزش کلاس در PHP را ببینید.)

اگر به هر دلیلی ارتباط با سرور برقرار نشود، به‌جای شیء FTP مقدار false برمی‌گرداند. بنابراین، در صورت نیاز می‌توانیم در یک ساختار شرطی وضعیت اتصال را بررسی کنیم.

اکنون نوبت وارد کردن نام کاربری و رمز عبور است. قبل از هر چیزی می‌بایست یک useame و password با دسترسی‌های لازم در سرور FTP ایجاد کرده باشیم. سپس از تابع ftp_login() برای اعتبارسنجی ورود و تلاش برای ورود به اکانت استفاده می‌کنیم.

<?php $login_result = ftp_login($ftp_conn, "USERNAME", "PASSWORD");

همان‌طور که در قطعه کد بالا می‌بینید، این تابع سه آرگومان می‌گیرد.

  • شیء اتصال به FTP (همان FTP Connection که از قبل داشتیم)
  • نام کاربری
  • رمز عبور

واضح است که نام کاربر و رمز عبور می‌توانند به‌صورت متغیرهای جداگانه‌ای به تابع داده شوند.

خروجی این تابع یک مقدار بولین (bool) است؛ اگر ورود موفقیت آمیز باشد، true و در غیر این‌صورت، false برمی‌گرداند.

بررسی وضعیت اتصال به سرور

بنابراین می‌توانیم وضعیت اتصال و اعتبارسنجی ورود به اکانت FTP در PHP را بررسی کنیم. متناسب با پروژه خودتان، می‌توانید وضعیت اجرای هر تابع را جداگانه بررسی کنید. من در این‌جا هر دو را با هم در یک شرط PHP قرار می‌دهم.

<?php $ftp_server = "ftp.example.com";  $ftp_conn = ftp_connect($ftp_server);  $login_result = ftp_login($ftp_conn, "USERNAME", "PASSWORD");  if((!$ftp_conn) || (!$login_result)){     echo "خطا در اتصال به سرور FTP!";     exit; }

در قطعه کد بالا، بررسی کرده‌ام که اگر هر کدام از $ftp_conn یا $login_result برابر با false بود، پیغام خطای ساده‌ای چاپ کند و اجرای اسکریپت متوقف شود.

انتقال فایل به FTP با PHP

برای انتقال فایل‌ها به سرور FTP از تابع ftp_put() استفاده می‌کنیم. این تابع به ما این امکان را می‌دهد که یک فایل محلی (در سروری که اسکریپت PHP ما در حال اجراست) را به سرور FTP منتقل کنیم.

این تابع سه آرگومان ورودی اجباری دارد که به ترتیب عبارت‌اند از:

  1. شیء FTP Connection
  2. نام و مسیر فایل در مقصد (در سرور FTP)
  3. نام و مسیر فایل در مبدأ (سرور محلی)

گاهی اوقات آرگومان چهارم (که اختیاری است) را هم تعیین می‌کنیم. این پارامتر مشخص می‌کند که mode یا حالت انتقال فایل چیست. برای انتقال یک فایل متنی مقدار FTP_ASCII و برای انتقال فایل‌های باینری مقدار FTP_BINARY را تعریف می‌کنیم.

در قطعه کد زیر، فایلی به نام backup-v2.4.tar.gz در فولدر backups کنار اسکریپت را به فولدر اصلی سرور FTP با نام sabzdanesh-backup-v2.4.tar.gz منتقل می‌کنم.

<?php $local_file = "backups/backup-v2.4.tar.gz"; $remote_file = "sabzdanesh-backup-v2.4.tar.gz";  $result = ftp_put($ftp_conn, $remote_file, $local_file, FTP_BINARY);

خروجی تابع ftp_put() در PHP یا true است یا false. اگر انتقال فایل به درستی و با موفقیت انجام شود true وگرنه false را خواهیم داشت.

بنابراین می‌توانیم در یک ساختار شرطی، وضعیت نهایی انتقال فایل را بررسی کنم.

یادگیری PHP قدم به قدم از صفر
دوره جامع و رایگان آموزش PHP
می‌خوام الان شروع کنم!

بررسی وضعیت انتقال فایل

برای بررسی اینکه آیا فایل به‌طور کامل آپلود شده است، می‌توانیم از تابع ftp_size() برای بررسی اندازه (حجم) فایل روی سرور FTP در PHP استفاده کنیم. اگر اندازه فایل مبدأ با مقصد یکی باشد، احتمالاً فایل به درستی منتقل شده است.

در صورتی که تابع ftp_size() مقدار -1 را به عنوان خروجی به ما برگرداند، به این معنی است که مشکلی در دسترسی به فایل وجود داشته است. به این معنا که یا فایل در مسیر مورد نظر در سرور FTP وجود ندارد و یا اتصال FTP دچار مشکل شده است.

تابع filesize() نیز برای بررسی حجم فایل در همین سرور (فایل مبدأ) استفاده می‌شود.

<?php $local_file_size = filesize($local_file); $remote_file_size = ftp_size($conn_id, $remote_file);  if( $remote_file_size == -1 ){     echo "خطا در دسترسی به فایل"; } else {     if( $local_file_size == $remote_file_size ){         echo "انتقال با موفقیت انجام شد.";     } else {         echo "مشکلی پیش آمده! حجم فایل‌ها متفاوت است!";     } }

البته یک روش بهتر و مطمئن‌تر که می‌توانیم علاوه بر بررسی حجم فایل برای صحت‌سنجی انتقال فایل با FTP استفاده کنیم، استفاده از Hash فایل‌هاست. آموزش الگوریتم‌های هش و رمزنگاری در PHP را بررسی کنید.

دانلود فایل از FTP با PHP

برای دانلود فایل از سرور FTP از تابع ftp_get() در PHP استفاده می‌کنیم. این تابع مشابه ftp_put()، سه ورودی اجباری دارد که معمولاً ورودی چهارم را نیز تعریف می‌کنیم:

  1. شیء اتصال
  2. فایل مبدأ (نام و مسیر ذخیره‌سازی)
  3. فایل مقصد (نام و مسیر فایل برای دانلود از FTP)
  4. نوع انتقال (FTP_ASCII برای فایل متنی و FTP_BINARY برای فایل باینری)

در نهایت، کدی شبیه به قطعه کد زیر خواهیم داشت:

<?php $remote_file = "storage/sabzdanesh-data.zip"; $local_file = "sabzdanesh.zip"; if (ftp_get($ftp_conn, $local_file, $remote_file, FTP_BINARY)){     echo "فایل با موفقیت دانلود شد."; } else {     echo "خطا در دانلود فایل"; }

در این‌جا، علاوه بر دانلود فایل، موفقیت‌آمیز بودن یا نبودن انتقال را نیز با یک ساختار شرطی ساده بررسی کرده‌ام. به‌طور مشابه، می‌توانستم نتیجه تابع ftp_get() را در متغیری قرار بدهم و سپس true یا false بودن آن را بررسی کنم.

شرط یک خطی در PHP: عملگر teary برای شرط‌های کوتاه

شرط یک خطی در PHP: عملگر teary برای شرط‌های کوتاه

پایان کار با PHP در PHP

پس از اتمام کارهایمان با FTP، بهتر است اتصال FTP را ببندیم تا منابع سرور آزاد شود. برای بستن اتصال FTP از تابع ftp_close() استفاده می‌کنیم. این تابع شیء FTP Connection را گرفته و اتصال با سرور اف تی پی در PHP را قطع می‌کند.

<?php ftp_close($ftp_conn);

در این آموزش یاد گرفتیم که چگونه با استفاده از PHP به FTP متصل شویم. نحوه آپلود و دانلود فایل‌ها با PHP در اتصال FTP را مرور کرده و وضعیت انتقال را بررسی کردیم. به‌طور خلاصه، توابع کار با FTP با PHP در جدول زیر خلاصه شده‌اند.

تابعکاربردنوع خروجی
ftp_connect()ایجاد اتصال به سرور FTPbool یا شیء FTP Connection
ftp_login()ورود با اکانت FTP به سرورbool (true / false)
ftp_put()آپلود فایل از سرور محلی به FTPbool (true / false)
ftp_get()دانلود از FTP به سرور محلیbool (true / false)
ftp_size()گرفتن حجم یک فایل در سرور FTPint (-1 / bytes)
ftp_close()بستن ارتباط/اتصال برقرارشدهbool (true / false)

برای کار با FTP در PHP توابع و امکانات بسیار بیشتری در اختیار داریم. برای مثال، می‌توانیم در سرور FTP فولدرهای جدید ایجاد کرده و یا سطح دسترسی فایل‌ها را تغییر دهیم؛ لیست فایل‌های یک فولدر را دریافت کرده و یا آن‌ها را حذف کنیم. جهت مشاهده این توابع می‌توانید به این صفحه (+) از مستندات انگلیسی‌اش مراجعه کنید.

کار با FTP این امکان را به ما می‌دهد تا فایل‌هایی را بین سرورهای مختلف از طریق اسکریپت PHP منتقل کنیم. واضح است که سرعت انتقال فایل‌ها در ارتباط FTP بین دو سرور اینترنتی، از طریق شبکه‌های پرقدرت بین دیتاسنترها انجام شده و از با اینترنت کاربری که در حال اجرای اسکریپت روی سایت است سروکار ندارد.

امیدوارم از این آموزش بهره کافی را برده باشید. اگر سؤال یا چالشی در کار با FTP در PHP دارید، از بخش دیدگاه‌ها مطرح کنید.