ftp_nb_fget (ftp_nb_fget)
با ftp_nb_fget می توانی فایل را غیرمسدودکننده دانلود کنی. «غیرمسدودکننده (Non-blocking)» یعنی برنامه قفل نمی شود. «دسته فایل (File handle)» همان فایلِ باز محلی است.
ftp_nb_fget چه کار می کند؟
این تابع فایل سرور را می گیرد و مستقیم داخل فایلِ باز می نویسد. روند دانلود همزمان ادامه دارد، اما برنامه آزاد می ماند. بنابراین می توانی کارهای دیگر انجام دهی.
سینتکس
ftp_nb_fget(ftp_conn, open_file, server_file, mode, startpos);
مثال: دانلود غیرمسدودکننده به فایل محلی باز
<?php
// اتصال و ورود به سرور FTP
$ftp_server = "ftp.example.com";
$ftp_conn = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass);
$server_file = "somefile.txt";
// باز کردن فایل محلی برای نوشتن
$local_file = "local.txt";
$fp = fopen($local_file, "w");
// شروع دانلود غیرمسدودکننده
$d = ftp_nb_fget($ftp_conn, $fp, $server_file, FTP_BINARY);
while ($d == FTP_MOREDATA) {
// اینجا کارهای دیگر انجام بده
// ادامه دانلود را پیگیری کن
$d = ftp_nb_continue($ftp_conn);
}
if ($d != FTP_FINISHED) {
echo "Error downloading $server_file";
exit(1);
}
// بستن اتصال و فایل
ftp_close($ftp_conn);
fclose($fp);
?>
گام های عملی سریع
- اتصال و ورود را انجام بده.
- فایل محلی را با
fopenباز کن. ftp_nb_fgetرا برای شروع فراخوانی کن.- در حلقه،
ftp_nb_continueرا تکرار کن. - در پایان،
FTP_FINISHEDرا بررسی کن.
نکات و جزئیات
نکته: مقدار بازگشتی یکی از FTP_FAILED، FTP_FINISHED یا FTP_MOREDATA است.
نکته: از FTP_BINARY برای فایل های باینری استفاده کن. دقت انتقال بهتر می شود.
نکته: از PHP 7.3، پارامتر mode اختیاری شده است.
هشدار: همیشه فایل و اتصال را در آخر ببند. در غیر این صورت منابع هدر می روند.
مقایسه با روش مسدودکننده
ftp_fget مسدودکننده است. اما ftp_nb_fget غیرمسدودکننده است. تجربه کاربر روان تر می شود.
لینک ها و ادامه مطالعه
- ادامه دانلود با ftp_nb_continue برای حلقه پیگیری.
- ورود به FTP با ftp_login قبل از هر انتقال.
- W3Schools: ftp_nb_fget() مرجع تابع.
- W3Schools: PHP FTP Reference فهرست توابع FTP.
جمع بندی سریع
- دانلود غیرمسدودکننده با فایل باز محلی انجام می شود.
- حلقه با
ftp_nb_continueپیشرفت را پیگیری می کند. - برای فایل های باینری از
FTP_BINARYاستفاده کن. - در پایان روی
FTP_FINISHEDچک کن.